外观
FreeSWITCH 容器化部署与配置指南
本目录包含基于 WSL /data/docker_fs_server 封装的 FreeSWITCH 容器化服务全套生产资产与配置规范。这里保存的是可直接落地的运行时归档、部署资产与运维文档,不是已废止的源码交付包。
底层镜像基于 Debian 13 (Trixie) 编译并打包了 FreeSWITCH 1.11.2 运行时,内置自研的 mod_audio_fork 实时语音流式识别旁路模块、mod_shout 流式 TTS 播放模块、录音静态托管 Nginx、以及 4 个核心底层 C 共享库资产,支持在任何 Linux 宿主机上一键秒级启动与热重载。
专题文档导航
为方便查阅与精细化维护,本指南按领域拆分为以下独立专题文档(位于 docs/ 子目录下):
| 专题文档 | 核心内容 |
|---|---|
| 🌐 网络模式、IP 绑定与 NAT / STUN 专题 | 强制 Host 模式原理解析、ops_local_ip_v4/ops_db_dsn/esl_host 解耦宏体系、单点修改全局联动生效、XML 预处理器避坑、3 大典型场景(WSL/公网云服务器/WebRTC)对照表 |
| 📞 SIP Profiles 架构、配置与外呼网关专题 | Sofia UA 架构、internal.xml (5060/WebRTC) 与 external.xml (5080) 深度拆解、internal/example.xml 内部级联网关模板实战、外呼 SIP Trunk 网关配置与动态运维指令 |
| 🧩 核心模块库与实时 AI 语音集成专题 | 80+ 个预编译模块全景分类表、mod_audio_fork 流式 ASR 分流 (sherpa-asr-server/funasr-asr-server/stream-vad-proxy)、mod_shout 流式 TTS 播放、mod_local_stream 背景音流混音、模块静态加载与运行时动态热管理 |
⚙️ 模块配置文件详解 (autoload_configs/) | switch.conf.xml 核心并发与 PG DSN、local_stream.conf.xml 背景音与等待音流配置、shout.conf.xml、avmd.conf.xml、callcenter.conf.xml、opus.conf.xml 等 60+ 个配置全解与速查 |
| 🔌 业务集成、拨号计划与录音托管专题 | ESL 安全对接 (8021)、Outbound ESL 业务路由 (dialplan 接入 $${esl_host})、send_silence_when_idle=-1 防 NAT 丢包断流、RTP 端口规划、WebRTC 证书与 Nginx 录音托管 |
1. 压缩包概述与资产组成
归档包名称:docker_fs_server.tar.gz(位于本目录下,压缩包约 20MB,解压展开约 61MB)。
解压后包含以下关键组件:
- FreeSWITCH 1.11.2-trixie:位于
freeswitch-install/,包含完整的 bin、etc(配置文件树,含 179 个 XML 配置文件,其中 137 个附带详尽精准中文参数注释与业务导读,覆盖率达 76.5%)、lib(80+ 个.so动态模块)、share(内置系统音频资产)与 var 运行状态目录; mod_audio_fork.so:位于freeswitch-install/lib/freeswitch/mod/,用于将实时通话音频流无缝旁路推送到sherpa-asr-server(10096) 或funasr-asr-server(10099)(亦可通过stream-vad-proxy:10093前置代理实现毫秒级 VAD 打断与语音切段);deps-lib/专有依赖库:预置 4 个平台专有底层 C/C++ 核心共享库(Debian 官方仓库无匹配包,镜像构建时直接注入/usr/lib/):libks2.so.2:SignalWire 底层核心运行时库;libsignalwire_client2.so.2:SignalWire C 客户端库;libsofia-sip-ua.so.0.6.0:Sofia-SIP 协议栈核心动态库;libspandsp.so.4.0.0:SpanDSP 信号处理与电信级音频/传真编解码库; (注:libwebsockets、libshout、libmp3lame、libmpg123等通用运行时库已通过 Debian Trixie 官方 APT 源安装);
- 音频资产与背景音开箱即用:
- 运行包内已置系统保持音乐(
freeswitch-install/share/freeswitch/sounds/music/,含 8k/16k/32k/48k 完整采样率)及标准英文提示音(en/); - 包内已完整内置办公室环境背景音流配置(
autoload_configs/local_stream.conf.xml中已声明ambient/office/8000与ambient/office/16000)及配套预置音频素材(freeswitch-install/share/freeswitch/sounds/ambient/office/{8000,16000}/),解压后开箱即用,无需额外独立配置或手动复制素材;
- 运行包内已置系统保持音乐(
- Nginx 通话录音托管服务:编排
nginx:alpine容器监听8088端口,只读映射var/recordings,提供录音文件直接在线播放与下载; - 容器自动化编排:
Dockerfile、docker-compose.yml与docker-entrypoint.sh。
2. 压缩包解压与目录结构
在目标 Linux 服务器执行解压:
bash
# 创建部署目录并解压
mkdir -p /data/docker_fs_server
tar -zxvf docker_fs_server.tar.gz -C /data/docker_fs_server
cd /data/docker_fs_server解压后的标准目录结构如下:
text
docker_fs_server/
├── Dockerfile # FreeSWITCH 基础运行时镜像构建文件
├── docker-compose.yml # 容器编排 (Host 模式 + Nginx 录音服务)
├── docker-entrypoint.sh # 容器初始化脚本 (自动处理权限与 PID 锁)
├── README.md # 部署与运维总览导航
├── docs/ # 模块化专题文档目录
│ ├── network-and-nat.md # 专题 1:网络与 NAT / STUN
│ ├── sip-profiles.md # 专题 2:SIP Profiles 与外呼网关
│ ├── ai-and-modules.md # 专题 3:核心模块与 AI 语音集成
│ ├── module-configs.md # 专题 4:模块配置文件详解 (autoload_configs/)
│ └── integration-and-dialplan.md # 专题 5:业务集成与拨号计划
├── deps-lib/ # 4 个专有 C 共享库 (libks2, libsignalwire_client2, libsofia-sip-ua, libspandsp)
├── nginx/
│ └── conf.d/
│ └── recordings.conf # Nginx 录音静态托管配置文件 (8088 端口)
└── freeswitch-install/ # FreeSWITCH 完整运行树 (挂载到容器内)
├── bin/ # freeswitch, fs_cli 等核心二进制
├── etc/freeswitch/ # 配置文件目录 (179 个 XML 文件,137 个全量精细中文注释与业务导读)
│ ├── autoload_configs/ # 模块级配置文件 (event_socket, switch, local_stream, modules 等)
│ ├── dialplan/ # 拨号计划 (default.xml, public.xml)
│ ├── directory/ # 分机用户目录 (default/1000.xml ~ 1019.xml)
│ ├── sip_profiles/ # SIP 协议栈配置 (internal.xml, external.xml, internal/example.xml 等)
│ ├── tls/ # WebRTC / WSS / DTLS-SRTP 证书
│ ├── freeswitch.xml # 主配置入口
│ └── vars.xml # 全局解耦宏变量 (ops_local_ip_v4, ops_db_dsn, esl_host 等)
├── lib/freeswitch/mod/ # 80+ 个预编译模块 (.so)
├── share/freeswitch/sounds/ # 内置系统音频与环境音资产
│ ├── ambient/ # 场景背景环境音目录 (由 mod_local_stream 驱动混音,内置 8k/16k 办公室底噪,开箱即用)
│ └── music/ # 等待音乐 (Hold Music,8k/16k/32k/48k 完整采样率)
└── var/ # 运行时数据 (db, log, run, recordings)3. 极速启动与验证
步骤 1:按需核对核心配置
在启动前,请根据部署环境完成最基础的配置校准:
- 核心网络与服务解耦宏:参考 网络与 NAT 专题 修改
freeswitch-install/etc/freeswitch/vars.xml中的核心变量ops_local_ip_v4(局域网/公网 IP 单点修改,自动联动生效到domain、external_rtp_ip与external_sip_ip),以及esl_host(业务中台地址)与ops_db_dsn(若启用 PostgreSQL 存储); - 分机默认密码:在
vars.xml中修改default_password; - 会议背景音就绪说明:运行包已完整内置办公室环境背景音配置及 8k/16k 预置音频素材,
local_stream://ambient/office/16000与8000开箱即用,无需再执行额外的目录创建与文件复制步骤。如需替换或扩充自定义背景音,可直接向freeswitch-install/share/freeswitch/sounds/ambient/office/{8000,16000}/放入单声道 WAV 文件并执行fs_cli -x "reloadxml";
步骤 2:构建镜像并启动容器
bash
# 1. 构建镜像(基于 Debian 13 Trixie + 注入 deps-lib)
docker compose build
# 2. 后台启动服务 (freeswitch + fs-recordings-nginx)
docker compose up -d
# 3. 查看容器运行状态
docker compose ps步骤 3:健康检查与连通性验证
bash
# 1. 查看 FreeSWITCH 核心运行状态
docker exec -it fs-app fs_cli -x "status"
# 2. 检查关键 AI 模块 mod_audio_fork 是否成功加载
docker exec -it fs-app fs_cli -x "module_exists mod_audio_fork"
# 正常应返回: true
# 3. 查看 SIP Profile 监听状态
docker exec -it fs-app fs_cli -x "sofia status"
# 4. 测试 Nginx 录音服务端口 (8088)
curl -I http://127.0.0.1:8088/recordings/4. 核心端口与防火墙放行清单
由于采用 network_mode: "host",请确保宿主机或云安全组已放行以下端口:
| 端口 / 协议 | 服务 / 模块 | 核心用途 | 访问来源 |
|---|---|---|---|
5060/UDP, 5060/TCP | Sofia internal | 内部分机 SIP 注册与信令 | 办公网 / 局域网 / 软电话 |
5080/UDP, 5080/TCP | Sofia external | 运营商 SIP Trunk 中继与公网进线 | 运营商 / PSTN 网关 |
5066/TCP | WebRTC WS | 浏览器 SIP over WebSocket (未加密) | 内部 Web 前端 |
7443/TCP | WebRTC WSS | 浏览器 SIP over Secure WebSocket | 公网 Web 浏览器 |
8021/TCP | Inbound ESL | FreeSWITCH 管理控制端口 | 仅限 callflow-esl 所在主机 (严格限制) |
30000-30199/UDP | RTP 媒体流 | 动态语音 RTP 传输通道 | 必须全网放行 (0.0.0.0/0) |
8088/TCP | Nginx Recordings | 通话录音 HTTP 静态拉取与播放 | 业务系统 Web 端 |
5. 配置生效机制与热重载指南
得益于 ./freeswitch-install 目录与容器内部的双向实时挂载穿透:
| 变更场景 | 是否需要重启容器? | 操作指令 | 生效耗时 |
|---|---|---|---|
修改 XML 配置文件 (vars.xml, dialplan, directory 等) | ❌ 无需重启 | docker exec -it fs-app fs_cli -x "reloadxml" | < 1 秒(零停机) |
修改 SIP Profile 或网关 (sip_profiles/internal.xml 等) | ❌ 无需重启 | docker exec -it fs-app fs_cli -x "sofia profile internal rescan" | < 1 秒 |
重新加载特定模块 (mod_audio_fork, mod_sofia 等) | ❌ 无需重启 | docker exec -it fs-app fs_cli -x "reload mod_audio_fork" | < 1 秒 |
新增/更新扩展模块 (mod_xxx.so) | ❌ 无需重启 | 拷贝 .so 到 lib/freeswitch/mod/ 后执行 fs_cli -x "load mod_xxx" | < 1 秒 |
调整核心全局参数 / 环境变量 / 挂载配置 (docker-compose.yml, switch.conf.xml 核心端口) | ✅ 重启容器 | docker compose restart | ~ 2 秒 |
| 修改 Dockerfile / 底层 apt 依赖 / deps-lib 动态库 | ✅ 重新构建 | docker compose build && docker compose up -d | ~ 10 秒 |
6. 常用运维指令速查表
6.1 容器生命周期指令
bash
# 后台启动
docker compose up -d
# 停止容器
docker compose stop
# 重启容器
docker compose restart
# 查看容器运行状态与健康检查
docker compose ps
# 查看实时日志(最后 100 行并持续追踪)
docker compose logs -f --tail=100 freeswitch
# 销毁容器(不丢失挂载的配置与数据)
docker compose down6.2 fs_cli 核心诊断指令
在宿主机执行 docker exec -it fs-app fs_cli -x "<COMMAND>":
| 命令 | 功能说明 |
|---|---|
status | 查看 FreeSWITCH 运行状态、在线时长、并发呼叫数、CPU 占用 |
show channels | 查看当前正在进行的通话通道列表与 UUID |
show calls | 查看当前正在进行的双向通话 |
show registrations | 查看当前已注册上线的 SIP 分机与联系人地址 |
module_exists mod_audio_fork | 检查 mod_audio_fork 是否已成功加载(返回 true/false) |
load mod_audio_fork | 动态加载指定模块 |
unload mod_audio_fork | 动态卸载指定模块 |
reload mod_audio_fork | 动态重新加载指定模块 |
reloadxml | 重新解析全部 XML 配置文件(无缝热生效) |
sofia status | 查看所有 SIP Profile 运行状态与监听 IP/端口 |
sofia status profile internal | 查看 internal SIP 端口注册与监听详情 |
sofia status profile external | 查看 external SIP 网关注册状态 |
sofia profile external rescan | 重新扫描并加载 SIP Profile 新增的 Gateway 或配置 |
sofia profile internal restart | 重启 internal SIP profile |
eval $${local_ip_v4} | 评估并打印预处理变量的实际计算值 |
7. 常见问题排查与避坑指南 (FAQs)
Q1: 容器异常重启,日志报错 Cannot lock pid file /usr/local/freeswitch/var/run/freeswitch/freeswitch.pid
- 原因:上次容器未正常停止(如宿主机突然断电或强杀),残留了
.pid锁文件。 - 解决:
docker-entrypoint.sh已内置自动清理机制。若手动排查,可在宿主机执行:bashrm -f freeswitch-install/var/run/freeswitch/*.pid docker compose restart
Q2: 启动报错 Failed to set SCHED_FIFO scheduler
- 原因:Docker 默认限制了容器调整线程实时调度优先级的权限。
- 解决:
docker-compose.yml中已配置cap_add: [SYS_NICE, NET_ADMIN],保证音频流低延迟调度正常运行。
Q3: 运行日志或 SQLite 报错 Permission denied 无法写入
- 原因:容器以
freeswitch独立账户(UID=1000, GID=1000)运行,宿主机目录权限不匹配。 - 解决:
docker-entrypoint.sh启动时会自动执行chown -R freeswitch:freeswitch var/。宿主机手动修复指令:bashsudo chown -R 1000:1000 freeswitch-install/var
Q4: 通话接通后单通或无声(RTP 丢包)
- 排查步骤:
- 详细阅读 网络模式与 NAT 专题;
- 检查
freeswitch-install/etc/freeswitch/vars.xml中的ops_local_ip_v4(或external_rtp_ip)是否正确配置为当前主机的真实可达公网/局域网 IP; - 检查云安全组是否已放行
30000-30199/UDP端口; - 确认
docker-compose.yml使用的是network_mode: "host"; - 检查是否与
coturnrelay 端口范围产生重叠冲突。
Q5: callflow-esl 连不上 FreeSWITCH (ESL Connection Refused / Timeout)
- 排查步骤:
- 执行
docker exec -it fs-app fs_cli -x "status"确认 FreeSWITCH 正常运行; - 检查
autoload_configs/event_socket.conf.xml中的listen-port(默认 8021)和password是否与callflow-esl的config.toml一致; - 检查
listen-ip是否绑定为::或0.0.0.0,而非仅限127.0.0.1(若跨主机访问)。
- 执行
Q6: mod_audio_fork 报错无法连接 ASR WebSocket
- 排查步骤:
- 检查 ASR 服务(
sherpa-asr-server监听 10096 或funasr-asr-server监听 10099)是否已正常启动; - 在宿主机通过
curl http://<asr-host>:10096/health验证健康检查; - 检查
apps/callflow-esl/config.toml中的audioFork.wsUrl是否为 FreeSWITCH 所在网络能够直接访问的地址。
- 检查 ASR 服务(