Files
crmdesk/deploy/docker/compose/compose-freeswitch.yaml
2026-09-19 16:35:35 +08:00

107 lines
6.0 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FreeSwitch 语音通话服务(呼叫中心组件,关键字:freeswitch 或组合关键字 call
# 启动方式:./start.sh call ... 或 docker compose --env-file .env -f compose/compose-freeswitch.yaml up -d(在 deploy/docker 目录执行)
# 说明:
# - 仅支持 mysql / postgresql 数据库组合
# - 本地镜像Dockerfile地址:/Users/ningjinpeng/Desktop/git/github/bytedesk-freeswitch/docker/Dockerfile
# https://hub.docker.com/r/bytedesk/freeswitch
# https://github.com/Bytedesk/bytedesk-freeswitch
# - 使用自定义构建的 FreeSWITCH 镜像(支持 ARM64/AMD64
services:
bytedesk-freeswitch:
image: registry.cn-hangzhou.aliyuncs.com/bytedesk/freeswitch:latest
# image: bytedesk/freeswitch:latest
container_name: freeswitch-bytedesk
# restart: always
entrypoint: ["/usr/local/bin/bytedesk-entrypoint.sh"]
# FreeSWITCH 要求 -conf、-log、-db 同时指定;log 目录已挂载到宿主机 deploy/freeswitch/log
command: ["freeswitch", "-nf", "-conf", "/usr/local/freeswitch/conf", "-log", "/usr/local/freeswitch/log", "-db", "/usr/local/freeswitch/db"]
sysctls:
net.ipv6.conf.all.disable_ipv6: "0"
net.ipv6.conf.default.disable_ipv6: "0"
environment:
TZ: Asia/Shanghai
DISABLE_IPV6: "true"
# 默认分机密码(对应 vars.xml 的 default_password
FREESWITCH_DEFAULT_PASSWORD: ${FREESWITCH_DEFAULT_PASSWORD:-123456}
# SIP 注册/鉴权默认域名(对应 vars.xml 的 domain
FREESWITCH_DOMAIN: ${FREESWITCH_DOMAIN}
# 本地 Docker 联调时,通过 entrypoint 覆盖 vars.xml,避免修改同一份 conf 后再推远端
# host.docker.internal 用于容器访问宿主机 HTTP;MRCP/RTP 建议填写宿主机真实可达 IP
FREESWITCH_AI_BOT_BASE_URL: ${FREESWITCH_AI_BOT_BASE_URL:-http://host.docker.internal:9003}
# Qwen-Audio-Realtime 电话实时媒体桥:当前默认关闭;启用前需确认镜像已安装/加载 mod_audio_stream
FREESWITCH_QWEN_REALTIME_MEDIA_BRIDGE_ENABLED: ${FREESWITCH_QWEN_REALTIME_MEDIA_BRIDGE_ENABLED:-false}
FREESWITCH_QWEN_REALTIME_MEDIA_WS_URL: ${FREESWITCH_QWEN_REALTIME_MEDIA_WS_URL:-ws://host.docker.internal:9003/visitor/api/v1/call/voice-agent/qwen-realtime/media?output=mod_audio_stream&events=false&model=qwen-audio-3.0-realtime-plus&voice=longanqian&outputSampleRate=24000}
FREESWITCH_MRCP_SERVER_HOST: ${FREESWITCH_MRCP_SERVER_HOST}
FREESWITCH_MRCP_SERVER_PORT: ${FREESWITCH_MRCP_SERVER_PORT:-1544}
FREESWITCH_MRCP_RTP_IP: ${FREESWITCH_MRCP_RTP_IP}
# 百度 MRCP Server 容器地址(用于 9295/9296/9299 等 baidu profile 测试分机)
FREESWITCH_BAIDU_MRCP_SERVER_HOST: ${FREESWITCH_BAIDU_MRCP_SERVER_HOST:-bytedesk-mrcp}
FREESWITCH_BAIDU_MRCP_SIP_PORT: ${FREESWITCH_BAIDU_MRCP_SIP_PORT:-5060}
FREESWITCH_RECORDINGS_PUBLIC_BASE: ${FREESWITCH_RECORDINGS_PUBLIC_BASE}
# 对外宣告给 SIP/SDP 的地址。局域网硬话机场景应固定为宿主机可达地址,避免容器 NAT/STUN 误判。
FREESWITCH_EXTERNAL_SIP_IP: ${FREESWITCH_EXTERNAL_SIP_IP}
FREESWITCH_EXTERNAL_RTP_IP: ${FREESWITCH_EXTERNAL_RTP_IP}
# ESL 入站口令(与 vars.xml 的 esl_password 对应)
FREESWITCH_ESL_PASSWORD: ${FREESWITCH_ESL_PASSWORD:-123456}
# xml_cdr Basic 凭据密码
FREESWITCH_CDR_PASSWORD: ${FREESWITCH_CDR_PASSWORD:-123456}
# mod_xml_curl 鉴权 token(需与应用侧配置一致)
FREESWITCH_XML_CURL_TOKEN: ${FREESWITCH_XML_CURL_TOKEN:-change_me_in_production}
# Kamailio 中继 IP(写入 ACL 白名单)
FREESWITCH_KAMAILIO_IP: ${FREESWITCH_KAMAILIO_IP:-}
# mod_xml_curl 回源地址(与 XmlCurlController 统一:/visitor/api/v1/xmlcurl
FREESWITCH_XML_CURL_GATEWAY_URL: ${FREESWITCH_XML_CURL_GATEWAY_URL:-http://host.docker.internal:9003/visitor/api/v1/xmlcurl}
# 应用基础地址(用于 cdr_url/user_lookup_url 等派生)
FREESWITCH_API_BASE_URL: ${FREESWITCH_API_BASE_URL:-http://host.docker.internal:9003}
# FreeSWITCH 数据库连接参数(默认对接 bytedesk-mysql
FREESWITCH_DB_HOST: ${FREESWITCH_DB_HOST:-bytedesk-mysql}
FREESWITCH_DB_PORT: ${FREESWITCH_DB_PORT:-3306}
FREESWITCH_DB_NAME: ${FREESWITCH_DB_NAME:-bytedesk_freeswitch}
FREESWITCH_DB_USERNAME: ${FREESWITCH_DB_USERNAME:-root}
FREESWITCH_DB_PASSWORD: ${FREESWITCH_DB_PASSWORD:-r8FqfdbWUaN3}
# WebRTC / RTP 参数(如需 WebRTC 能力,可与 webrtc 关键字组合使用)
FREESWITCH_STUN_SERVER: ${FREESWITCH_STUN_SERVER:-stun:bytedesk-coturn:3478}
FREESWITCH_RTP_START_PORT: ${FREESWITCH_RTP_START_PORT:-16000}
FREESWITCH_RTP_END_PORT: ${FREESWITCH_RTP_END_PORT:-16129}
ports:
- "15060:5060/tcp"
- "15060:5060/udp"
- "15080:5080/tcp"
- "15080:5080/udp"
- "15061:5061/tcp"
- "15081:5081/tcp"
- "15066:5066/tcp"
- "17443:7443/tcp"
- "18021:8021/tcp"
- "18081-18082:8081-8082/tcp"
- "16000-16129:16000-16129/udp"
volumes:
- ../../freeswitch/conf:/usr/local/freeswitch/etc/freeswitch
- ../../freeswitch/conf:/usr/local/freeswitch/conf
- ../../freeswitch/scripts:/usr/local/freeswitch/share/freeswitch/scripts
- ../../freeswitch/bin/bytedesk-entrypoint.sh:/usr/local/bin/bytedesk-entrypoint.sh:ro
- freeswitch_data:/usr/local/freeswitch/db
- ../../freeswitch/log:/usr/local/freeswitch/log
- ../../freeswitch/sounds:/usr/local/freeswitch/sounds
- ../../freeswitch/recordings:/usr/local/freeswitch/recordings
- ../../freeswitch/etc/odbc.ini:/etc/odbc.ini:ro
- ../../freeswitch/etc/odbcinst.ini:/etc/odbcinst.ini:ro
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- bytedesk-network
healthcheck:
test: ["CMD-SHELL", "fs_cli -p $${FREESWITCH_ESL_PASSWORD:-123456} -x 'status' | grep -q 'UP' || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
volumes:
freeswitch_data:
name: bytedesk_freeswitch_data
networks:
bytedesk-network:
driver: bridge