Files
templates/blueprints/fonoster/docker-compose.yml
Harikrishnan Dhanasekaran 3fcc9f2b93 Feat : Add Fonoster template -#45 (#509)
* feat: Add Fonoster template - open source Twilio alternative

* fixed the build issue

* fixed the service log issue
2025-11-28 01:09:47 -06:00

207 lines
8.0 KiB
YAML

services:
dashboard:
image: fonoster/dashboard:0.15.15
restart: unless-stopped
ports:
- 3030
environment:
- SERVER_DASHBOARD_SESSION_SECRET=${SERVER_DASHBOARD_SESSION_SECRET}
apiserver:
image: fonoster/apiserver:0.15.15
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
- APISERVER_APP_URL=${APISERVER_APP_URL}
- APISERVER_ASTERISK_ARI_PROXY_URL=${APISERVER_ASTERISK_ARI_PROXY_URL}
- APISERVER_ASTERISK_ARI_SECRET=${APISERVER_ASTERISK_ARI_SECRET}
- APISERVER_ASTERISK_ARI_USERNAME=${APISERVER_ASTERISK_ARI_USERNAME}
- APISERVER_AUTHZ_SERVICE_ENABLED=${APISERVER_AUTHZ_SERVICE_ENABLED}
- APISERVER_AUTHZ_SERVICE_HOST=${APISERVER_AUTHZ_SERVICE_HOST}
- APISERVER_AUTHZ_SERVICE_METHODS=${APISERVER_AUTHZ_SERVICE_METHODS}
- APISERVER_AUTHZ_SERVICE_PORT=${APISERVER_AUTHZ_SERVICE_PORT}
- APISERVER_CLOAK_ENCRYPTION_KEY=${APISERVER_CLOAK_ENCRYPTION_KEY}
- APISERVER_DATABASE_URL=${APISERVER_DATABASE_URL}
- APISERVER_IDENTITY_DATABASE_URL=${APISERVER_IDENTITY_DATABASE_URL}
- APISERVER_IDENTITY_ISSUER=${APISERVER_IDENTITY_ISSUER}
- APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=${APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED}
- APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=${APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED}
- APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=${APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION}
- APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL}
- APISERVER_IDENTITY_WORKSPACE_INVITE_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_URL}
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID}
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET}
- APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=${APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED}
- APISERVER_INFLUXDB_INIT_ORG=${APISERVER_INFLUXDB_INIT_ORG}
- APISERVER_INFLUXDB_INIT_PASSWORD=${APISERVER_INFLUXDB_INIT_PASSWORD}
- APISERVER_INFLUXDB_INIT_TOKEN=${APISERVER_INFLUXDB_INIT_TOKEN}
- APISERVER_INFLUXDB_INIT_USERNAME=${APISERVER_INFLUXDB_INIT_USERNAME}
- APISERVER_INFLUXDB_URL=${APISERVER_INFLUXDB_URL}
- APISERVER_LOGS_FORMAT=${APISERVER_LOGS_FORMAT}
- APISERVER_LOGS_LEVEL=${APISERVER_LOGS_LEVEL}
- APISERVER_LOGS_TRANSPORT=${APISERVER_LOGS_TRANSPORT}
- APISERVER_NATS_URL=${APISERVER_NATS_URL}
- APISERVER_OWNER_EMAIL=${APISERVER_OWNER_EMAIL}
- APISERVER_OWNER_NAME=${APISERVER_OWNER_NAME}
- APISERVER_OWNER_PASSWORD=${APISERVER_OWNER_PASSWORD}
- APISERVER_ROOT_DOMAIN=${APISERVER_ROOT_DOMAIN}
- APISERVER_SMTP_AUTH_PASS=${APISERVER_SMTP_AUTH_PASS}
- APISERVER_SMTP_AUTH_USER=${APISERVER_SMTP_AUTH_USER}
- APISERVER_SMTP_HOST=${APISERVER_SMTP_HOST}
- APISERVER_SMTP_PORT=${APISERVER_SMTP_PORT}
- APISERVER_SMTP_SECURE=${APISERVER_SMTP_SECURE}
- APISERVER_SMTP_SENDER=${APISERVER_SMTP_SENDER}
- APISERVER_SIGNALING_SERVER=${APISERVER_SIGNALING_SERVER}
- APISERVER_TWILIO_ACCOUNT_SID=${APISERVER_TWILIO_ACCOUNT_SID}
- APISERVER_TWILIO_AUTH_TOKEN=${APISERVER_TWILIO_AUTH_TOKEN}
- APISERVER_TWILIO_PHONE_NUMBER=${APISERVER_TWILIO_PHONE_NUMBER}
expose:
- 50051
volumes:
- ../files/config/keys:/opt/fonoster/keys:ro
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
autopilot:
image: fonoster/autopilot:0.15.15
restart: unless-stopped
expose:
- 50061
environment:
- AUTOPILOT_AWS_S3_ACCESS_KEY_ID=${AUTOPILOT_AWS_S3_ACCESS_KEY_ID}
- AUTOPILOT_AWS_S3_ENDPOINT=${AUTOPILOT_AWS_S3_ENDPOINT}
- AUTOPILOT_AWS_S3_REGION=${AUTOPILOT_AWS_S3_REGION}
- AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=${AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY}
- AUTOPILOT_CONVERSATION_PROVIDER=${AUTOPILOT_CONVERSATION_PROVIDER}
- AUTOPILOT_KNOWLEDGE_BASE_ENABLED=${AUTOPILOT_KNOWLEDGE_BASE_ENABLED}
- AUTOPILOT_LOGS_FORMAT=${AUTOPILOT_LOGS_FORMAT}
- AUTOPILOT_LOGS_LEVEL=${AUTOPILOT_LOGS_LEVEL}
- AUTOPILOT_LOGS_TRANSPORT=${AUTOPILOT_LOGS_TRANSPORT}
- AUTOPILOT_OPENAI_API_KEY=${AUTOPILOT_OPENAI_API_KEY}
- AUTOPILOT_UNSTRUCTURED_API_KEY=${AUTOPILOT_UNSTRUCTURED_API_KEY}
- AUTOPILOT_UNSTRUCTURED_API_URL=${AUTOPILOT_UNSTRUCTURED_API_URL}
volumes:
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
routr:
image: fonoster/routr-one:2.13.13
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_URL: ${ROUTR_DATABASE_URL}
EXTERNAL_ADDRS: ${ROUTR_EXTERNAL_ADDRS}
LOGS_FORMAT: ${ROUTR_LOGS_FORMAT}
LOGS_LEVEL: ${ROUTR_LOGS_LEVEL}
LOGS_TRANSPORT: ${ROUTR_LOGS_TRANSPORT}
NATS_PUBLISHER_ENABLED: "true"
NATS_PUBLISHER_URL: ${ROUTR_NATS_PUBLISHER_URL}
RTPENGINE_HOST: ${ROUTR_RTPENGINE_HOST}
START_INTERNAL_DB: "false"
CONNECT_VERIFIER_PUBLIC_KEY_PATH: /etc/routr/keys/public.pem
expose:
- 51907
- 51908
ports:
- 5060:5060/udp
- 5060-5063:5060-5063
volumes:
- ../files/config/keys/public.pem:/etc/routr/keys/public.pem
# RTPEngine uses a range of ports to handle RTP traffic. Because exposing a large range of ports
# is not possible in Docker, we need to use network_mode: host.
#
# Unfortunately, network_mode: host is not supported for Windows or Mac.
# In those cases, we need to use a different approach.
#
# By default we are opening a small range of ports (10000-10100) to handle RTP traffic.
# However, this is not enough for production environments.
#
# We recommend that when using Linux you use network_mode: host and remove the ports section.
rtpengine:
image: fonoster/rtpengine:0.3.17
restart: unless-stopped
platform: linux/x86_64
ports:
- 10000-10100:10000-10100/udp
- 8080:8080
environment:
PORT_MAX: ${RTPENGINE_PORT_MAX}
PORT_MIN: ${RTPENGINE_PORT_MIN}
PUBLIC_IP: ${RTPENGINE_PUBLIC_IP}
asterisk:
image: fonoster/asterisk:20
restart: unless-stopped
environment:
ARI_PROXY_URL: ${ASTERISK_ARI_PROXY_URL}
ARI_SECRET: ${ASTERISK_ARI_SECRET}
ARI_USERNAME: ${ASTERISK_ARI_USERNAME}
CODECS: ${ASTERISK_CODECS}
DTMF_MODE: ${ASTERISK_DTMF_MODE}
RTP_PORT_END: ${ASTERISK_RTP_PORT_END}
RTP_PORT_START: ${ASTERISK_RTP_PORT_START}
SIPPROXY_HOST: ${ASTERISK_SIPPROXY_HOST}
SIPPROXY_PORT: ${ASTERISK_SIPPROXY_PORT}
SIPPROXY_SECRET: ${ASTERISK_SIPPROXY_SECRET}
SIPPROXY_USERNAME: ${ASTERISK_SIPPROXY_USERNAME}
expose:
- 6060
postgres:
image: postgres:16.10-alpine3.22
restart: unless-stopped
environment:
PGTZ: UTC
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
TZ: UTC
expose:
- 5432
volumes:
- db:/var/lib/postgresql/data
- ../files/config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
influxdb:
image: influxdb:2.7
restart: unless-stopped
expose:
- 8086
environment:
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_INIT_TOKEN}
DOCKER_INFLUXDB_INIT_BUCKET: calls
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_ORG: ${INFLUXDB_INIT_ORG}
DOCKER_INFLUXDB_INIT_PASSWORD: ${INFLUXDB_INIT_PASSWORD}
DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_INIT_USERNAME}
volumes:
- influxdb:/var/lib/influxdb2
nats:
image: nats:2.11.8
restart: unless-stopped
expose:
- 4222
envoy:
image: envoyproxy/envoy:v1.35.0
restart: unless-stopped
command: ["/usr/local/bin/envoy", "-c", "/etc/envoy/envoy.yaml"]
volumes:
- ../files/config:/etc/envoy:ro
ports:
- 8449:8449
volumes:
db:
influxdb: