Overview

July 22, 2026 · View on GitHub

Run Observal entirely on your own infrastructure. No SaaS, no egress, every byte of telemetry stays inside your network.

Architecture at a glance

flowchart TB
    engineers[Engineers]
    web["observal-web - static web UI"]
    api["observal-api - FastAPI backend"]
    worker["observal-worker - async jobs"]
    db["observal-db - Postgres"]
    redis["observal-redis - jobs + pub/sub"]
    ch["observal-clickhouse - telemetry"]
    grafana["observal-grafana - optional dashboards"]

    engineers --> web
    web <--> api
    api --> worker
    api --> db
    api --> redis
    api --> ch
    worker --> db
    worker --> redis
    worker --> ch
    grafana --> ch

Seven services:

ServiceImagePortsPurpose
observal-apibuilt from docker/Dockerfile.api8000FastAPI backend
observal-webbuilt from docker/Dockerfile.web3000Next.js web UI
observal-dbpostgres:165432Registry, users, config
observal-clickhouseclickhouse/clickhouse-server:26.38123Session and audit events
observal-redisredis:7-alpine6379Job queue (arq) + pub/sub
observal-workerbuilt from docker/Dockerfile.api(internal)Background async jobs
observal-grafanagrafana/grafana-oss:11.6.53001Dashboards (optional)

All services run on a private observal-net bridge network. Named volumes (pgdata, chdata, redisdata, grafanadata, apidata) hold persistent data.

Deployment tiers

Choose the deployment model that fits your team:

Single-nodeKubernetesProduction
HowDocker Compose on one VMOfficial Helm chartTerraform on AWS or GCP
Best for≤50 users, internal tools, POCsCloud-native teams, existing K8s infraEnterprise, SLA-bound, 50+ users
Cost$20 to $150/moVariable~$180 to $255/mo
HANoPod resilience & horizontal scalingYes (Multi-AZ databases, autoscaling)
Time to deploy10 minutes10 to 15 minutes20 to 30 minutes

Start here:

If you want to...Read
Deploy on a single VM (simplest)Single-node deployment
Deploy on Kubernetes with HelmKubernetes deployment with Helm
Deploy a production HA stackProduction deployment
Deploy on AWS specificallyAWS deployment with Terraform
Deploy on GCP specificallyGCP deployment with Terraform

Then configure and operate:

If you want to...Read
Confirm your machine can run ObservalRequirements
Get the stack running locally for devDocker Compose setup
Know every env var that mattersConfiguration
See every port and volume at a glancePorts and volumes
Understand the DBs and retentionDatabases
Set up SSO, JWT keys, demo accountsAuthentication and SSO
Understand session deliverySession tracking and reconciliation
Upgrade safelyUpgrades
Back up and restoreBackup and restore
Fix something that's brokenTroubleshooting

Production checklist

Before putting Observal in front of real users:

  1. Generate a real SECRET_KEY: python3 -c "import secrets; print(secrets.token_urlsafe(32))".
  2. Set strong Postgres and ClickHouse passwords: not the .env.example defaults.
  3. Scope CORS_ALLOWED_ORIGINS to your real frontend host.
  4. Configure SSO in Admin → SSO, including deployment.sso_only if you want SSO-only login.
  5. Tune rate limits (RATE_LIMIT_AUTH, RATE_LIMIT_AUTH_STRICT).
  6. Set DATA_RETENTION_DAYS to match your retention policy (default 90 days).
  7. Back up the JWT key volume (apidata): losing it invalidates every session.
  8. Remove demo accounts: unset DEMO_* env vars before the first startup in a real environment.

Each of these is covered in the linked deep-dive below. Start with Requirements.