Skip to content

Docker Deployment

Docker Compose is the official and only supported way to deploy SentriKat on-premises. The release bundle you download from the Customer Portal contains everything you need: the docker-compose.yml, an annotated .env.example, and the Nginx reverse-proxy configuration.

System Requirements

Component Minimum Recommended
CPU 2 cores 4+ cores
RAM 4 GB 8 GB
Disk 20 GB SSD 50 GB SSD
Docker 20.10+ Latest stable
Docker Compose v2.0+ Latest stable
Network Outbound HTTPS (443) Outbound HTTPS (443)

Why 4 GB minimum RAM?

SentriKat runs the application, PostgreSQL, and background sync tasks, and maintains a full software identity catalogue in the database. The 4 GB minimum ensures stable operation under load.

Architecture

The stack consists of three services defined in the bundled docker-compose.yml:

Service Role Port
sentrikat The SentriKat application (Flask, served by Gunicorn) 5000, plain HTTP (on 1.4.0-beta and later, reachable only from the server itself)
sentrikat-db PostgreSQL database 5432 (internal only)
sentrikat-nginx Reverse proxy in front of the app 80 / 443 (on 1.4.0-beta and later, 80 only redirects to 443)

Database schema migrations run automatically when the application boots: there is no manual migration step, on first install or on upgrades.

Installation

1. Download SentriKat

  1. Log into the Customer Portal with your email (you'll receive a one-time code)
  2. Go to Downloads and download the latest release bundle (sentrikat-<version>.tar.gz)

2. Extract and Configure

# Extract the bundle
tar -xzf sentrikat-*.tar.gz
cd sentrikat-*/

# Load the Docker image shipped inside the bundle
docker load -i sentrikat-image-*.tar.gz

# Create your configuration from the annotated template
cp .env.example .env
${EDITOR:-nano} .env

No registry access needed

The application image ships inside the bundle, your server never needs to reach a container registry. Air-gapped installs work out of the box.

Set the required variables in .env (the .env.example in the bundle documents each one):

Variable Description How to set
SECRET_KEY Application signing key openssl rand -hex 32
ENCRYPTION_KEY Key used to encrypt stored credentials A 32-byte random value, base64url-encoded: see the command block below
DB_PASSWORD PostgreSQL password (used by the bundled DATABASE_URL) Choose a strong password
DATABASE_URL PostgreSQL connection string Pre-wired to the bundled database service, only change it for an external PostgreSQL
SERVER_NAME Hostname SentriKat is served on (e.g. sentrikat.example.com) Your DNS name
SENTRIKAT_URL Full public base URL, used in emails and share links (e.g. https://sentrikat.example.com) Your URL
SENTRIKAT_INSTALLATION_ID Unique identifier of this installation (SK-INST-…). Your license is bound to it, keep it stable and back it up See the instructions in .env.example

Fill the required values in one shot (quick start / lab)

Tested copy-paste block, generates strong secrets and sets localhost values suitable for a trial install. For production, set SERVER_NAME and SENTRIKAT_URL to your real hostname.

sed -i "s|^SECRET_KEY=.*|SECRET_KEY=$(openssl rand -hex 32)|" .env
sed -i "s|^ENCRYPTION_KEY=.*|ENCRYPTION_KEY=$(openssl rand 32 | base64 | tr '+/' '-_')|" .env
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=$(openssl rand -hex 24)|" .env
sed -i "s|^SERVER_NAME=.*|SERVER_NAME=localhost|" .env
sed -i "s|^SENTRIKAT_URL=.*|SENTRIKAT_URL=https://localhost|" .env  # 1.3.0-beta and earlier: http://localhost:5000
sed -i "s|^SENTRIKAT_INSTALLATION_ID=.*|SENTRIKAT_INSTALLATION_ID=SK-INST-$(openssl rand -hex 16 | tr a-f A-F)|" .env

# verify all six are set
grep -E "^(SECRET_KEY|ENCRYPTION_KEY|DB_PASSWORD|SERVER_NAME|SENTRIKAT_URL|SENTRIKAT_INSTALLATION_ID)=" .env

3. Start the Stack

docker compose up -d

# Wait for health: every service should be "Up (healthy)"
docker compose ps

On first boot the application applies all database migrations automatically (you'll see Applying schema migrations in the logs).

4. Complete the Setup Wizard

On 1.4.0-beta and later, open https://<your-host>/ (http:// sends you there). Until you put your own certificate in the certs folder, the browser warns that the certificate is not trusted: that is the self-signed certificate created at the first start (see TLS / HTTPS). On 1.3.0-beta and earlier, open http://<your-host> (through the bundled Nginx) or http://<your-host>:5000 (direct to the app).

On first run, SentriKat starts a setup wizard in the browser that walks you through:

  1. Admin account: create your administrator user
  2. Organization: name your first organization
  3. Catalog seed: initial product catalog data
  4. Initial sync: the first exploited-vulnerability catalogue sync runs automatically

After the wizard, exploited-vulnerability data stays in sync automatically on a daily schedule, no extra configuration needed.

Air-gapped installs (Professional)

The exploited-vulnerability feed, exploit probability, and software identity feeds refresh over the internet, so they cannot auto-sync on an isolated host. Air-gapped operation is part of Professional: refresh them with the offline bundle instead (see Air-Gapped Data Refresh below).

Air-Gapped Data Refresh

On a host with no internet access (Professional), keep the vulnerability intelligence current by moving a signed feed bundle across the boundary:

  1. On a connected machine, download the signed vuln-feed bundle from the Customer Portal.
  2. Transfer it to the air-gapped host (removable media or a data diode).
  3. In the admin UI, import the bundle. The exploited-vulnerability feed, exploit probability, and the software identity catalogue update with no internet access required.

The license is offline-signed. Air-gapped installations send nothing to us.

5. Activate Your License

  1. Go to Settings → License
  2. Find your Activation Code (SK-XXXX-XXXX-XXXX-XXXX) in the email that came with your license (the Community welcome email or your purchase email) or in the Customer Portal, where you can also issue a new one
  3. In the Activate Online box, enter it as the Activation Code and click Activate Online
  4. Done! The license is applied automatically

Firewall

Your server needs outbound HTTPS (port 443) to license.sentrikat.com, api.sentrikat.com and portal.sentrikat.com. All three names reach the same licensing service.

  1. Go to Settings → License and copy your Installation ID (SK-INST-xxxxxxxx)
  2. On any browser, log into portal.sentrikat.com/downloads
  3. Paste your Installation ID and click Activate
  4. Copy the signed license and add it to your .env:
    SENTRIKAT_LICENSE=eyJsaWNlbnNl...your-signed-license...
    
  5. Apply it: docker compose up -d (docker compose restart does not reread .env)

For full details, see Licensing & Activation.

Verify the Installation

# All services healthy
docker compose ps

# The app answers (200, or a redirect to the wizard/login). Run it on the server itself:
# from 1.4.0-beta, port 5000 answers only there. Right after a start it takes a few seconds,
# 000 means nothing answered within a minute.
for i in $(seq 1 30); do code=$(curl -s -o /dev/null --max-time 5 -w "%{http_code}" http://127.0.0.1:5000/); [ "$code" != 000 ] && break; sleep 2; done; echo "$code"

Common Operations

View Logs

# All services
docker compose logs -f

# Application only
docker compose logs -f sentrikat

# Last 100 lines
docker compose logs --tail=100 sentrikat

Restart Services

# Restart all
docker compose restart

# Restart the application only
docker compose restart sentrikat

Update SentriKat

  1. Download the latest bundle from the Customer Portal
  2. Extract it and copy your existing .env into the new directory
  3. Load the new image and start the new version:
docker load -i sentrikat-image-*.tar.gz
docker compose up -d

Schema migrations for the new version run automatically at boot. Your data lives in Docker volumes and is preserved across updates, but take a backup first anyway.

Backups

See Backup & Restore for database backup and disaster-recovery procedures.

Production Hardening

TLS / HTTPS

1.4.0-beta and later. The bundled Nginx serves HTTPS on port 443 from the first start, and port 80 only redirects there. Without a certificate in the certs folder, a self-signed one is created at the first start. To use your own, put fullchain.pem (certificate plus intermediate chain) and privkey.pem (its key) in ./certs/ and run docker compose restart sentrikat-nginx. A restart does not reread .env. Port 5000 answers in plain HTTP only on the server itself: to reach it from other machines, set APP_PORT_BIND=0.0.0.0 in .env and run docker compose up -d (that traffic is not encrypted).

1.3.0-beta and earlier. The default deployment serves HTTP. For production, terminate TLS at the bundled Nginx: the TLS Setup runbook covers Let's Encrypt, internal CA, and self-signed paths.

Agents and HTTP

On 1.4.0-beta and later, agents and scripts use the https:// address. With the self-signed certificate, give the agent ./certs/fullchain.pem: --ca-cert /path/to/fullchain.pem on Linux and macOS, -CaCertPath C:\path\to\fullchain.pem on Windows. Agents and scripts set up with an http:// address or with port 5000 stop connecting after the update to 1.4.0-beta: change their server address to https://<your server>.

On 1.3.0-beta and earlier, the agent installers refuse plain HTTP by default. Set up TLS before rolling out agents, or pass the explicit allow-HTTP flag for lab use (see the agent guides).

External PostgreSQL

To use an existing PostgreSQL cluster instead of the bundled sentrikat-db service, point DATABASE_URL at it. See External Postgres.

Container Permissions

For hardened hosts (SELinux, rootless Docker, custom UID/GID mappings), see Container Permissions.

Troubleshooting

A container won't start

# Check logs
docker compose logs sentrikat

# Check container status
docker compose ps -a

# Verify the resolved configuration
docker compose config

The most common cause is a missing required variable in .env, the application refuses to start and tells you which one in the logs.

Database connection issues

# Check PostgreSQL is running and healthy
docker compose ps sentrikat-db

# Inspect database logs
docker compose logs sentrikat-db

Port conflicts

The stack binds ports 80/443 (Nginx) and 5000 (app; on 1.4.0-beta and later, only on the server's own address 127.0.0.1). If something else on the host already uses them:

# Check which ports are in use
ss -tlnp | grep -E '(:80|:443|:5000)'

On 1.3.0-beta and earlier, change the published port in docker-compose.yml, e.g. "8080:5000". On 1.4.0-beta and later, the browser, agents and scripts reach SentriKat through Nginx: ports 80 and 443 must be free.

Looking for a manual (bare-metal) installation guide?

Bare-metal installation is not a supported path and is not documented. The container entrypoint performs setup a manual install would have to replicate by hand (CA certificates, permissions, automatic schema migrations), so Docker Compose is the only deployment that is tested and supported. If your environment cannot run Docker, contact [email protected].

Next Steps