Configuration

July 19, 2026 · View on GitHub

Boot-time infrastructure and secret settings live in .env. Runtime settings, including SSO, live in the admin UI as dynamic settings. Defaults are sane for local development.

Required for production

Override these before going live:

VariableDefaultWhy change
SECRET_KEYchange-me-to-a-random-stringSession signing key. Generate a real one before production.
POSTGRES_PASSWORDpostgresDefault password is not secure.
CLICKHOUSE_PASSWORDclickhouseSame.
CORS_ALLOWED_ORIGINShttp://localhost:3000Scope to your real frontend origin(s). Configure as deployment.cors_origins in Admin Settings.
deployment.frontend_urlhttp://localhost:3000Used for OAuth redirects and email links. Configure in Admin Settings.

Generate a secret key:

python3 -c "import secrets; print(secrets.token_urlsafe(32))"

SSO-only mode

Set deployment.sso_only=true in Admin → SSO when you want IdP-only access. Leave it false to keep password login available.

Demo accounts

Seeded on first startup only when no users exist:

DEMO_SUPER_ADMIN_EMAIL=super@demo.example
DEMO_SUPER_ADMIN_PASSWORD=super-changeme
DEMO_ADMIN_EMAIL=admin@demo.example
DEMO_ADMIN_PASSWORD=admin-changeme
DEMO_REVIEWER_EMAIL=reviewer@demo.example
DEMO_REVIEWER_PASSWORD=reviewer-changeme
DEMO_USER_EMAIL=user@demo.example
DEMO_USER_PASSWORD=user-changeme

Unset every DEMO_* env var before a real deployment. Existing demo users survive after unsetting. Delete them manually (observal admin delete-user <email>).

Admin settings warning: If demo accounts are still active or SECRET_KEY is insecure, the admin Settings page will display a warning banner at the top so operators can spot and fix the issue without digging through logs.

Database connections

DATABASE_URL=postgresql+asyncpg://postgres:postgres@observal-db:5432/observal
CLICKHOUSE_URL=clickhouse://default:clickhouse@observal-clickhouse:8123/observal
REDIS_URL=redis://observal-redis:6379

Inside Docker Compose, hostnames resolve via the observal-net bridge (e.g. observal-db). Outside Docker (e.g. CLI running on host against dockerized DBs), use localhost:<port>.

OAuth / SSO

Optional. Configure OIDC, SAML, and SSO-only mode in Admin → SSO. OIDC client changes are stored immediately, then take effect after the API restarts.

Full setup in Authentication and SSO.

Rate limiting

RATE_LIMIT_AUTH=10/minute          # general auth endpoints
RATE_LIMIT_AUTH_STRICT=5/minute    # login and password reset

Tighten for higher-traffic deployments.

ClickHouse retention

DATA_RETENTION_DAYS=90

Session events older than this are removed from ClickHouse. Set to 0 to disable retention. The minimum non-zero value enforced on startup is 7.

JWT keys

JWT_SIGNING_ALGORITHM=ES256        # ES256 (default) or RS256
JWT_KEY_DIR=/data/keys             # persisted in the apidata volume

The server generates asymmetric keys on first boot and stores them in $JWT_KEY_DIR. Back up this directory: losing the keys invalidates every session.

More: Authentication and SSO.

Git operations (submission analysis)

ALLOW_INTERNAL_URLS=false          # allow internal/private Git URLs (GitLab/GHE)
GIT_CLONE_TOKEN=                   # auth token for cloning private repos
GIT_CLONE_TOKEN_USER=x-access-token
GIT_CLONE_TIMEOUT=120              # seconds

GIT_CLONE_TOKEN_USER varies by provider: x-access-token for GitHub, oauth2 or private-token for GitLab.

Observal CLI (client-side) env vars

Not set in .env on the server. These live on the CLI user's machine.

VariablePurpose
OBSERVAL_SERVER_URLDefault server URL
OBSERVAL_ACCESS_TOKEN / OBSERVAL_API_KEYPre-authenticate without login
OBSERVAL_TIMEOUTRequest timeout (seconds)

Full list: Environment variables.

Next

Ports and volumes