PORT=3001 # HEALTH_TOKEN is read at runtime only (process.env at startup). # On Coolify: MUST be is_runtime=true, is_buildtime=false. # Buildtime ARG leaks the secret in clear in application_deployment_queues.logs. HEALTH_TOKEN=change-me-to-a-strong-secret LOGTO_HEALTH_URL=https://auth.lacompagniemaximus.com/oidc/.well-known/openid-configuration # Directory served by GET /reports/scans. Bind-mount target on Coolify — # parent /data/defenseurs/ is already mounted (status.json sits next to it). REPORTS_DIR=/data/defenseurs/reports # --- Workstation snapshots (POST /hosts/, GET /hosts) -------------------- # Directory the API WRITES workstation snapshots into, one .json per host. # Unlike the /data/defenseurs mounts this one must be writable by uid 1000 # (the `node` user the container runs as) or every ingest answers 500. HOSTS_DIR=/data/hosts # Comma-separated allowlist of host ids. Each entry must match # ^[a-z0-9][a-z0-9-]{0,31}$ — anything else is logged and dropped at startup. HOSTS_ALLOWED_IDS=thinkpad # Bearer token for POST /hosts/. Separate from HEALTH_TOKEN on purpose: a # workstation agent should be able to write its own snapshot without gaining # read access to the Defenseurs reports. Same Coolify rule as HEALTH_TOKEN — # is_runtime=true, is_buildtime=false. Unset -> POST /hosts/ answers 503. HOSTS_INGEST_TOKEN=change-me-to-a-strong-secret # Age (seconds) past which GET /hosts reports a host as offline. Default 900. HOSTS_STALE_SECONDS=900