Skip to main content

Self-host · Docker Compose

Self-host with Docker Compose

Run the whole SignalPilot stack on your own machine or inside your network with Docker Compose. It takes about five minutes.

Should I self-host?

Most teams should not. SignalPilot Cloud is the fastest way to get started, and everything in the main docs assumes it. Self-host when you need the gateway inside your own network, when policy says your warehouse credentials cannot leave your infrastructure, or when you want to develop against the code. If that is you, this page gets a full local stack running in about five minutes.

Prerequisites

  • Docker 24 or newer, with Docker Compose v2
  • Git
  • About 4 GB of free memory for the containers
  • The ports listed below free on your machine

Install

clone and start the stack
$ git clone https://github.com/SignalPilot-Labs/signalpilot.git
$ cd signalpilot
$ cp .env.example .env
$ docker compose up -d

The stack starts in the background. On the first run Docker pulls and builds the images, which takes a few minutes.

Verify

verify the stack
$ docker compose ps
$ curl http://localhost:3300/health
$ curl -I http://localhost:3200

Every service should show healthy or running. Then open the web UI at http://localhost:3200. The MCP endpoint for agents is http://localhost:3300/mcp.

What is running

ServicePort on your machineWhat it does
web3200The web UI
gateway3300The gateway: MCP server, REST API, governance, audit
notebook2718The shared notebook container used in local mode
db5601 (container port 5432)Postgres, the gateway's own database
minio9000 (API), 9001 (console)S3-compatible object storage for workspaces, chat artifacts, and eval evidence
mailpit8025Catches outgoing email so you can read it in a browser
gateway-chat-workerinternalRuns chat and agent jobs
sandboxinternalSandbox manager for DuckDB and SQLite queries over local files
minio-initinternalOne-shot job that creates the object storage buckets
eval-object-proxyinternalRead-only bridge from the eval network to object storage

Every published port is bound to loopback only (127.0.0.1 and [::1]). Nothing is reachable from other machines unless you put a reverse proxy in front of it. When you are ready for that, read Run in production.

Override any host port in .env with SP_WEB_PORT, SP_GATEWAY_PORT, SP_NOTEBOOK_PORT, or SP_DB_PORT.

Where your data lives

The gateway stores connections, the knowledge base, audit logs, and run history in Postgres. Docker keeps that database, object storage, repositories, and workspace files in named volumes (signalpilot-pg-data, signalpilot-minio-data, signalpilot-data, signalpilot-repos, signalpilot-workspace, and a few smaller ones), so they survive restarts and upgrades. Operations lists what to back up.

Configure

.env holds your local overrides. Ports, Anthropic credentials for chat, and optional Slack and Notion settings are all commented in the file. The configuration reference covers every variable the gateway reads.

Read the logs

tail logs
$ docker compose logs -f gateway
$ docker compose logs -f gateway-chat-worker
$ docker compose logs -f web

Upgrade

upgrade
$ git pull
$ docker compose pull
$ docker compose build
$ docker compose up -d

Compose recreates the containers that changed. On a single node that means a few seconds of downtime while the gateway restarts. Database schema changes apply automatically when the gateway boots. Take a backup first, see Operations.

Connect a client

Point your agent at http://localhost:3300/mcp. The client pages walk through each one: Claude, ChatGPT, and Claude Code.

Next steps