Self-host
Every product runs on-prem via a single Docker bundle. License JWTs gate which /v1/<product>/* namespaces are reachable, so dava-norm-selfhost and dava-suite-selfhost are the same image with a different license.
Quickstart
From the repo root (or the customer-facing release tarball):
bashcd infra/selfhost
cp dava.config.yaml.example dava.config.yaml
$EDITOR dava.config.yaml # license JWT, S3 / MinIO, SMTP, secrets
./dava-init.sh # renders .env, prints a one-time setup token
docker compose -f docker-compose.suite.yaml up -d --build
# migrations and the storage bucket are applied by the migrate service
# First-run wizard (you'll see this once):
open https://<your-host>/setupLicense JWT
Self-host requires a JWT issued by AVA Research carrying:
customer_id— your account id.products— subset ofnorm/dedup/connect/agent/trust.exp— Unix epoch when the license expires.mode—onlineorairgap. Recorded in the licence only: either way it is verified locally and the engine makes no network call to AVA.seats— the most user accounts the install may hold.
Set DAVA_LICENSE_JWT in your .env. The licence is signed with an Ed25519 key only AVA holds and checked against public keys built into the image, so it cannot be issued from inside an install. Without one the API and worker do not start; uncovered product routes return 403 license_missing_<product>, and an expired licence returns 403 license_expired.
/v1/norm/* will respond. Adding Connect later just means a new JWT — no new image to deploy.Operations
Backups. Bind-mount the dava_pg and dava_minio volumes into your snapshot pipeline. The bundled stack writes everything there. A read-only restore drill runbook ships at docs/runbooks/restore-drill.md with an automated script at scripts/restore-drill.sh.
Observability. Bring your own Prometheus, or opt into the bundled stack with the --profile observability compose flag. That adds Prometheus + Grafana + Postgres/Redis exporters with a default DAVA dashboard (Grafana on :3001).
Upgrades. Back up the database and object storage, replace the source bundle with the new version, then docker compose up -d --build. The migrate service applies schema changes before the API and worker start. To roll back, restore the backup: restarting an older image does not undo a migration.