One-line installer (recommended)
The installer script handles Docker, secrets, image pinning, health checking, and HTTPS in a single command:- Installs Docker if not present (with confirmation)
- Generates and persists the ingest key and Postgres password on first run, reuses them on later runs (no password-regen footgun)
- Pins the image to the latest release version (never
:latest) - Health-checks the container before returning
- Installs Caddy and issues a certificate automatically if ports 80/443 are free and a domain is given; otherwise prints a reverse-proxy snippet for your existing proxy
/opt/voicegateway/voicegw.yaml by default). Use it as the api_key when connecting agents.
Manual setup
Prerequisites: Docker and Compose installed (curl -fsSL https://get.docker.com | sh).
1
Download Compose file and generate secrets
2
Create the ingest key
The ingest key must not start with
vk_.3
Start the stack
postgres service and set VOICEGW_DB_URL=postgresql+asyncpg://... (for example a Neon URL) on the collector service.Expose over HTTPS
Fresh box (install Caddy)
Install Caddy via the official apt repository:/etc/caddy/Caddyfile:
127.0.0.1:8080:8080 so only Caddy is internet-facing. Point a DNS A record collector.<your-domain> at the VPS IP.
Reuse an existing reverse proxy
If the box already runs a reverse proxy on 80/443 (for example a self-hosted LiveKit server whose Caddy runs with host networking), it reaches the daemon atlocalhost:8080 with no extra wiring: the daemon publishes 8080 on the host, and a host-networked proxy shares the host’s network namespace. Add a vhost or TLS-SNI route for collector.<your-domain> pointing to localhost:8080. Back up the proxy config first and reload it gracefully.
For LiveKit’s layer-4 Caddy (structured caddy.yaml), add a TLS-SNI route and include the hostname in apps.tls.certificates.automate:
caddy reload --config /etc/caddy.yaml --adapter yaml (validates before applying; LiveKit stays up if the config is invalid).
Security
Verify
Follow the steps at Verify, usinghttps://collector.<your-domain> as the daemon URL and the ingest key printed during setup.
Connect your agent
See Connect your agent. Usehttps://collector.<your-domain> as collector_url and the ingest key as api_key.