Skip to content

Start Initialzr

Five short steps — release, addresses, carrier and 3CX, media, AI providers. Answer what only you can know, and this generates the two environment files your deployment needs and the exact commands for each host, updating as you go.

Everything runs in your browser. Nothing you type is sent anywhere: these answers describe a private network topology, and they stay on this device.

Release
Environment
Hosts

Two hosts is the recommended layout: the telephony half sits in the DMZ and exactly three ports cross the boundary. A single host runs both stacks for a pilot.

EXTERNAL_IP=auto lets FreeSWITCH probe its own address, which is wrong behind 1:1 NAT: calls connect and one side hears nothing. Set the public IPv4 if the host is NATed.

# CALLBOT stack — production, generated by the PLXY Start page.
#   save as deploy/swarm/env/callbot.prod.env   (gitignored)
#   deploy/swarm/deploy.sh callbot prod
#
# No credentials here. Every password and token is a Swarm secret, generated on the host by
# deploy/swarm/secrets-init.sh callbot prod.

# --- images ---------------------------------------------------------------------------
REGISTRY=docker.io/phirumseng
TAG=0.1.0

# --- cross-stack address: the voice gateway, as reached FROM this host -----------------
VGW_BASE_URL=http://dmz-gw.internal:8080

# --- studio: both resolved by the BROWSER, not by any container -----------------------
PUBLIC_API_BASE=https://api.example.com
CORS_ALLOWED_ORIGINS=https://studio.example.com

# --- published ports ------------------------------------------------------------------
API_PUBLISHED_PORT=29092
WORKER_PUBLISHED_PORT=29192
UI_PUBLISHED_PORT=9092

# --- AI providers ---------------------------------------------------------------------
# The bundled simulator: deterministic, no credentials, no contracts.
AI_PROVIDER=simulator

# --- behaviour and sizing -------------------------------------------------------------
DIALER_ENABLED=true
WORKER_REPLICAS=2
UI_REPLICAS=2
POSTGRES_MEMORY=2g
API_MEMORY=1g
WORKER_MEMORY=768m
UI_MEMORY=512m

Generated in your browser. Nothing here is sent anywhere; your answers are remembered only in this browser.

What you need before you begin

HostsTwo, each running Docker Engine with Compose v2 — one for the application, one in the DMZ for telephony. A single host runs both for a pilot.
From your carrierThe SBC addresses to allow, and whether the trunk is IP-authenticated or registers with credentials
From your 3CXA SIP trunk pointing at this deployment, and the extension or queue numbers transfers should reach
From your networkThe public IP of the telephony host, and the firewall rules below

There is nothing else to install. Every image compiles its own artifact in a build stage, so no host needs a JDK, Maven or Node — and the images are published, so a deployment host builds nothing at all.

What the generator does not give you

Passwords and tokens. They are generated on the host by secrets-init.sh and held as Docker Swarm secrets, never written into a file and never passed through the environment. A page that handed you credentials over the web would be the one genuinely dangerous thing it could do.

The stack files. docker-compose-callbot.yml and docker-compose-gateway.yml come from the repository and are the same in staging and production. Only the environment file changes.

bash
git clone https://github.com/SengPhirum/PLXY_AICC.git
cd PLXY_AICC

Then

  1. Save each generated file where the tab says, on the host it belongs to.
  2. Run that host's commands.
  3. Open the studio, change both seeded passwords, and place a test call.

The deployment guide covers all of it in full: why the two stacks are separate Swarms, which three ports cross the boundary, how rolling updates and rollback behave, and what to check when a call connects but nobody can hear anything.

PLXY AI Call Center — built as five separated projects and one shared schema.