Installation
Overview
The central platform (backend, frontend, Icinga 2, PostgreSQL,
VictoriaMetrics, ClickHouse, Redis, Zeek, and Caddy) is deployed as a single
Docker Compose stack. The production compose file uses the pre-built Eon
Aethis images, keeps internal services off the host network (only Caddy’s
ports are published), and reads all credentials from .env with no built-in
defaults for secrets.
The Aethis Agent, Aethis Probe, and Perimeter Probe are installed separately on the hosts and networks they observe — see Agents & Probes.
Prerequisites
- Docker Engine with the Compose plugin (
docker compose versionworks) - A host that can reach the internet for Let’s Encrypt (if not using self-signed or a supplied certificate)
- Inbound access on the ports Caddy publishes (443/80 by default)
Installation
Eon Aethis ships as a package containing the Docker images (images.tar),
docker-compose.yml, install.sh, upgrade.sh, and .env.example. On the
target server:
tar xzf eonaethis-<tag>.tar.gz
cd eonaethis
./install.shinstall.sh loads the bundled images, installs the shipped
docker-compose.yml (only if one doesn’t already exist — it never
overwrites an existing install), and creates .env from .env.example if
missing. It then stops and tells you to edit .env before starting the
stack; at minimum, set:
POSTGRES_PASSWORDJWT_SECRET(generate withopenssl rand -hex 32)ICINGA2_API_PASSWORDCLICKHOUSE_PASSWORDSMTP_FROMCADDY_DOMAIN
Alternatively, run setup.sh for an interactive wizard that prompts for
domain/TLS, email, the Anthropic API key, the network interface, and the
admin account, and writes .env for you. Set CLICKHOUSE_DB,
CLICKHOUSE_USER, and CLICKHOUSE_PASSWORD in the generated .env before
starting the stack.
Once .env is filled in:
docker compose up -dSee Configuration for the full list of environment variables, and Configuration — First-boot admin account for creating the initial admin user.
Zeek interface
ZEEK_INTERFACE defaults to eth0; set it in .env to the interface you
want Zeek to sniff. The zeek service runs with network_mode: host and
needs NET_RAW/NET_ADMIN, so it sees the host’s real interfaces rather
than a Docker bridge.
Ports
By default Caddy is the only service that binds host ports:
| Port | Service | Purpose |
|---|---|---|
| 443 | Caddy | HTTPS UI/API (override with CADDY_HTTPS_PORT) |
| 80 | Caddy | HTTP, used for ACME challenges (override with CADDY_HTTP_PORT) |
Override CADDY_HTTPS_PORT/CADDY_HTTP_PORT when another reverse proxy on
the host already owns 443/80. All other services (backend, icinga2,
postgres, victoriametrics, redis, zeek, clickhouse) are reachable
only on the Compose network, not the host.
TLS
Caddy handles TLS for the platform, in one of three modes set via
CADDY_TLS:
- Self-signed (default):
CADDY_TLS=internal. - Let’s Encrypt: leave
CADDY_TLSempty and setCADDY_DOMAINto a publicly resolvable domain, with port 80 reachable for the ACME challenge. - Your own certificate:
CADDY_TLS="/etc/caddy/certs/fullchain.pem /etc/caddy/certs/privkey.pem"and pointCADDY_CERTS_DIRat the directory containing those files on the host (mounted read-only into the container at/etc/caddy/certs).
Verifying the install
docker compose ps
curl -k https://localhost/healthThe backend’s healthcheck depends on PostgreSQL, Icinga 2, VictoriaMetrics,
and ClickHouse all reporting healthy first, so docker compose ps showing
backend as healthy implies the whole storage/monitoring layer came up
correctly.
Upgrading
tar xzf eonaethis-<newer-tag>.tar.gz
cd eonaethis # same directory as the existing install
./upgrade.shupgrade.sh loads the new images, backs up the current
docker-compose.yml and .env to a timestamped .upgrade-backup-*
directory, adds any new env vars introduced since your last install (with
defaults), shows a diff against the shipped compose file for manual merging
if your live file has diverged, then runs docker compose up -d. Database
migrations are applied automatically by the backend on startup, and the
script waits for /health to go green before finishing.