Skip to main content
Version: 0.9.12

Platform overview

The platform section is for operators running their own Delphi deployment. A deployment is a small set of Docker Compose services running on dedicated cloud instances connected by a private network.

If you are bringing up a new deployment for the first time, start with Getting started. If you operate an existing deployment, jump to the service operations page for the role you are working on.

High-level diagram

Janus and coturn are present only when the Featurewebrtc flag is enabled. SIP-only TelPro deployments keep Kamailio and RTPEngine, but do not need the Janus WSS/RTP ports or TURN/TURN-relay ports. Keep this HLD as the flow map; use Service operations as the central port checklist and TelPro operations for the exact TelPro firewall rules.

Connection matrix

The table below is the operator-facing HLD in words: source, destination, protocol or port, and why the connection exists. Use it when reviewing inbound private-network rules or explaining service-to-service traffic.

SourceDestinationProtocol / portReason
SIP carrier / endpointTelPro KamailioSIP 5060 / 5061Inbound and outbound SIP signaling.
SIP carrier / endpointTelPro RTPEngineUDP 20000–40000Carrier-facing RTP media.
BrowserWeb CaddyHTTPS 443TelWeb dashboard and SigNoz reverse proxy.
Browser / WebRTC clientTelPro Janus / coturnWSS 443, TURN 3478 / 5349, relay UDP 49152–51152WebRTC signaling and NAT traversal when webrtc is enabled.
Browser / API clientManaged load balancer → TelAPIHTTPS 443 to LB, then HTTP/WebSocket 3001 to API instancesREST API and browser WebSocket sessions.
TelPro KamailioVoice TelSysSIP 5080Routes calls from the edge gateway into the Voice fleet.
TelPro RTPEngineVoice TelSysUDP 10000–11999Private RTP leg between the media proxy and Asterisk.
Voice TelSysVoice TelPhiWebSocket 12001ExternalMedia stream for AI conversation audio.
Voice TelPhiVoice TelSysARI 8088Call control, bridges, transfers, recording control.
Private servicesSquidHTTP proxy 3128Egress for image pulls, AWS APIs, SMTP, and AI/provider APIs.
API / Web / Voice / OpsDatabase PostgreSQL5432 or PgBouncer 6432Runtime configuration, tenants, conversations, jobs, and service metadata.
API / Web / Voice / Ops / TelProDatabase Redis6379 or TLS 6380Runtime cache, streams, routing state, heartbeats, and leader election.
API / VoiceMediaHTTPS 443Private generated-audio cache for reusable TTS media.
All servicesSigNozOTLP 4317 / 4318Logs, metrics, and traces.

Service types

Every deployment is built from the same nine service roles plus a bastion. Feature flags can add or remove optional containers inside a role, but the role boundaries stay the same. They group into four roles by surface area:

RoleServicesWhat they doNetwork
EdgeTelPro, WebTerminate the public internet — SIP, optional WebRTC, dashboard.Public IP
AppAPI, Voice, OpsStateless application logic — call processing, REST/WS API, jobs, scaling.Private only
StatefulDatabase, Media, SigNozPersist data — Postgres + Redis, TTS audio, observability store.Private, volumes
Egress / mgmtSquid, BastionOutbound proxy for private VMs and SSH jump host.Public IP
ServiceWhat it doesPublicStatefulOperations page
TelProPublic-facing telephony gateway — Kamailio SIP and RTPEngine media, plus Janus / coturn when webrtc is enabled.Yes (static)NoTelPro
WebTelWeb dashboard (Next.js) behind Caddy with auto-HTTPS. Also reverse-proxies SigNoz.Yes (static)NoWeb
APITelAPI Fastify HTTP/WebSocket server. Multiple instances behind a managed load balancer with sticky sessions.Via LBNoAPI
VoiceAsterisk PBX (TelSys) plus the AI conversation engine (TelPhi). Horizontally scalable.NoNoVoice
DatabasePostgreSQL 17 and Redis 7 (with optional pgbouncer). Attached block storage at /mnt/data.NoYesDatabase
MediaCaddy + media-upload — private HTTPS TTS audio cache. Optional but recommended.NoYesMedia
OpsScaler (autoscales API and Voice) and Tasker (background jobs, cron, DB backups, email).NoNoOps
SigNozOpenTelemetry backend (logs, metrics, traces). Static private IP 10.0.1.10. Public via Web/Caddy.Via WebYesSigNoz
SquidHTTP/HTTPS forward proxy for every private VM that has no public IP — ECR pulls, AWS APIs, AI providers, SMTP relay.Yes (private clients)NoSquid
BastionSSH jump host. Only public path into the private network for operators.YesNo

Resource sizing

See Provision instances — suggested instance sizes for vCPU and RAM. Database, SigNoz, and Media also need attached persistent volumes — volume sizes and (for SigNoz) retention targets are on each service's operations page.

State and persistence

All services except Database, Media, and SigNoz are stateless — they can be destroyed and recreated without data loss. The three stateful services keep their data on attached block volumes. Postgres is the single source of truth; everything else is recoverable from it.

Scalability

API and Voice are horizontally scalable; TelPro, Web, Database, Media, SigNoz, Ops, and Squid run as a single instance per deployment. The Ops Scaler can drive cloud-provider APIs to add or remove API/Voice instances based on utilization.

Call paths in one minute

For the WebRTC variant, when webrtc is enabled, the browser opens WSS to Janus on TelPro, Janus bridges WebRTC ↔ SIP locally to Kamailio, and the rest of the path is the same. WebRTC clients fall back to coturn when direct UDP is blocked.

For outbound transfers, TelPhi asks TelSys to originate via ARI, Kamailio looks up the egress trunk for the original DID in Redis, and routes to the carrier — see TelPro operations.

Where the data lives

  • PostgreSQL is the source of truth for runtime configuration and business data: teams, users, apps, flows, agents, provider choices, STT/TTS/LLM settings, ingress and egress SIP trunks, numbers, header rules, server groups, autoscaling config, notification templates, cron schedules, platform audio metadata, recording-bucket metadata, conversations, calls, and job state. TelWeb, TelAPI, TelPhi, Tasker, and Scaler read and write it for their own work.
  • Redis holds short-lived runtime state: Kamailio dialog and dispatcher state, egress trunk caches, TelAPI channel streams, Voice heartbeats and health metrics, TelWeb / TelAPI runtime caches, Scaler and Tasker leader election, and consistency-check state. Redis data improves routing and coordination, but Postgres remains the durable source of truth.
  • Media volume holds generated TTS audio bytes; the metadata for each blob lives in Postgres (tts_media_cache).
  • SigNoz / ClickHouse holds logs, metrics, and traces. Operationally important but not mission-critical — losing it does not affect call processing.

What's in this section

  • Getting started — bring up a brand-new deployment from zero in six steps.
  • Configuration — the layered config model: bootstrap .env, AWS SSM, AWS Secrets Manager, vars.yaml, and how fetch-env.sh resolves them at boot.
  • Service operations — per-service runbook, configuration, and troubleshooting (tabbed pages per role). For first-boot mechanics, see Bootstrap and init.
  • Observability — how logs, traces, metrics, health signals, dashboards, alerts, and call debugging flow through SigNoz.
  • Security — internal Postgres + Redis TLS rollout and AWS IAM wiring.
  • Feature flags — what each flag turns on or off across the stack and what changes when you flip one.
  • Third-party version sources — every pinned upstream version (Kamailio, Asterisk, Postgres, etc.), the file it lives in, and the release-day refresh process.
  • Release notes — v0.9.11 — product changelog for the current pinned release plus the Operator rollout checklist for deployments (see that page’s bottom section).