Docker Compose Deployment¶
Audience: Administrators deploying Sentari on a single server or VM
What you need: the Docker Compose bundle (download from your Sentari release), Docker Engine 24+, a Sentari license key, and network (or mirror) access to the container images. No source repository required.
This bundle deploys the full Sentari server stack — API, versioned API-docs site, background workers, TimescaleDB, and Redis — from published container images, in one command.
Contents of this bundle¶
| File | Purpose |
|---|---|
docker-compose.yml |
The stack definition (image-only — no build step). |
.env.example |
Template for your secrets and settings. |
README.md |
This guide. |
Prerequisites¶
- A Linux server (amd64), 4 GB RAM minimum (8 GB recommended), 40 GB+ disk.
- Docker Engine 24+ with the Compose plugin (
docker compose version). - Ports 8000 (API + dashboard) and 8001 (API docs) reachable by your users.
- A Sentari license key and image pull access (public
ghcr.io, or your internal mirror — see Air-gap / private registry).
Step 1 — Prepare the environment file¶
From inside the bundle directory:
cp .env.example .env
chmod 600 .env
$EDITOR .env
Fill in every REPLACE-WITH-... value. Generate the cryptographic ones:
# SENTARI_SECRET_KEY (64 hex chars)
python3 -c "import secrets; print(secrets.token_hex(32))"
# SENTARI_CONFIG_KEY (base64, 32 bytes)
python3 -c "import os,base64; print(base64.b64encode(os.urandom(32)).decode())"
# SENTARI_ENROLLMENT_TOKEN / passwords
python3 -c "import secrets; print(secrets.token_hex(16))"
Pin the release for production — set VERSION= to a specific tag instead of latest.
Step 2 — Provision the license-map signing key¶
The server signs the install-gate policy map that agents fetch. It never
auto-generates this key — create it once into the ca-data volume before
starting the stack:
# Create the named volume and write the key into it
docker volume create docker-compose_ca-data >/dev/null 2>&1 || true
docker run --rm -v docker-compose_ca-data:/ca alpine/openssl \
genpkey -algorithm ed25519 -out /ca/license_map_signing.key
docker run --rm -v docker-compose_ca-data:/ca alpine \
chmod 600 /ca/license_map_signing.key
The volume name is
<folder>_ca-data. If you renamed the bundle directory, adjust accordingly (docker volume lsto confirm).
Step 3 — Start the stack¶
docker compose up -d
Compose pulls the images and starts all services. First start runs database migrations and creates the bootstrap admin account.
Step 4 — Verify the deployment¶
# All services should be "healthy"
docker compose ps
# API health
curl -sf http://localhost:8000/api/health
# Expected: {"status": "ok", "version": "..."}
Then open the dashboard at http://SENTARI_BOOTSTRAP_ADMIN_EMAIL / SENTARI_BOOTSTRAP_ADMIN_PASSWORD you set.
Change the admin password after first login.
The API documentation is at http://
Step 5 — Enroll your first agent¶
Install the agent on an endpoint and point it at this server with the
enrollment token from your .env. See the
Agent deployment guide.
Within a few minutes the device appears under Devices in the dashboard and its package inventory + CVE correlation populate.
Optional: SSO and LDAP¶
Uncomment and set the SENTARI_OIDC_* / SENTARI_LDAP_* values in .env, then
docker compose up -d to apply. OIDC supports Keycloak, Azure Entra ID, Ping,
Okta; LDAP requires ldaps:// in production. See the
Configuration Reference
for the full list.
TLS / production hardening¶
This bundle serves plain HTTP on 8000/8001. For production, put a TLS-terminating reverse proxy (nginx, Caddy, your load balancer) in front, and:
- Terminate HTTPS and forward to
127.0.0.1:8000. - Set
SENTARI_ALLOWED_ORIGINSto your HTTPS dashboard URL. - Keep
SENTARI_MTLS_REQUIRED=true; the terminator forwards the agent client certificate fingerprint asX-Client-Cert-Fingerprint.
Air-gap / private registry¶
Mirror these images into your internal registry, then set REGISTRY= in .env
to its prefix:
ghcr.io/sentari-dev/sentari/server:<version>ghcr.io/sentari-dev/sentari/docs:<version>docker.io/timescale/timescaledb:2.14.2-pg16docker.io/redis:7.2-alpine
For air-gap licensing, your license key carries a signed max_offline_days
claim — the server runs without phoning home for that window.
Managing the stack¶
docker compose logs -f sentari-api # tail API logs
docker compose down # stop (data preserved in volumes)
docker compose pull && docker compose up -d # upgrade to a new VERSION
docker compose down -v # stop AND delete all data (irreversible)
Troubleshooting¶
API container restarts / won't start. Check docker compose logs sentari-api.
Most common causes: SENTARI_SECRET_KEY still the placeholder; SENTARI_MTLS_REQUIRED=false
without SENTARI_DEBUG=true; wrong POSTGRES_PASSWORD on an existing db-data
volume (recreate with docker compose down -v if this is a fresh install).
Agent can't connect. Verify curl http://<server>:8000/api/health from the
endpoint and that the enrollment token matches.
No scans in the dashboard. Confirm the agent service is running on the endpoint and check its log for upload errors.
For assistance, contact your Sentari representative.