Skip to content

Deploy with Docker

The Busbar image is a FROM scratch container — the static binary and the provider catalog, nothing else (a few MB). It’s the fastest way to run Busbar on a single host.

Terminal window
docker pull getbusbar/busbar:1.4.1

Verify the image’s build provenance before you trust it (the attestation binds the image digest to the release workflow):

Terminal window
gh attestation verify oci://index.docker.io/getbusbar/busbar:1.4.1 --repo GetBusbar/busbar

The GHCR mirror (ghcr.io/getbusbar/busbar) additionally carries a cosign signature.

The provider catalog ships inside the image at /etc/busbar/providers.yaml, so you only mount your config.yaml. Provider keys come from the environment:

Terminal window
docker run -d --name busbar \
-p 8080:8080 \
-e ANTHROPIC_KEY \
-v "$PWD/config.yaml:/etc/busbar/config.yaml:ro" \
getbusbar/busbar:1.4.1
curl -s http://localhost:8080/healthz && echo ok

Pin an exact tag (getbusbar/busbar:1.4.1) in production rather than riding latest.

Grab the reference file — curl -O https://getbusbar.com/compose.yaml — or copy it:

compose.yaml
services:
busbar:
image: getbusbar/busbar:1.4.1
ports:
- "8080:8080"
environment:
# Read from the host env or a .env file — never inline keys here.
ANTHROPIC_KEY: ${ANTHROPIC_KEY}
BUSBAR_CLIENT_TOKEN: ${BUSBAR_CLIENT_TOKEN}
volumes:
- ./config.yaml:/etc/busbar/config.yaml:ro
# Governance only: a writable volume for the SQLite store.
- busbar-data:/var/lib/busbar
healthcheck:
test: ["CMD", "/usr/local/bin/busbar", "--validate"]
interval: 30s
timeout: 5s
retries: 3
restart: unless-stopped
volumes:
busbar-data:
Terminal window
docker compose up -d
  • Admin plane. The admin API runs on its own listener (:8081), loopback by default, so it is not published by the -p 8080:8080 above. To manage it, publish :8081 only behind mTLS (admin_tls) — a network-exposed admin bind refuses to boot without it. See the Admin API.
  • Governance. If you enable governance, mount a writable volume (busbar-data above) and set db_path: /var/lib/busbar/governance.db. Without governance, Busbar is stateless and needs no volume.
  • Custom catalog. To add providers beyond the shipped catalog, mount your own providers.yaml over /etc/busbar/providers.yaml.
  • Scaling / HA. Busbar is stateless — run several containers (Compose deploy.replicas, or multiple hosts) behind a proxy that health-checks /healthz. Governance budgets/rate limits are per-instance, so run a single instance for strict global enforcement. See Running multiple instances (HA).