Overview
CaseBender ships as a public, source-free Community release bundle and a matching set of versioned container images. Customers do not need access to the private source repository. Upgrading means verifying the new bundle, updating the deployment files in the existing installation directory, pulling the pinned images, and recreating the containers. Data and configuration remain in named Docker volumes and.env.
Use a pinned target version. Never change a production deployment to a mutable
latest tag during an upgrade.
Database migrations and default-data seeding run automatically on startup after
every upgrade. You do not need to run any migration commands manually.
What persists across upgrades
Paid licenses are bound to the Installation ID. After an upgrade, confirm
Settings → License or
./casebender license still shows the same ID. See
License. Do not send LICENSE_SECRET_KEY to CaseBender
to request a paid key.
Upgrade procedure (Docker Compose)
Run the commands from the existing installation directory. Do not copyrelease.env, Compose files, or the CLI by hand. ./casebender upgrade applies
the signed bundle (CLI, Compose, Nginx stock file, preflight/canary,
release.env, and release-manifest.json) and never overwrites .env.
1
Back up your database and .env
2
Apply the signed bundle
On a connected host, download, verify (SHA-256 and Cosign), and apply a
pinned version in one command. The default download base is the public CaseBender Blob store used by the
Quickstart. Override it with Bare
v1.0.9 is also accepted. Never use latest.CASEBENDER_RELEASE_BASE_URL
when you mirror artifacts internally. Cosign must be installed for a
--version upgrade.On an air-gapped host, sneakernet the versioned archive (and, if you have
them, the .sha256 and .sigstore.json sidecars). Then apply the local tar.
Inner SHA256SUMS is required. Cosign runs only when a .sigstore.json
sidecar sits next to the archive../casebender upgrade does not pull images. It prints the current pin
and the two commands above. To pull and recreate the current pin after a
failed recreate, use ./casebender upgrade --reapply (add --offline when
images are already loaded).If this installation’s CLI does not accept --version, copy only casebender
from the verified bundle into this directory once, then rerun the command.The managed path writes .env.pre-upgrade, copies pinned release metadata
into .env without replacing secrets, preserves an existing
AUDIT_INTEGRITY_SECRET or generates it once for an older installation, runs
preflight, pulls the exact images unless --offline, and recreates containers
without building source.The command then waits for web, api, and ingestion to report healthy
(database migrations finish before web becomes healthy), recreates the
Nginx container so it resolves the new application containers, and checks
/api/health and /api/v1/health through Nginx. It reports success only
after those checks pass. The default wait is 10 minutes. Set
CASEBENDER_READY_TIMEOUT_SECONDS for releases with long migrations. On
failure the command exits non-zero, keeps all volumes and .env, and prints
the retry and rollback commands.If deploy/nginx/nginx.conf was customized, the CLI writes
nginx.conf.pre-upgrade and installs the stock release file. Re-apply site
TLS and proxy settings from that backup. Include .env and
.env.pre-upgrade in the protected backup set.3
Watch the logs
Verify after upgrading
- Sign in and confirm your existing cases, alerts, and users are present.
- Confirm your login still works (your admin password is unchanged).
- Confirm the deployment remains
ACTIVE; an existing installation must not display/setup. - Confirm organization, role, TLP, API-key scope, and integration egress checks.
- Update a non-critical test alert and verify its audit entry appears without an integrity configuration error.
- Check the worker is processing jobs:
Rollback
Do not start older application images against a schema that they do not support. Use the release note’s declared rollback path. When the release notes explicitly confirm backward schema compatibility, the managed rollback restores the previous immutable image pin saved immediately before the upgrade:--offline.
The command preserves the failed release configuration as .env.pre-rollback.
If a database migration is not backward compatible, do not use image-only
rollback. Stop the stack and restore the pre-upgrade database and matching
volumes before starting the previous pinned image set:
Always upgrade a staging environment first, and take a fresh database backup
immediately before upgrading production.
Common upgrade mistakes
The two most common problems both come from losing state:-
Changing the Compose project name or directory. Docker derives volume names
from the project. Renaming the folder or using a different
-pproject name points Compose at new, empty volumes. Always upgrade from the same directory/project so your existing volumes are reused. -
Replacing
.env. The bundle’srelease.envcontains only pinned release metadata. It must not replace the installation’s secret-bearing.env. -
Running only
docker compose pull. A raw image pull bypasses managed secret recovery, release pinning, preflight, and backup creation. Always run./casebender upgrade --version <id>or./casebender upgrade --offline ./casebender-onprem-vX.Y.Z.tar.gz. -
Rotating
AUDIT_INTEGRITY_SECRET. A new value cannot verify audit entries written with the previous key. Preserve the installation-specific value across upgrades, rollbacks, and restores. -
Recreating an application container without Nginx. Nginx resolves
web,api, andingestiononly when it starts. If one of those containers is recreated outside./casebender up,upgrade, orrollback(for example with a rawdocker compose up), Nginx keeps the old address and cannot reach the application. Recreate only the proxy; no data is touched:
Activation compatibility
The activation migration is idempotent:- databases with existing users become
ACTIVE; - existing passwords, users, roles, organizations, cases, and API keys are not changed;
- no second administrator is created; and
- only a genuinely empty installation enters first-run activation.
Desktop Installer
If you deployed with the Desktop Installer, use the app’s built-in update flow — it pulls the latest images and recreates services while preserving your data directory,.env, and license key.
Google Cloud Run
Cloud Run upgrades deploy a new revision. Because Cloud Run has an ephemeral filesystem, the license secret must be provided via Secret Manager asLICENSE_SECRET_KEY so it persists across revisions. Redeploy against your
existing Cloud SQL instance and secrets: