Key points
- Everything is a container. The control plane, UI, PostgreSQL, and the runner all run on one Compose bridge network named
nopsai-net— see Architecture and networking. - Seven values must exist before the first start:
POSTGRES_PASSWORD,DATABASE_URL,NOPSAI_MASTER_KEY,JWT_SIGNING_KEY,SERVICE_JWT_SIGNING_KEY,AAA_SHARED_INTERNAL_TOKEN, andNOPSAI_BOOTSTRAP_ADMIN_PASSWORD. Compose exits withset <NAME>when one is missing. JWT_SIGNING_KEYandSERVICE_JWT_SIGNING_KEYmust be different values, so a user token can never be replayed as a service token.- Published ports bind to
127.0.0.1throughNOPSAI_BIND_ADDRESS: 80 for the UI, 8080 for the API, 8081 for git-bot, 9091 for the dispatcher, and 5432 for PostgreSQL. - The bootstrap administrator is
NOPSAI_BOOTSTRAP_ADMIN_EMAIL, default[email protected], and must rotate its password at first login unlessNOPSAI_BOOTSTRAP_ADMIN_MUST_CHANGE_PASSWORDis set tofalse. - Image tags come from
NOPSAI_VERSION(defaultdev) andNOPSAI_IMAGE_REGISTRY(defaultghcr.io/nopsai). Either build them from a checkout or make that registry reachable.
Before you start
- Container runtime
- Docker Engine with the Compose v2 plugin
docker compose version - Daemon access
- The current user can talk to the Docker daemon without sudo
docker ps - Free ports
- 80, 8080, 8081, 9091, and 5432 unused on the loopback interface
lsof -nP -iTCP:80,8080,8081,9091,5432 -sTCP:LISTEN - Value generation
- A source of high-entropy values for the seven bootstrap secrets
openssl rand -hex 32 - Images
- A repository checkout to build from, or network access to the configured image registry
Steps
- 01
Confirm the runtime
Compose v2 is required; the v1
docker-composebinary is not supported by this file.Check Docker and Composebash docker compose version docker psExpected result- Compose reports a v2 version and
docker psanswers without a permission error.
- Compose reports a v2 version and
- 02
Confirm the ports are free
The stack publishes five ports. A port already in use is the most common reason a first start half-succeeds.
List conflicting listenersbash lsof -nP -iTCP:80,8080,8081,9091,5432 -sTCP:LISTENVerify- Nothing is listed. Anything reported must be stopped or the published port changed before starting.
- 03
Decide how the stack is reached
By default every published port binds to
127.0.0.1, so the install is reachable only from the workstation running it. SetNOPSAI_BIND_ADDRESSonly when you consciously want the stack on the network.Important- Binding to a non-loopback address publishes the API, git-bot, dispatcher, and PostgreSQL ports. Work through the production hardening checklist before doing that.
- 04
Generate the seven values
Generate them fresh rather than copying from another environment. The database URL has to carry the same password you generated for PostgreSQL.
Generate bootstrap valuesbash POSTGRES_PASSWORD=$(openssl rand -hex 16) cat <<EOF POSTGRES_PASSWORD=$POSTGRES_PASSWORD DATABASE_URL=postgres://nopsai:$POSTGRES_PASSWORD@db:5432/nopsai?sslmode=disable NOPSAI_MASTER_KEY=$(openssl rand -hex 32) JWT_SIGNING_KEY=$(openssl rand -hex 32) SERVICE_JWT_SIGNING_KEY=$(openssl rand -hex 32) AAA_SHARED_INTERNAL_TOKEN=$(openssl rand -hex 32) NOPSAI_BOOTSTRAP_ADMIN_PASSWORD=$(openssl rand -hex 12) EOFVerify- Confirm
JWT_SIGNING_KEYandSERVICE_JWT_SIGNING_KEYare not the same string.
- Confirm
How it works
The Compose stack is built for evaluation and development. A shared or production install uses a release bundle or the Helm chart, and the same seven values still have to exist — they just come from a secret store instead of a local .env.
Nothing here is wasted on a later move: the values, the pipelines, and the configuration you create locally can be exported into a configuration repository and applied to another install.
The Docker runner you install later mounts /var/run/docker.sock, which lets it create containers on its host. Choose a host you are willing to treat as an execution boundary.
Limits
- The repository does not publish minimum CPU, memory, or disk figures for the Compose stack. Size the host for the workloads your pipelines will run, not for the control plane alone.
Implementation evidence
docker-compose.yamlRequired variables, published ports, bind address, and network name.
version.txtThe single release series every image tag, chart version and compatibility range follows.

