Run your own hub
The hub is one container with an embedded database on one volume. It needs a hostname with TLS in front, a reverse proxy that passes WebSockets, and outbound HTTPS to the AI provider.
Start it
docker run -d --name be-hub --restart unless-stopped \
-p 8001:8001 -v be-hub-data:/data \
-e PUBLIC_URL=https://hub.[yourdomain] \
-e ADMIN_PASSWORD='…' -e AGENT_TOKEN='…' -e ANTHROPIC_API_KEY='…' \
[image] # [confirm the image name and registry before publishing]Put TLS in front with Caddy, Traefik or nginx, and make sure the proxy passes WebSocket upgrades on /agent. Machines only need outbound 443 to that hostname.
Environment
| variable | purpose | default |
|---|---|---|
| PUBLIC_URL | the address baked into install pages, scripts and agent configuration | required |
| ADMIN_PASSWORD | the admin user's password, applied on every start | generated once and printed if unset |
| ADMIN_API_KEY | the admin user's API key, applied on every start | generated once into the volume if unset |
| AGENT_TOKEN | the enrollment token of the default company on first boot | required on first boot |
| ANTHROPIC_API_KEY | the AI provider key BE AI uses | BE AI off if unset |
| CLAUDE_MODEL, CLAUDE_AUTORUN, CLAUDE_DAILY_RUNS, CLAUDE_DEDUPE_MIN | model, alert-driven runs on or off, cap per company per day, dedupe minutes | sonnet, on, 50, 30 |
| CLAUDE_SCHEDULE_TIME, CLAUDE_SCHEDULE_TZ | default nightly pass time and time zone for companies that set none | 02:00, Australia/Melbourne |
| CLAUDE_PRICE_IN_PER_M, CLAUDE_PRICE_OUT_PER_M, CLAUDE_PRICE_CURRENCY | cost estimates in the console | 3, 15, USD |
| OFFLINE_GRACE_MIN, ALERT_NOTIFY_DELAY_SEC | downtime grace period; delay before the first notification | 5, 60 |
| EMAIL_API_KEY, EMAIL_FROM, EMAIL_API_URL | email alerts | off |
| TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM | SMS and phone-call alerts | off |
| SAMPLE_RETENTION_DAYS, EVENT_RETENTION_DAYS, HOURLY_RETENTION_DAYS | retention | 14, 365, 730 |
| PORT | listening port inside the container | 8001 |
What is on the volume
hub.db (the database, WAL mode), audit.jsonl (append-only audit trail), releases/ (signed agent releases and notes). Back up the volume; a nightly copy of those files is enough. Restore is a copy back.
Upgrades
Pull the new image and restart. Schema changes apply themselves at start. Agents reconnect within two minutes; runs in flight at the moment of restart are closed out and marked, and conversations resume. Pick a quiet time.
Moving from hosted to self-hosted
Ask for a copy of your volume. Start your hub with it, set PUBLIC_URL to the new hostname, and run each company's install line with the apply option on its machines so they point at the new address. Identities and history carry over.
Sizing
A small VM with 2 vCPU and 2 GB of memory serves hundreds of machines. Heartbeats are under 1.5 KB every five minutes; history is rolled up hourly. [Confirm sizing guidance before publishing.]
Try it on one machine first.
The install line takes a minute. Uninstall the agent and you are out.