部署与运行手册
面向本地联调和生产前部署的统一说明。默认按“环境准备 → 启动顺序 → 健康检查 → 服务管理”执行,先对齐基础能力,再做联通验证,再落地上线。
跨主机调用方向、监听 / 连接 / 公开地址的区别、端口放行、反向代理、WebRTC、FRP 和多 FreeSWITCH cell 配置统一见部署网络拓扑与配置手册。本文保留 构建、启动顺序和通用运行检查,不重复维护网络拓扑事实。
环境与前置条件
必备
- Bun 1.x
- PostgreSQL:线上生产环境统一使用核心数据库
freeswitch,本地开发环境默认使用隔离库dev-freeswitch;统一承载callflow/callout业务 Schema(线上另含 FreeSWITCH 软交换状态的publicSchema) - Rust 稳定版工具链(1.80+,通过 rustup 安装),用于构建 ONNX 平台各 Rust 语音服务;Windows 上需配合 MSVC 工具链与 PowerShell 7 (
pwsh),Linux 上需基础编译工具 - FreeSWITCH 1.11.2 +
mod_audio_fork(ASR 通路要求) - 若使用流式 TTS,
ffmpeg在服务运行路径可见(或配置mp3EncoderPath) - 若使用 NLU / Chat / Script 能力,需可访问 OpenAI 兼容推理后端(GPUStack / vLLM / Ollama 等), 并准备好
callout-server中配置的模型(出厂默认 NLU / Chatqwen3.5-2b、Scriptqwen3.6-27b-fp8)
语音模型资产一键同步 (ModelScope + uv)
由于语音推理模型(FunASR、Sherpa-ONNX、Silero VAD、Kokoro、Matcha、Emotion 等)总体积约 4.37 GB,项目镜像与 Git 仓均不包含大模型二进制。在目标机器(开发机、WSL 集群或 Debian 12 生产宿主机)上,通过内置的 onnx-platform/models/model-down/ 脚本基于 uv 与 ModelScope (魔搭社区) 一键下载:
bash
# 1. 确保已安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
# 2. 进入工具目录并同步依赖
cd onnx-platform/models/model-down
uv sync
# 3. 拉取全量模型到指定部署目录 (如 WSL/Linux 生产挂载路径 /data/ai-voice/models)
uv run download.py --model-id wlf213/ai-voice-platform-models --target-dir /data/ai-voice/models
# 本地开发时默认拉取至上一级目录 (即还原为 onnx-platform/models/)
uv run download.py --model-id wlf213/ai-voice-platform-models网络与地址
默认端口与服务名称以服务目录为唯一来源,本文不再维护重复端口表。跨机部署不要直接把 127.0.0.1 替换成同一个 IP,先按 逐连接矩阵确认真正的调用者。
- 远端联调场景必须保证
apps/callflow-esl/config.toml中freeswitch.callbackHost对应 的地址可被 FreeSWITCH 访问。
启动与启动顺序
基础方式(一次启动)
bash
bun install
bun run dev默认并发进程及标签以服务目录为准。
手工启动(按顺序)
bash
bun run dev:asr
bun run dev:tts
bun run dev:emotion
bun run dev:audio-fork:air
bun run dev:callflow-esl
bun run dev:callflow-server
bun run dev:callout-server
bun run dev:callflow-webpage
bun run dev:callout-webpage推荐顺序(排障更稳定)
buildONNX 语音服务并确认目标平台目录(dist/<win_x64|linux_x64>)已生成交付产物 Windows (PowerShell 7):cd onnx-platform\sherpa-asr-server; pwsh .\build.ps1cd onnx-platform\sherpa-tts-server; pwsh .\build.ps1cd onnx-platform\emotion-analysis-server; pwsh .\build.ps1cd onnx-platform\funasr-asr-server; pwsh .\build.ps1Linux x64:bash onnx-platform/sherpa-asr-server/build.shbash onnx-platform/sherpa-tts-server/build.shbash onnx-platform/emotion-analysis-server/build.shbash onnx-platform/funasr-asr-server/build.sh
- 先启动基础语音服务进程:
asr、tts、emotion、audio-fork - 启动 Bun 服务:callflow-esl / callflow-server / callout-server(按需再启动可视化 web)
- 校验各健康接口(见下)
注意:
bun run dev:asr/tts/emotion调用的是各子项目的run-server.ts,从各自的dist/<win_x64|linux_x64>拉起交付产物;若编译产物不存在会直接退出,建议先执行对应build.ps1或build.sh。
生产部署方式
deploy/ 保存当前生产(阿里云公网节点)与本地运行环境(WSL /data/ai-voice)的部署配置、 服务定义与编排文件:
text
deploy/
├── aliyun/ # 阿里云公网节点:Nginx、callflow-esl、FRPS、coturn、文档站、FreeSWITCH 现场配置
├── freeswitch/ # FreeSWITCH 配置参考树(新环境合并部署用基线)
├── wsl-docker/ # WSL 计算集群:Dockerfile、docker-compose.yml、各服务 config、FRPC
└── softphone-webrtc-ice-turn-guide.md这些内容是当前拓扑使用的运行产物与部署资产,不是已废止的源码交付包,也不是通用的一体化发行包:镜像不含业务二进制与模型 (均为外部挂载),systemd unit、Compose 与 Nginx 配置中的地址、端口、路径和凭据都需要按 目标环境重新校准。部署方仍需自行完成:
- 构建或准备 Bun 后端、Quasar 前端和 ONNX 平台 Rust 服务的目标平台产物;WSL Linux x64 的 Bun 后端必须分别执行
bun run --cwd apps/<服务名> build:linux(例如callflow-server与callout-server),产物位于apps/<服务名>/dist/linux_x64/; - 安装并维护 PostgreSQL、Redis、OpenAI 兼容推理后端、FreeSWITCH、ffmpeg 等运行依赖;
- 把
deploy/aliyun/*/与deploy/wsl-docker/configs/*.toml复制到各服务实际读取的位置并按目标环境修改;ONNX ASR、TTS、Emotion 均从各自dist/linux_x64/自包含交付目录完整分发,并按deploy/wsl-docker/docker-compose.yml(参考 WSL 集群部署)核对宿主目录和模型挂载; - 按 FreeSWITCH 安装方式部署
deploy/freeswitch/的容器化基线包,或从deploy/aliyun/freeswitch/现场快照逐项合并;无论哪种方式都不要覆盖现场的网关、证书和号码配置; - 使用 systemd、Docker Compose 或既有运维平台管理启动顺序、重启、日志和开机自启。
阿里云节点与 WSL 集群的逐步操作分别见 ../deploy/aliyun/README.md 与 ../deploy/wsl-docker/README.md; 生产环境实机与具体检查项见 production-deployment.md, 完整网络设计见network-topology-deployment.md, deploy/ 目录边界见 ../deploy/README.md。
两个 Quasar 前端的 API 根地址都在构建期注入,默认值为同域 /api。默认配置下从仓库 根目录构建:
bash
bun run --cwd apps/callflow-webpage build
bun run --cwd apps/callout-webpage build产物分别位于 apps/callflow-webpage/dist/spa/ 与 apps/callout-webpage/dist/spa/(其中 callout-webpage 已包含「AI 策略中心」三栏话术策略工作台)。使用默认值时,生产环境需要为每个前端站点配置同域反向代理:
- callflow 前端站点的
/api转发到callflow-server(默认127.0.0.1:9913); - callout 前端站点的
/api转发到callout-server(默认127.0.0.1:9920)。
代理必须保留 /api 路径。多个前端若同时部署,需使用能够分别配置 upstream 的不同 站点或 origin;同一 origin 下的同一个 /api 无法同时转发到多个后端。
需要自定义代理前缀或浏览器可访问的后端地址时,在构建前分别设置 VITE_CALLFLOW_API_BASE_URL 和 VITE_CALLOUT_API_BASE_URL。 值推荐明确以 /api 结尾;API 根地址变化后必须重新构建并替换对应前端产物。
部署配置样例(deploy/aliyun/、deploy/wsl-docker/configs/)重点校准:
callflow-esl.config.toml:freeswitch.callbackHost、audioFork.wsUrl、TTS endpoints、recording.directory、businessConfig["llm-chat-business"]的endpoint / apiKey / model / requestTimeoutMs(endpoint 是 OpenAI 兼容后端的完整/v1/chat/completions地址)、[callout]的baseUrl / token / requestTimeoutMs(指向 callout-server 的9920)、businessConfig["kb-audio-chat-business"]的endpoint / strategy / token;该 endpoint 指向 callout-server 的/api/ai/chat/completions,样例策略为kb-mockcallflow-server.toml:FreeSWITCH / callflow 数据库、databases.freeswitch.configDir(FreeSWITCH 配置根目录)、callflowEsl.baseUrl、管理台鉴权与日志配置callout-server.toml:media.freeswitchRecordingBaseUrl、media.emotionAudioBaseUrl、FreeSWITCH inbound ESL、可选的[llm]推理配置(留空由数据库callout.ai_llm_configs中启用的记录提供)sherpa-tts-server.toml:server.publicBaseUrl,必须是 FreeSWITCH 可访问地址
样例中可能包含面向特定部署目录的相对路径和示例地址,不能直接视为生产默认值。数据库密码、 鉴权 token 和云端凭据应通过环境变量或运维密钥系统注入,不要提交真实值。
云端兼容网关(按需)
bun run dev:aliyun-speech(10097/9081)bun run dev:azure-speech(10098/9082)
健康检查清单(启动后必须执行)
建议按依赖顺序检查,避免上游未就绪导致下游误判:
GET /health:sherpa-asr-server(10096 / 10095)、funasr-asr-server(10099 / 10094)、sherpa-tts-server(9080)、emotion-analysis-server(9090)apps/callout-server:GET http://127.0.0.1:9920/health,以及分别携带 token 的 NLU、Chat 与 Conversation capabilitiessherpa_tts_server:POST /tts可返回wavUrl,并确认 FreeSWITCH 能访问该 URLsherpa_asr_server:通过 WebSocket 客户端工具执行一次连接与transcription可见性测试apps/callflow-esl:配置加载、/outbound-calls与POST /freeswitch/reloadxml可用apps/callflow-server:/health与 FreeSWITCH DB 视图可读apps/callout-server:/health、数据库与外呼 dispatcher 可用apps/callout-server:GET /api/media/config返回浏览器可访问的录音和情绪音频 baseUrl
启用 kb-audio-chat-business 时,还需直接向其 businessConfig 子项的 endpoint 验证一次带 strategy 的 action=start 和 action=query,并确认返回 answerText 后本地 TTS 可播放。
详细模块级验证步骤,请继续参考各模块 README 与
docs/troubleshooting.md。
服务关闭(可选)
统一脚本启动(bun run dev)在单个终端中托管默认启动组;关闭时对该终端执行 Ctrl+C 即可触发子进程退出。默认进程范围见服务目录。 如改为拆分启动,建议:
- 先确认无活跃通话再停止服务;
- 按
Ctrl+C逐个关闭子进程; - Windows 可用
Get-Process+Stop-Process做补充清理,例如:
powershell
Get-Process | Where-Object { $_.ProcessName -in @('sherpa_asr_server','funasr_asr_server','sherpa_tts_server','emotion_analysis_server','audio_fork_server','air','node','bun') } | Format-Table Id,ProcessName关闭后再确认端口回收:
powershell
netstat -ano | Select-String '10096|10095|10099|10094|10091|9080|9090|9911|9912|9913|9920|19913|19920'服务配置建议(最小变更)
listenHost/ 监听 host 建议按部署网卡绑定,不要默认只绑127.0.0.1影响联通。publicBaseUrl/publicUrl等需要 FreeSWITCH 可达,不要使用本机只回环地址。- 数据库密码与签名密钥不落到版本库,优先环境变量或运维注入。
- 语音服务建议固定日志目录并结合宿主日志采集(可按天滚动)。
服务管理要求(仓库约定)
- 所有服务可重复启动与重启;测试结束后请关闭本地手动启动实例,避免端口/资源残留。
- 语音服务为前台常驻,
Ctrl+C是常见停止方式;停止前建议先确认无活跃通话/长连接。
升级与切换建议
- 新增/升级模型后,先在
demo或单次联调脚本验证识别率与延迟,再切换线上 profile。 - 调整端口、鉴权、
wsPath、mp3EncoderPath、freeswitch.callbackHost时,先补齐停机窗口和回滚方案。 - 涉及数据库 Schema 升级时,建议先执行数据库备份,并通过
db:push完成表结构同步后再重启对应服务。
快速排障入口
- 模块级故障排查:
troubleshooting.md - 模块 README 快速入口:
apps/callflow-esl/README.mdonnx-platform/sherpa-asr-server/README.mdonnx-platform/sherpa-tts-server/README.mdonnx-platform/emotion-analysis-server/README.mdonnx-platform/funasr-asr-server/README.mdapps/callout-server/README.md