[!IMPORTANT] When upgrading into the release that introduces complete-folder skill delivery, follow the skill-folder rollout procedure instead of using the quick, standard, or blue/green instructions below unchanged. Those paths do not guarantee that old API and worker processes have stopped before the new init container runs PostgreSQL migrations. Keep folder delivery off, back up and rehearse the historical upgrade, and schedule a maintenance window to drain old processes before migration; enable delivery only after a homogeneous rollout and separate approval.
Quick upgrade (recommended)
If you installed Observal viaobserval server start (the embedded stack), the CLI handles upgrades automatically:
observal server upgrade for full details.
Server-package upgrades
If you installed withinstall-server.sh, back up .env, secrets/, and the apidata and pgdata volumes before rerunning the installer for the target release. Setup detects the existing .env. Choose the default No response to preserve custom values and existing direct credentials. This only stages the new package and retains a backup: no containers restart and no migrations run. An exit code of zero means staging succeeded, not that the server has been upgraded. The installer records the prior bind address when an older install has no OBSERVAL_BIND_ADDRESS setting.
For the complete-folder release, follow the supervised rollout: keep the delivery gate off, stop all old API and worker processes before starting the new init container, then run Compose from the installed package with the same optional observability overlay/profile used by the old deployment. For a core-only package installation, after staging the package and verifying backups and the gate:
-f docker-compose.observability.yml and --profile grafana if those were used previously; do not silently drop optional services. Verify the API externally through the load balancer, not only via its container health check. Choosing Yes at the configuration prompt instead intentionally rebuilds the general configuration from the new template and starts services; for this release, stop old API and worker processes before running the installer, because setup will start the new init container. Core application, PostgreSQL, ClickHouse, Grafana, and demo credentials are preserved or migrated into restricted files, but unrelated custom environment entries must be reapplied.
Before a manual upgrade
- Back up
pgdataandapidata. See Backup and restore. Backing upchdatais nice-to-have; losing telemetry is painful but not catastrophic. - Read the CHANGELOG for the releases you’re jumping across. Note any breaking changes.
- Pin the version you’re upgrading to: don’t
git pull mainblindly. Check out a release tag or a known-good commit.
Standard upgrade
Zero-downtime upgrade (small teams)
If you run a single instance and have a ~30-second maintenance window:- Back up
pgdata,apidata,chdata. - Stop the API and worker:
docker compose stop observal-api observal-worker. - Apply migrations out of band with
alembic upgrade headandpython -m services.clickhouse.migrationsfromobserval-server, or run the init container once. - Pull/rebuild new images:
docker compose pull && docker compose build observal-api observal-worker. - Start:
docker compose up -d; wait for the new API to become healthy, thendocker compose restart observal-lbso nginx resolves the new container IPs. - Smoke test through the public load balancer:
curl -fsS http://localhost/health, thenobserval auth status --output json && observal ops telemetry status --output json.
Zero-downtime at scale
For blue/green upgrades on large deployments:- Run a second stack (
docker-compose.ymlwith different project name and host ports) behind a reverse proxy. - Apply migrations before traffic cutover. Alembic handles Postgres and
services.clickhouse.migrationshandles ClickHouse. Additive migrations should work with API N-1 and N during the rollout. - Bring up the green stack pointing at the same
pgdata/chdata/apidatavolumes. - Flip the reverse proxy to green.
- Decommission blue.
Rolling back
If the new version breaks:docker compose -f docker/docker-compose.yml downgit checkout <previous-version>docker compose -f docker/docker-compose.yml up --build -d
- If the migration is additive (most are): the previous version works fine against the newer schema.
- If the migration is destructive: restore from the pre-upgrade
pgdatabackup. This is why the backup is step 1.
CLI upgrades
CLI upgrades are independent of server upgrades. Users:observal-shim entries, the CLI restores the original MCP command in known home and current-project config files. It writes a .pre-unshim.bak copy before each change. A malformed wrapped entry stops the command with a visible migration error rather than guessing at the original executable.

