目标机器:39.106.106.246 登录用户: root 任务目标:在 asterisk 运行时下线后,调研部署 FreeSWITCH 并以 ESL + Mock SIP 实现 SIP 对接与运行状态检测。 项目地址: https://github.com/signalwire/freeswitch (容器镜像 safarov/freeswitch = FreeSWITCH 1.10.12) 项目背景:使用 FreeSWITCH 对接 MOCK SIP 服务商,作为AI外呼机器人基础能力底座,使用MOCK对接LLM ASR实现双向语音通信, 本项目仅实现外呼功能,不实现多人房间与呼入功能调研。给出可实现最快水平扩展的结论方案并赋实践证据。给出详细的部署过程文档与系统调优方案。 --- ## 交付状态 (2026-08-31 全部完成) | 目标 | 状态 | 证据 | |---|---|---| | asterisk 运行时下线 | ✅ | ast-* 容器清零, 8088/8089 端口释放; `/opt/asterisk-ari/` 交付物保留 | | FreeSWITCH 部署 (双节点) | ✅ | fs1/fs2 healthy, ESL status UP ×2 (FreeSWITCH 1.10.12), health.sh ok=5 fail=0 | | Mock SIP 对接 (外呼) | ✅ | ESL originate ×2 → INVITE→180→200 OK(PCMU)→ACK, gateway NOREG+ping 探活 ×2 | | 双向语音 (Mock LLM/ASR) | ✅ | `RESULT ... bidirectional=YES` (agent RX 536帧 RMS 8246; provider recv_rtp=533, 双向计数对称) | | 运行状态检测 | ✅ | `scripts/health.sh` 容器+ESL status+gateway+呼叫数, ok=5 fail=0 | | 水平扩展结论+实证 | ✅ | 3 路并发分摊双节点 (INVITE 源 172.18.0.3×2 / 172.18.0.4×1, 呼中 fs1=2 calls/4ch, fs2=1/2), 零配置变更 | | 部署文档+调优方案 | ✅ | 本仓库 `README.md` (§4 部署含 7 处踩坑, §8 sysctl 沿用已应用) | **调研要点 (vs Asterisk/ARI)**: FreeSWITCH 无 externalMedia 式外挂媒体 API —— mock-agent 自身充当 SIP UAS 端点 (FS originate 至 agent 并应答), 控制面走 ESL TCP (单连接命令式) 而非 ARI REST+WS; 水平扩展模型与 Asterisk 相同 (零共享状态节点复制, 不需要 livekit 那样的 Redis)。 **交付物**: 服务器 `/opt/freeswitch-esl/` (compose+conf+mock+scripts+etc-fs 生成器+README), 本地 `deploy/` 同源; 原始任务与完成状态见本文件, 详细文档见 `README.md`。