refactor: trim env.example to genuinely customer-facing config only

Full review of what belongs in the public installer vs. what customers
should never need to see, per an explicit audit request:

- Removed DB_USER/DB_NAME as customer-configurable env vars entirely --
  nothing outside this compose stack ever connects to Postgres directly,
  so there was no real reason a customer would ever change these.
  Hardcoded to postgres/argus in docker-compose.yml and the two scripts
  that referenced them (backup.sh, restore.sh); DB_PASSWORD remains the
  one real secret, still auto-generated by install.sh.
- Removed ANIS_ADMIN_KEY entirely -- confirmed dead in a prior session's
  audit: it's ANIS's own admin-dashboard credential, unrelated to the
  ARGUS<->ANIS intelligence protocol, which ARGUS never sends. Carried
  over into this file by copy-paste from ANIS's own env template, not
  because ARGUS ever uses it.
- Reordered/re-commented env.example around what a customer actually
  might touch (timezone, ANIS bootstrap trio, network ports for
  conflict resolution, DOCKER_API_VERSION for NAS platforms) versus
  what's fully automated (DB_PASSWORD) -- with an explicit note that
  ongoing product configuration (WAF, DNS, users, policies) happens in
  the dashboard, not this file.
- ANIS_ENABLED/ANIS_URL defaults aligned with the Community Edition
  auto-provisioning decision (true / https://anis.weboria.eu) --
  previously still showed the pre-decision false/empty defaults since
  this repo's initial population predated that change landing.
- Flagged CHANGELOG.md as stale (last entry v3.29.0, well behind the
  current shipped version) with an honest note rather than silently
  leaving a misleading "GitHub Releases page" pointer or backfilling
  invented descriptions of past releases.

No file needed to move to the private repo -- everything here (install/
update/backup/restore/healthcheck/uninstall scripts, the compose
manifest, license/notice docs) is either required for the customer to
install and operate ARGUS or a legal-transparency requirement. None of
it is build logic, dev configuration, or reproducible source.
This commit is contained in:
2026-07-25 17:06:47 +00:00
parent 27be26f5f2
commit db132c9f92
5 changed files with 67 additions and 50 deletions
+8 -2
View File
@@ -27,5 +27,11 @@ Versioning follows [Semantic Versioning](https://semver.org/).
## [3.26.0] and earlier ## [3.26.0] and earlier
Earlier release history predates this distribution's changelog. See the GitHub Releases Earlier release history predates this distribution's changelog.
page for this repository going forward — every release from here on is documented here.
---
**Note (2026-07-25):** this file is not currently kept in sync with every release — the most
recent entry above predates the current shipped version. Updating this changelog needs to
become part of the standard release process going forward, not backfilled retroactively with
invented descriptions of past changes.
+1 -1
View File
@@ -24,7 +24,7 @@ bold "Backing up ARGUS..."
WORKDIR="$(mktemp -d)" WORKDIR="$(mktemp -d)"
trap 'rm -rf "$WORKDIR"' EXIT trap 'rm -rf "$WORKDIR"' EXIT
docker compose exec -T db pg_dump -U "${DB_USER:-postgres}" "${DB_NAME:-argus}" | gzip > "$WORKDIR/db.sql.gz" docker compose exec -T db pg_dump -U postgres argus | gzip > "$WORKDIR/db.sql.gz"
ok "Database dumped" ok "Database dumped"
docker run --rm -v argus_api_data:/data -v "$WORKDIR":/backup alpine \ docker run --rm -v argus_api_data:/data -v "$WORKDIR":/backup alpine \
+17 -9
View File
@@ -11,14 +11,18 @@ services:
max-file: "3" max-file: "3"
environment: environment:
TZ: ${TZ:-UTC} TZ: ${TZ:-UTC}
POSTGRES_USER: ${DB_USER:-postgres} # Internal database credentials, not customer-configurable — nothing
# outside this compose stack ever connects to Postgres directly, so
# there's no real reason to let these vary. Only the password (below)
# needs to be a real secret; the username/db name are just labels.
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres}
POSTGRES_DB: ${DB_NAME:-argus} POSTGRES_DB: argus
command: postgres -c timezone=${TZ:-UTC} -c log_timezone=${TZ:-UTC} -c shared_preload_libraries=timescaledb -c timescaledb.telemetry_level=off -c max_locks_per_transaction=512 command: postgres -c timezone=${TZ:-UTC} -c log_timezone=${TZ:-UTC} -c shared_preload_libraries=timescaledb -c timescaledb.telemetry_level=off -c max_locks_per_transaction=512
volumes: volumes:
- postgres_data:/var/lib/postgresql/data - postgres_data:/var/lib/postgresql/data
healthcheck: healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres}"] test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 10 retries: 10
@@ -104,7 +108,7 @@ services:
environment: environment:
TZ: ${TZ:-UTC} TZ: ${TZ:-UTC}
PORT: "8080" PORT: "8080"
DATABASE_URL: postgres://${DB_USER:-postgres}:${DB_PASSWORD:-postgres}@db:5432/${DB_NAME:-argus}?sslmode=disable DATABASE_URL: postgres://postgres:${DB_PASSWORD:-postgres}@db:5432/argus?sslmode=disable
REDIS_URL: redis://valkey:6379/0 REDIS_URL: redis://valkey:6379/0
ENVIRONMENT: ${ENVIRONMENT:-production} ENVIRONMENT: ${ENVIRONMENT:-production}
NGINX_CONTAINER: argus-proxy NGINX_CONTAINER: argus-proxy
@@ -118,12 +122,16 @@ services:
NGINX_HTTPS_PORT: ${NGINX_HTTPS_PORT:-} NGINX_HTTPS_PORT: ${NGINX_HTTPS_PORT:-}
API_HOST_PORT: ${API_HOST_PORT:-9080} API_HOST_PORT: ${API_HOST_PORT:-9080}
API_HOST: ${API_HOST:-} API_HOST: ${API_HOST:-}
# ANIS community intelligence — optional, off by default. Set these to # ANIS community intelligence — on by default against the public
# connect this instance to an already-running ANIS hub. # Community Edition hub (empty license key = community tier, no signup
ANIS_ENABLED: ${ANIS_ENABLED:-false} # required). These three only matter on first boot; manage the
ANIS_URL: ${ANIS_URL:-} # connection afterward from Threat Intel -> ANIS Connection in the
# dashboard. (No ANIS_ADMIN_KEY here: it's ANIS's own admin-dashboard
# credential, unrelated to the ARGUS<->ANIS protocol, which ARGUS never
# sends — a prior version of this file carried it by mistake.)
ANIS_ENABLED: ${ANIS_ENABLED:-true}
ANIS_URL: ${ANIS_URL:-https://anis.weboria.eu}
ANIS_LICENSE_KEY: ${ANIS_LICENSE_KEY:-} ANIS_LICENSE_KEY: ${ANIS_LICENSE_KEY:-}
ANIS_ADMIN_KEY: ${ANIS_ADMIN_KEY:-}
ANIS_SHARE_ATTACKERS: ${ANIS_SHARE_ATTACKERS:-false} ANIS_SHARE_ATTACKERS: ${ANIS_SHARE_ATTACKERS:-false}
DNS_SECURITY_LISTEN_ADDR: ":53" DNS_SECURITY_LISTEN_ADDR: ":53"
ports: ports:
+40 -37
View File
@@ -1,65 +1,68 @@
# ARGUS — Environment Configuration # ARGUS Enterprise Web Security Platform — Installation Configuration
# Copy this file to .env and modify as needed. install.sh does this for you #
# automatically, including generating a secure DB_PASSWORD. # install.sh generates this file for you automatically, including a secure
# database password. Most installs need nothing beyond the defaults below.
#
# Everything else — WAF policy, DNS security, threat intelligence tuning,
# proxy hosts, users, security policies — is configured from the ARGUS
# dashboard after your first login, not from this file.
# =========================================== # ===========================================
# Required Settings # Database (do not edit)
# =========================================== # ===========================================
# install.sh replaces this with a securely generated value on first install
# Database password — install.sh generates this for you. # and never touches it again. There's nothing to fill in here yourself.
# Manual value: openssl rand -base64 24
DB_PASSWORD=change-me-in-production DB_PASSWORD=change-me-in-production
# =========================================== # ===========================================
# Optional Settings # Timezone
# =========================================== # ===========================================
# Should match the timezone you select in the dashboard's first-run setup
# wizard (Regional Settings) — the wizard checks for a mismatch and will
# warn you if this file and your dashboard selection disagree.
TZ=UTC TZ=UTC
DB_USER=postgres
DB_NAME=argus
# =========================================== # ===========================================
# ANIS — Threat Intelligence Integration # Threat Intelligence (ANIS)
# =========================================== # ===========================================
# ANIS is a separate product, deployed independently (self-hosted or via a # ARGUS connects to ANIS, Weboria's threat-intelligence network, by default
# community instance). These vars configure how THIS ARGUS instance talks to # — no license key needed for the free Community tier. These three values
# an already-running ANIS service — they do not start one. # only matter on first boot; manage the connection afterward from
# # Threat Intel -> ANIS Connection in the dashboard.
# Set ANIS_ENABLED=true and ANIS_URL to turn on reporting WAF auto-bans to ANIS_ENABLED=true
# ANIS and pulling its community threat-intelligence feed. ANIS_URL=https://anis.weboria.eu
ANIS_ENABLED=false
# ANIS_URL=https://anis.example.com:8090
ANIS_LICENSE_KEY= ANIS_LICENSE_KEY=
# Must match the ANIS instance's own ANIS_ADMIN_KEY. Generate: openssl rand -hex 32
ANIS_ADMIN_KEY= # Share this instance's confirmed attacker IPs back to the community feed?
ANIS_SHARE_ATTACKERS=false ANIS_SHARE_ATTACKERS=false
# =========================================== # ===========================================
# Docker Compatibility (Synology DSM, etc.) # Network Ports
# ===========================================
# Leave empty for auto-detection. Only set if auto-detection fails.
# Synology DSM typically needs: 1.41 or 1.43
# DOCKER_API_VERSION=1.41
# ===========================================
# Network & Port Settings
# =========================================== # ===========================================
# Only change these if the defaults conflict with something else already
# running on this host.
# Admin panel port (default: 81) # Admin panel port (default: 81)
# UI_PORT=81 # UI_PORT=81
# Nginx listen ports — change if 80/443 are already in use # Reverse-proxy listen ports — change if 80/443 are already in use
# (e.g. Synology Web Station)
# NGINX_HTTP_PORT=8080 # NGINX_HTTP_PORT=8080
# NGINX_HTTPS_PORT=8443 # NGINX_HTTPS_PORT=8443
# API host port — exposed for nginx-to-API communication. # Internal port used for nginx<->API communication.
# MUST NOT conflict with NGINX_HTTP_PORT. # MUST NOT conflict with NGINX_HTTP_PORT.
# API_HOST_PORT=9080 # API_HOST_PORT=9080
# DNS Security Engine listen address — host-only (127.0.0.1) by default. # DNS Security Engine listen address — host-only (127.0.0.1) by default.
# Set to an internal interface IP to route real client DNS traffic through # Set to an internal interface IP only if you intend to route real client
# it. Never 0.0.0.0 unless this host is on a fully trusted network. # DNS traffic through ARGUS. Never 0.0.0.0 unless this host is on a fully
# trusted network — an open forwarding resolver is exactly the profile
# abused for DNS amplification attacks against third parties.
# DNS_LISTEN_HOST=127.0.0.1 # DNS_LISTEN_HOST=127.0.0.1
# ===========================================
# Advanced / Troubleshooting
# ===========================================
# Only needed on some NAS platforms (e.g. Synology DSM) where Docker's API
# version needs to be pinned manually. Leave commented out otherwise.
# DOCKER_API_VERSION=1.41
+1 -1
View File
@@ -38,7 +38,7 @@ bold "Stopping the API (keeping the database up)..."
docker compose stop api ui nginx >/dev/null docker compose stop api ui nginx >/dev/null
bold "Restoring database..." bold "Restoring database..."
gunzip -c "$WORKDIR/db.sql.gz" | docker compose exec -T db psql -U "${DB_USER:-postgres}" "${DB_NAME:-argus}" >/dev/null gunzip -c "$WORKDIR/db.sql.gz" | docker compose exec -T db psql -U postgres argus >/dev/null
ok "Database restored" ok "Database restored"
bold "Restoring application data..." bold "Restoring application data..."