Skip to content
Configuration

Configuration

Central platform (.env)

All central-platform configuration is read from environment variables, set in the .env file next to docker-compose.yml. Defaults below are the backend’s built-in defaults. The shipped .env.example deliberately omits defaults for secrets so an install can’t accidentally go live with a known password.

Required in production

VariableDescription
POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORDApplication database credentials
JWT_SECRETSession token signing secret. The backend refuses to start if unset or left as change-me-in-production
ICINGA2_API_PASSWORDMust match the password configured in the Icinga 2 container’s api-users.conf
CLICKHOUSE_PASSWORDClickHouse credential
CADDY_DOMAINPublic domain/IP(s) Caddy serves; also the ACME domain in Let’s Encrypt mode

Backend (Go API)

VariableDefaultDescription
DATABASE_URL— (no default, must be set)PostgreSQL connection string, e.g. postgres://user:pass@postgres:5432/db
REDIS_URLredis://localhost:6379/0Redis connection string
ICINGA2_API_URLhttps://localhost:5665Icinga 2 REST API base URL
ICINGA2_API_USER— (no default, must be set)Icinga 2 API user
ICINGA2_API_PASSWORD— (no default, must be set)Icinga 2 API password
VICTORIAMETRICS_URLhttp://localhost:8428VictoriaMetrics query endpoint
CLICKHOUSE_URL—ClickHouse DSN, e.g. clickhouse://user:pass@clickhouse:9000/db
CLICKHOUSE_READ_TIMEOUT30sRead timeout for ClickHouse queries (Go duration). The production compose file sets 300s so long-running migrations don’t time out during an upgrade
PROBE_EVENT_RETENTION_DAYS30Retention for probe telemetry in ClickHouse
ANTHROPIC_API_KEY—Claude API key. Leave unset to disable the AI features
JWT_SECRET— (required)Session token signing secret
JWT_ALGORITHMHS256JWT signing algorithm
JWT_EXPIRATION86400Token lifetime in seconds
PORT8000Backend listen port
TLS_CERT, TLS_KEY—Optional: terminate TLS directly on the backend rather than at Caddy (e.g. agent-only edge sites)
CORS_ORIGINShttp://localhost:5173,https://localhostAllowed CORS origins
ZEEK_LOG_DIR—Path to Zeek’s rotated log directory (mounted read-only from the zeek-logs volume, typically /var/log/zeek/current)
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_FROMport 587, from noreply@example.comOutbound mail for notifications. In Compose, SMTP_HOST defaults to the Docker host gateway to reach a local MTA on the host
GEO_HOME_LAT, GEO_HOME_LON—Reference coordinates for geo-based features, e.g. your main site’s latitude/longitude
AETHIS_PUBLIC_BASE_URLhttps://localhost:1443This instance’s externally reachable URL, used to build callback URLs sent to the Perimeter Probe
BOOTSTRAP_ADMIN_EMAIL, BOOTSTRAP_ADMIN_PASSWORD, BOOTSTRAP_ADMIN_NAME—See First-boot admin account below
RATE_LIMIT_AUTH_PER_MIN, RATE_LIMIT_API_PER_MINbuilt-in defaultsPer-IP, per-minute rate limits for authentication and API requests
AETHIS_ENVdevelopmentSet to production on every production install: the backend then refuses to start with known development credentials
GEOIP_DB_DIR / GEOIP_HOST_DIR/var/lib/eon/geoip / ./data/geoipContainer path / host path for optional MaxMind GeoLite2 databases (GeoLite2-ASN.mmdb, GeoLite2-Country.mmdb). If the host path doesn’t exist, enrichment falls back to category-only

First-boot admin account

If BOOTSTRAP_ADMIN_EMAIL and BOOTSTRAP_ADMIN_PASSWORD are both set and no users exist yet, the backend creates a single admin user with those values on startup. On every subsequent boot the check is a no-op, so it’s safe to leave the variables set permanently. install.sh also offers an interactive prompt for the same purpose — use whichever fits: env vars for zero-interaction/CI installs, the prompt for manual ones.

Zeek

VariableDefaultDescription
ZEEK_INTERFACEeth0Network interface Zeek sniffs
ZEEK_PROFILEprodprod = minimal logging; dev = verbose full-protocol capture
ZEEK_LOG_RETENTION_HOURS24 (prod) / 72 (dev)Rotated logs older than this are deleted
ZEEK_MAX_DISK_MB20480Hard disk ceiling for /var/log/zeek; the janitor force-prunes the oldest rotated files once exceeded, as a last-resort guard against disk-fill

Caddy / TLS

VariableDefaultDescription
CADDY_DOMAINlocalhostDomain(s)/IP(s) Caddy serves, comma-separated
CADDY_DEFAULT_SNIvalue of CADDY_DOMAINFallback SNI for connections without a Server Name (e.g. IP-based access)
CADDY_TLSinternalinternal = self-signed; empty = ACME (Let’s Encrypt/ZeroSSL, needs port 80 open); or "<cert path> <key path>" for a supplied certificate
CADDY_CERTS_DIR—Host directory mounted read-only at /etc/caddy/certs when supplying your own certificate
CADDY_HTTPS_PORT, CADDY_HTTP_PORT443, 80Host ports Caddy binds — change when another reverse proxy already owns 443/80 on the host

Postgres / ClickHouse container credentials

VariableDescription
POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORDPassed straight through to the postgres:16-alpine image
CLICKHOUSE_DB, CLICKHOUSE_USER, CLICKHOUSE_PASSWORDPassed straight through to the clickhouse/clickhouse-server image; the backend’s CLICKHOUSE_URL must reference the same values

Aethis Agent (eon-aethis.conf, YAML)

See Agents & Probes — Aethis Agent for the full field reference. Defaults if a field is omitted: server.tls_verify: true, checks.interval: 60s, checks.plugins_dir: /usr/lib/eon-aethis/plugins, checks.system_plugins_dir: /usr/lib/nagios/plugins, and all metrics.* flags true.

Aethis Probe (probe.yaml)

See Agents & Probes — Aethis Probe for the full field reference: backend_url, probe_id, auth_token, ca_path, tls_verify, push_interval, buffer_path, buffer_max_events, buffer_max_bytes, interfaces (list of {name, mode, bpf}), log_level.

Perimeter Probe (probe.yaml)

See Agents & Probes — Perimeter Probe for the full field reference: addr, server_cert, server_key, operator_ca, client_cert, client_key.