This is internal infrastructure inventory. It is the live picture, not a generic shape. Where a detail is not pinned in a repo CLAUDE.md, it is described at the granularity the source supports and not fabricated (notably raw IPs that are not confirmed).
Inventory
Vox runs as several independent, single-tenant deployments. Each has its own VoxBridge API, VoxUI app, VoxCore fleet, MongoDB, and brand. Fleets can span multiple hosts behind an HAProxy ingress.
| Client | Brand | API | App | Fleet hosts | MongoDB | Storage |
|---|
| Aetherix | aetherix | api.vohci.com | app.vohci.com | fleet.vohci.com + fleet2.vohci.com, fronted by HAProxy ingress calls.vohci.com | mongo.vohci.com | Shared DigitalOcean Spaces (SGP1) |
| Ori | oriserve | api-voice-agent.oriserve.com | app-voice-agent.oriserve.com | fleet-1-voice-agent.oriserve.com, fleet-2-voice-agent.oriserve.com | mongo-voice-agent.oriserve.com | Per-fleet local MinIO (localhost:9000, bucket recordings, insecure) |
| Tata AIG | oriserve (Ori theme) | tata-aig.oriserve.com (separate 3-box AWS deployment) | tata-aig.oriserve.com | Dedicated AWS boxes | Dedicated | Per-deployment |
| CX Bridge | cxbridge | api.cxbridge.io | app.cxbridge.io | Single-node DigitalOcean (root@139.59.32.128), 8 workers | Same node | Per-deployment |
| Pelocal | pelocal | api.pelocal.net | app.pelocal.net | GCP India (fleet + api + mongo + sip on this footprint) | mongo.pelocal.net | Per-deployment |
| Novus | novus | novus.vohci.com | novus.vohci.com | Single-node 168.144.125.78, shares the CX-DN fleet/LiveKit | Shared with CX-DN footprint | Per-deployment |
| Credgenics | oriserve (reuses Ori theme) | under oriserve.com | under oriserve.com | AWS Mumbai: vox-box-1 + vox-box-2 + 4 fleet hosts | Dedicated | Per-deployment |
The CLAUDE.md “Current deployments” table may still show CX Bridge and Pelocal as “Needs ledger.” That note is stale — both are deployed. Treat this page as the authoritative inventory.
Fleet topology notes
- Aetherix is the only deployment confirmed to run a multi-fleet HAProxy ingress today. The two fleets (
fleet.vohci.com, fleet2.vohci.com) sit behind calls.vohci.com; the API runs on the fleet-1 box. The HAProxy config is brand-portable via render.sh / add-fleet.sh. See Fleet capacity.
- Ori runs two fleet hosts (
fleet-1, fleet-2).
- Credgenics runs two control boxes (
vox-box-1, vox-box-2) plus four fleet hosts under oriserve.com in AWS Mumbai, reusing the Ori brand theme.
- Tata AIG is a separate 3-box AWS deployment that reuses the Ori theme.
- CX Bridge and Novus are single-node deployments; Novus shares the CX-DN fleet/LiveKit.
- Each fleet host keeps the standard one-call-per-worker shape (nginx
least_conn + max_conns=1, VOXCORE_WORKERS workers on Unix sockets).
Recording storage split
Recording storage mode differs by deployment, and getting it wrong breaks dashboard playback:
| Mode | Used by | Behavior |
|---|
| Shared object storage (DigitalOcean Spaces) | Aetherix | Any host can serve any recording; playback is host-independent. |
Per-fleet local MinIO (localhost:9000, bucket recordings, secure false) | Ori | Recording lives on the fleet host that handled the call; playback is proxied through VoxBridge/VoxCore and depends on the originating host. |
For local-MinIO deployments, the endpoint must be exactly localhost:9000. Private IPs break dashboard playback. Before Ori demos, verify VoxBridge system_settings.minio, fleet-1 /opt/voxcore/.env, and fleet-2 /opt/voxcore/.env agree. The long-term target for Ori is shared object storage so playback no longer depends on the originating fleet host.
Dialler hosts
VoxDialler runs as a separate long-running process per deployment that uses it. Confirmed hosts:
| Client | VoxDialler host |
|---|
| Ori | ubuntu@api-voice-agent.oriserve.com:/opt/voxdialler/ |
| Tata AIG | ubuntu@3.109.53.131:/opt/voxdialler/ |
| Pelocal | tanuj@sip.pelocal.net:/opt/voxdialler/ |
| CX Bridge | root@139.59.32.128:/opt/voxdialler/ |
See VoxDialler overview for the dialling engine itself.
Per-deployment checklist
When standing up or auditing a deployment, the high-leverage items are:
| Item | Why |
|---|
Fleet nginx uses map $http_upgrade | Hardcoded Connection "upgrade" breaks HTTP POST dialout. |
Fleet nginx retries 429 for /attach, /livekit/dialout, /livekit/widget | Short async POSTs spawn background calls; nginx can route to a logically busy worker otherwise. |
| Storage mode matches reality | Shared Spaces vs localhost:9000 local MinIO; mismatched config breaks playback. |
| Brand has its own favicon/logo | Never reuse another brand’s assets as placeholders. |
Only voxcore@*.service runs on fleets | No legacy multi-worker voxcore.service / port 8000. |