PLXY AI Call Center control plane ā scenarios, campaigns, calls and auth on PostgreSQL 18
93
Control plane of the PLXY AI Call Center: the REST API behind the studio. It owns scenarios, campaigns, call records, users and tenants, and it is the only service that talks to the database.
Part of a five-image platform that answers calls from a SIP trunk, runs an AI conversation, and transfers to a 3CX agent when the flow says so.
š Deployment guideā Ā· Configuration referenceā Ā· API referenceā
SIP trunk āāā¶ plxy-voice-gateway-media āāā¶ 3CX agents
ā² ESL
plxy-voice-gateway
ā² WebSocket
plxy-callbot-worker
ā² REST (internal token)
browser āāā¶ plxy-callbot-api āāā¶ PostgreSQL 18
ā²
plxy-callbot-ui
| Port | Purpose |
|---|---|
29092 | REST API ā the studio (browser) and the voice gateway both call it |
Everything is environment variables. Nothing has a usable default that would let it start insecurely: the four marked required stop the container rather than guess.
| Variable | Required | What it is |
|---|---|---|
APP_DB_URL / APP_DB_USER | ā | JDBC URL and least-privilege runtime login |
OWNER_DB_URL / OWNER_DB_USER | ā | The role that runs schema migrations at startup |
CORS_ALLOWED_ORIGINS | ā | The studio's public origin. Wrong value = login blocked by the browser |
VGW_BASE_URL | ā | Voice gateway base URL, for placing outbound calls |
APP_DIALER_ENABLED | Campaign dialer loop. Default true | |
REDIS_ENABLED / REDIS_URI | Required only above one replica ā see below | |
RATE_LIMIT_* | Token-bucket limits; sensible defaults for one replica | |
JAVA_OPTS | Default -XX:MaxRAMPercentage=75 |
Every credential is read from a file, never from the environment, so docker inspect stays
clean. Each *_FILE variable points at a mounted file (a Docker/Swarm secret):
OWNER_DB_PASSWORD_FILE Ā· APP_DB_PASSWORD_FILE Ā· JWT_SECRET_FILE Ā·
INTERNAL_API_TOKEN_FILE Ā· VGW_CONTROL_TOKEN_FILE Ā· APIEXT_SECRET_KEY_FILE
The container refuses to start with a blank JWT secret, an HS256 key shorter than 32 bytes, or a blank internal token ā a blank token would disable service-to-service auth silently.
Run exactly one unless you also set REDIS_ENABLED=true. This service holds the migration
lock and the campaign dialer loop, and its rate limiter and idempotency store are in-process; a
second replica without Redis can place a duplicate outbound call.
This image is one service of a stack ā it needs PostgreSQL 18 and the other four images. Deploy the whole platform with the published Swarm stack files:
git clone https://github.com/SengPhirum/PLXY_AICC.git && cd PLXY_AICC
deploy/swarm/secrets-init.sh callbot prod
TAG=0.1.0 deploy/swarm/deploy.sh callbot prod
Full walkthrough ā carrier trunk, 3CX, firewall rules, first sign-in: https://sengphirum.github.io/PLXY_AICC/setup-guideā
latest tracks the newest release. Pin the version tag (0.1.0) in production, and use the
same tag for all five images ā they ship as one set.
plxy-callbot-uiā Ā·
plxy-callbot-workerā Ā·
plxy-voice-gatewayā Ā·
plxy-voice-gateway-mediaā
Content type
Image
Digest
sha256:c58491be4ā¦
Size
181.3 MB
Last updated
about 1 month ago
docker pull phirumseng/plxy-callbot-api