reference

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

variablepurposedefault
PUBLIC_URLthe address baked into install pages, scripts and agent configurationrequired
ADMIN_PASSWORDthe admin user's password, applied on every startgenerated once and printed if unset
ADMIN_API_KEYthe admin user's API key, applied on every startgenerated once into the volume if unset
AGENT_TOKENthe enrollment token of the default company on first bootrequired on first boot
ANTHROPIC_API_KEYthe AI provider key BE AI usesBE AI off if unset
CLAUDE_MODEL, CLAUDE_AUTORUN, CLAUDE_DAILY_RUNS, CLAUDE_DEDUPE_MINmodel, alert-driven runs on or off, cap per company per day, dedupe minutessonnet, on, 50, 30
CLAUDE_SCHEDULE_TIME, CLAUDE_SCHEDULE_TZdefault nightly pass time and time zone for companies that set none02:00, Australia/Melbourne
CLAUDE_PRICE_IN_PER_M, CLAUDE_PRICE_OUT_PER_M, CLAUDE_PRICE_CURRENCYcost estimates in the console3, 15, USD
OFFLINE_GRACE_MIN, ALERT_NOTIFY_DELAY_SECdowntime grace period; delay before the first notification5, 60
EMAIL_API_KEY, EMAIL_FROM, EMAIL_API_URLemail alertsoff
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROMSMS and phone-call alertsoff
SAMPLE_RETENTION_DAYS, EVENT_RETENTION_DAYS, HOURLY_RETENTION_DAYSretention14, 365, 730
PORTlistening port inside the container8001

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.