Deploy the binary (systemd)
Busbar is a single static binary with no runtime dependencies, so the VM / bare-metal deployment is: drop the binary on the host, give it config and secrets, and run it under systemd.
1. Download and verify
Section titled “1. Download and verify”The one-line installer detects your platform and downloads the binary and the provider catalog:
BUSBAR_INSTALL_DIR=/usr/local/bin curl -fsSL https://getbusbar.com/install.sh | shOr fetch a specific release tarball manually and verify its build provenance before trusting it:
ver=1.4.0base="https://github.com/GetBusbar/busbar/releases/download/v${ver}"curl -fsSLO "${base}/busbar-x86_64-unknown-linux-gnu.tar.gz"
# Verify the artifact was built by the busbar release workflow (Sigstore/OIDC).gh attestation verify busbar-x86_64-unknown-linux-gnu.tar.gz --repo GetBusbar/busbar
tar -xzf busbar-x86_64-unknown-linux-gnu.tar.gzsudo install -m 0755 busbar /usr/local/bin/busbarbusbar --version2. Place config and the provider catalog
Section titled “2. Place config and the provider catalog”sudo useradd --system --no-create-home --shell /usr/sbin/nologin busbarsudo mkdir -p /etc/busbar /var/lib/busbarsudo curl -fsSL https://getbusbar.com/providers.yaml -o /etc/busbar/providers.yamlsudo chown -R busbar:busbar /var/lib/busbarWrite /etc/busbar/config.yaml (see Configuration and Getting Started). Reference secrets as ${VAR} — never inline keys.
3. Secrets in an environment file
Section titled “3. Secrets in an environment file”Keep provider keys and tokens out of the config, in a root-owned, 0600 env file:
# /etc/busbar/busbar.env (chmod 600, owned by root)ANTHROPIC_KEY=sk-ant-...BUSBAR_CLIENT_TOKEN=a-long-random-string4. The systemd unit
Section titled “4. The systemd unit”/etc/systemd/system/busbar.service — runs as a non-root user with the rootfs read-only and privileges dropped:
[Unit]Description=Busbar LLM gatewayAfter=network-online.targetWants=network-online.target
[Service]Type=simpleUser=busbarGroup=busbarEnvironmentFile=/etc/busbar/busbar.envEnvironment=BUSBAR_CONFIG=/etc/busbar/config.yamlEnvironment=BUSBAR_PROVIDERS=/etc/busbar/providers.yaml# Fail fast: don't (re)start on an invalid config.ExecStartPre=/usr/local/bin/busbar --validateExecStart=/usr/local/bin/busbarRestart=alwaysRestartSec=2
# HardeningNoNewPrivileges=trueProtectSystem=strictProtectHome=truePrivateTmp=trueReadWritePaths=/var/lib/busbarCapabilityBoundingSet=AmbientCapabilities=
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadsudo systemctl enable --now busbarcurl -s http://localhost:8080/healthz && echo ok5. Admin plane, TLS, upgrades
Section titled “5. Admin plane, TLS, upgrades”-
Admin plane. The admin API (
/api/v1/admin) runs on its own listener, loopback (127.0.0.1:8081) by default — reachable from the host, not the network. To manage it remotely, setadmin_listento an exposed address and configureadmin_tls(mTLS); it refuses to boot otherwise. See Operations and the Admin API. -
Inbound TLS. Terminate TLS at Busbar (
tlsblock) or in front of it. See Operations → Inbound TLS. -
Upgrade / reload. Validate first, then restart (or reload live via the admin API):
Terminal window busbar --validate && sudo systemctl restart busbar
Multiple instances (HA)
Section titled “Multiple instances (HA)”Busbar is stateless, so for high availability run N hosts behind a load balancer
(nginx, HAProxy, or a cloud L4/L7 LB), each with the same config and each health-checked
on GET /healthz. Any host serves any request. If you rely on session affinity, enable
sticky sessions at the LB; and note that governance budgets/rate limits are enforced
per-instance — for strict global enforcement, run a single instance and scale the box.
See Running multiple instances (HA).