VoiceGateway // DOCS

Deployment

Self-host the VoiceGateway fleet collector on a VPS, Railway, or Fly.io: Postgres-backed, HTTPS ingest, dashboard.

Deploy the fleet collector

The collector is a single container that serves POST /v1/ingest (agents push cost telemetry, Bearer-keyed), the dashboard, and the cost API on port 8080. It needs Postgres, a public HTTPS URL, and an ingest key you create.

Request flow: agent -> POST /v1/ingest (Bearer key) -> collector -> Postgres -> dashboard.

Pick a platform

PlatformOps effortHTTPSPostgresCostBest when
VPSHighest (you run TLS)You set up (Caddy)Self-run or NeonCheapestYou already run a box (e.g. your LiveKit server)
RailwayLowestAutomaticOne-click managedHigherYou want zero ops
Fly.ioLowAutomaticFly Postgres or NeonLowMulti-region, near your agents

For a single-node / SQLite setup (just yourself, no fleet), see Docker deployment instead.

Connect your agent

Once the collector has a public HTTPS URL and you have the ingest key, point your agents at it. The explicit form:

Python
from openrtc import AgentPool
from voicegateway.openrtc import VoiceGatewayObserver

pool = AgentPool(observers=[VoiceGatewayObserver(
    project="prod",
    collector_url="https://<your-collector-url>",
    api_key="<your-ingest-key>",
)])

The env-var form: set VOICEGW_COLLECTOR_URL and VOICEGW_API_KEY in the agent's environment and use VoiceGatewayObserver(project="prod"). Non-OpenRTC agents call voicegateway.attach(session, collector_url=..., api_key=...) instead.

Verify

Replace <url> and <key> with your collector's public URL and ingest key:

Shell
curl -fsS https://<url>/health && echo                 # -> ok

# auth gates ingest: no key is rejected, the key is accepted
curl -s -o /dev/null -w "no-key:  %{http_code}  (expect 401/403)\n" \
  -X POST https://<url>/v1/ingest -H 'content-type: application/json' -d '[]'
curl -s -o /dev/null -w "with-key: %{http_code}  (expect 2xx)\n" \
  -X POST https://<url>/v1/ingest -H 'content-type: application/json' \
  -H 'Authorization: Bearer <key>' -d '[]'

Then open the collector URL in a browser for the dashboard.

Notes

::: note The Postgres collector path works as of v0.9.2 (pin >= 0.9.2; the image is mahimairaja/voicegateway:0.9.2). The ingest key must not start with vk_. Only /v1/ingest and /health need to be public; all other endpoints can be firewall-restricted to your internal network. :::

On this page