What matters, in order
Always back up
apidata and pgdata together. Backing up one without the other leaves you in a broken state after restore.
Backup cadence
Postgres backup
Usepg_dump inside the running container:
JWT key backup (apidata volume)
The API container mounts the apidata volume at /data and stores keys at /data/keys. Tar it out:
ClickHouse backup
Option A - volume snapshot (simplest)
Option B - ClickHouse native BACKUP (no downtime)
Restore order
If you’re restoring from backup after a catastrophic failure:- Stop the whole stack:
docker compose down. - Restore
apidata(JWT keys) first. - Restore
pgdata(Postgres). - Restore
chdata(ClickHouse). - Bring up the stack:
docker compose up -d. - Smoke test:
observal auth login,observal auth status.
Verifying a backup
Test restores in a staging environment at least quarterly. Untested backups are guesses. Smoke test after restore:Automated backup
A minimal cron setup (on the Docker host):/backups directory offsite (S3, B2, rsync to another host).

