Key points
- The stack runs PostgreSQL, API, AAA, dispatcher, git-bot, UI, Gotenberg, the restricted socket proxy, and a Docker runner.
NOPSAI_BIND_ADDRESSdefaults to127.0.0.1, so published ports are workstation-local unless you change it.- System Logs read through
tcp://docker-socket-proxy:2375, never the raw Docker socket. - The default topology does not mount
/data/backupsas durable storage.
Before you start
- Runtime
- Docker Engine with the Compose v2 plugin
docker compose version - Bootstrap values
- The seven required values present in
.envgrep -c "^\(POSTGRES_PASSWORD\|DATABASE_URL\|NOPSAI_MASTER_KEY\|JWT_SIGNING_KEY\|SERVICE_JWT_SIGNING_KEY\|AAA_SHARED_INTERNAL_TOKEN\|NOPSAI_BOOTSTRAP_ADMIN_PASSWORD\)=" .env - Images
- A checkout to build from, or access to the configured image registry
Steps
- 01
Start the topology
Compose brings up PostgreSQL, the API, AAA, the dispatcher, git-bot, the UI, Gotenberg, and the socket proxy on the
nopsai-netnetwork.Build and startbash docker compose up -d --build docker compose psExpected result- Every service reaches a running state; the database becomes healthy before the API finishes starting.
- 02
Confirm the control plane answers
/livezreports the process is up;/healthzwaits for a reachable database, which is what a cold start is usually blocked on.Probe the APIbash curl -s localhost:8080/livez curl -s localhost:8080/healthz curl -s localhost:8080/version | jqVerify/healthzreports ready and/versionreturns the build identity of the images you started.
- 03
Add a runner
The
docker-runnerservice in this file only builds the image; its entrypoint istrue. Install a working runner from the dispatcher workspace instead.Verify- The runner registers and appears dispatchable in System, then the dispatcher workspace.
- 04
Upgrade or tear down
Upgrading is a pull and recreate. Tearing down keeps the database volume unless you ask for it to go.
Importantdown -vdeletes the database volume, and with it every run record, credential, and setting.
Upgrade, stop, or drop statebash NOPSAI_VERSION=0.22 docker compose pull && docker compose up -d docker compose down docker compose down -v
How it works
Compose is the fastest way to see real product behavior, and everything configured there can be exported to a configuration repository afterwards.
The Docker runner mounts the Docker socket because it creates agent and step containers. Treat the runner host as a trusted execution boundary and isolate workloads by scope.
Docker step containers default to bridge networking so package installs, source fetches, and registry access work. Set DOCKER_NETWORK_NAME=none when steps must run without egress, or name a dedicated network for controlled egress.
Examples
docker compose up -d --build
docker compose ps
docker compose logs -f nopsai aaa dispatcher docker-runner
docker compose downLimits
- Compose defaults are development defaults. Replace every fallback secret and review exposure before using them anywhere shared.
Implementation evidence
docker-compose.yamlExact services, ports, and environment variables.

