VoicEra is described here using the C4 model: Level 1 shows the system as one box surrounded by its users and external systems; Level 2 zooms in to the deployable containers; Level 3 opens up the two services that carry the most logic.
Level 1 — System context
Level 2 — Containers
Every box below is a container indocker-compose.yaml, except Chroma — an embedded store on a volume mounted into api. The one-shot minio-init container is omitted; it creates the bucket and exits.
Configuration and control go to the API; live audio goes to the runtime. A call reaches the runtime three ways — a caller dials in, the API dials out, or the dashboard opens a browser call — and all three converge on the same pipeline.
Behind the API sit the workers and the stores. Nothing below is reachable from outside the Compose network:
apps/api is one Python package but three containers — api, arq-worker, and campaign-orchestrator all build from apps/api/Dockerfile and differ only in their command. See Workers and orchestrator.Start-up order
depends_on in docker-compose.yaml enforces this chain:
postgres, redis, and minio gate on healthchecks; the rest start as soon as their dependency starts.
Level 3 — Inside the API
Routers stay thin; the service layer owns the rules. Full route list in the REST API reference.Level 3 — Inside the runtime
The pipeline is nine modules plus three subpackages rather than one function. See Voice pipeline.Deployment topology
The referencedocker-compose.yaml runs everything on one host. For production:
See Production deployment and Public voice URLs.
What changed from the mono repo
VoicEra replaces the earliervoicera_mono_repository. If you know the old system:
Related
- Data flow — what moves where, per scenario
- Voice pipeline — inside a live call
- Services overview — containers versus packages
- Ports and defaults