Self-hosting
Deploy with Docker Compose
Production requires HTTPS, PostgreSQL, a stable auth secret and working SMTP when email verification is enabled.
Production baseline
- Docker Compose 2.24.4+, a stable hostname and inbound TCP 80/443.
- Persistent storage sized for PostgreSQL, audit records and artifacts.
- A tested SMTP sender before email verification is required.
- An encrypted backup location for the database and deployment secrets.
Terminal
cp .env.example .env
openssl rand -hex 48
openssl rand -hex 32
docker compose --env-file .env -f deploy/compose.yaml up -d --buildRequired configuration
- ADC_PUBLIC_URL
- HTTPS origin
- ADC_AUTH_SECRET
- Stable secret, 32+ characters
- ADC_DATABASE_PASSWORD
- PostgreSQL password
- ADC_SMTP_URL
- Required when email verification is enabled
- ADC_TRUSTED_PROXIES
- Only the reverse-proxy addresses allowed to supply client IP headers.
- ADC_ANALYTICS_*
- Leave unset for the default zero-external-analytics self-hosted behavior.
Verify the deployment
Terminal
curl -fsS https://devices.example.com/health
docker compose --env-file .env -f deploy/compose.yaml ps
docker compose --env-file .env -f deploy/compose.yaml logs --tail=100 control-planeThen create one account, pair a device and complete one read-only invocation. Infrastructure health alone does not prove that authentication, WebSocket upgrades and dispatch all work.
Data and trust boundary
PostgreSQL stores accounts, sessions, authorizations, dispatches, audit records, receipts and current artifact blobs. Device private keys and local Provider secrets must remain on each device.
Back up PostgreSQL and the stable auth secret together. A database restore can resurrect credentials revoked after the backup, so rotate affected access during incident recovery.