Debian 12 安装 MiroTalk SFU 2.6.88 指南
Debian 12 源码方式部署 MiroTalk SFU 2.6.88:编译依赖、Node.js 24、mediasoup worker 编译实测、systemd 常驻与防火墙放行,全部命令带真实回显。
Debian 12 安装 MiroTalk SFU 2.6.88 指南
本文从零开始,在一台全新 Debian 12 (bookworm) 服务器上以源码方式部署 MiroTalk SFU 2.6.88:安装系统依赖、Node.js 24、编译 mediasoup worker、首次启动与验证。全部命令均在实际环境中执行并逐行记录回显,实测环境为 x86_64、6 核 CPU、18 GB 内存。
版本锚点:MiroTalk SFU 2.6.88(master 分支
package.json,2026-10-26 实查);mediasoup server 3.31.0 / client 3.25.3(启动日志实查)。
一、准备服务器
以 root 或具备 sudo 权限的用户登录,先更新索引并安装基础工具:
apt-get update
apt-get install -y curl git openssl
确认磁盘剩余空间不少于 5 GB(源码 + node_modules 约占 1.5 GB,编译中间产物另需 2 GB 峰值):
df -h /
二、安装编译依赖(关键步骤)
mediasoup 的 worker 是 C++ 程序,npm install 阶段会尝试下载官方预编译二进制,下载失败时自动回退到本地源码编译。因此构建工具链必须齐全:
apt-get install -y build-essential python3 python3-pip ffmpeg tzdata
三个依赖缺一不可,实测两次踩坑都源于此:
-
缺
python3-pip:mediasoup 的 postinstall 脚本要执行python3 -m pip install invoke安装编译任务器,pip 缺失时安装直接中断,回显如下:npm error /usr/bin/python3: No module named pip npm error npm-scripts.mjs [ERROR] [postinstall] executeCmd() failed, exiting: Error: Command failed: "python3" -m pip install --upgrade --no-user --target ".../node_modules/mediasoup/worker/pip_invoke" invoke npm error A complete log of this run can be found in: /root/.npm/_logs/2026-10-26T07_22_33_622Z-debug-0.log EXIT=1 -
预编译二进制下载失败不算失败:网络不佳时
downloadPrebuiltWorker()报ECONNRESET,但脚本会打印couldn't fetch any mediasoup-worker prebuilt binary, building it locally后转入本地编译,这正是必须装 build-essential 的原因:npm error npm-scripts.mjs [INFO] [postinstall] getWorkerPrebuildTarName() [workerPrebuildTarName:mediasoup-worker-3.31.0-linux-x64-kernel7.tgz] npm error npm-scripts.mjs [INFO] [postinstall] downloadPrebuiltWorker() [workerPrebuildTarUrl:https://github.com/versatica/mediasoup/releases/download/3.31.0/mediasoup-worker-3.31.0-linux-x64-kernel7.tgz] npm error npm-scripts.mjs [INFO] [postinstall] couldn't fetch any mediasoup-worker prebuilt binary, building it locally npm error npm-scripts.mjs [INFO] [postinstall] buildWorker() -
libstdc++ 版本冲突:如果编译出的
flatc报GLIBCXX_3.4.32 not found,先检查是否被LD_LIBRARY_PATH引到了旧版 libstdc++(实测本机正是被第三方软件注入的LD_LIBRARY_PATH污染)。临时清空后再执行安装:flatc: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.32' not found ninja: build stopped: subcommand failed.env -u LD_LIBRARY_PATH npm install --no-audit --no-fund
ffmpeg 在首次安装阶段并非必需(录制与 RTMP 推流功能启用时才需要),建议一并装上,避免后续功能验证时返工。
三、安装 Node.js 24
官方 README 明确该项目在 Node.js 24.x 上测试。使用 NodeSource 官方脚本安装 24.x 大版本:
curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
apt-get install -y nodejs
node -v && npm -v
实测环境输出(Debian 12 上 node 版本号随小版本更新略有差异):
v24.22.1
11.19.1
四、获取源码并初始化配置
cd /opt
git clone https://github.com/miroslavpejic85/mirotalksfu.git
cd mirotalksfu
cp app/src/config.template.js app/src/config.js
cp .env.template .env
.env 必改两处——JWT_SECRET 为空时服务器拒绝启动(模板注释原话:REQUIRED: min 32 chars (openssl rand -hex 32), server won't start without it)。生成并写入:
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$(openssl rand -hex 32)|" .env
默认监听端口 3010,如需更换(例如 8145):
sed -i 's|^SERVER_LISTEN_PORT=3010|SERVER_LISTEN_PORT=8145|' .env
五、安装依赖并编译 worker
npm install --no-audit --no-fund
实测耗时 8 分钟(6 核 CPU,含 mediasoup worker 本地编译),最终回显:
added 411 packages in 8m
编译产物位于 node_modules/mediasoup/worker/out/Release/mediasoup-worker,可确认其存在:
ls -lh node_modules/mediasoup/worker/out/Release/mediasoup-worker
六、首次启动
npm start
实测启动回显(关键行,颜色码已去除):
> mirotalksfu@2.6.88 start
> node app/src/Server.js
◇ injected env (353) from .env
[10/26/2026, 07:35:51:304] [Server] WORKERS: 6
[10/26/2026, 07:35:51:377] [Server]
███████╗██╗ ██████╗ ████╗ ██╗ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗
...
╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ started...
启动日志末尾的版本自检与安全警告值得逐条看过:
versions: {
app: '2.6.88',
node: '24.22.1',
server_version: '3.31.0',
client_version: '3.25.3'
}
[Server] WARNING: API_KEY_SECRET is set to the default value. Change it before deploying!
该警告指向 .env 中的 API_KEY_SECRET=mirotalksfu_default_secret——REST API 的鉴权密钥,生产环境务必替换为随机值(后续 REST API 篇将依赖它做鉴权实测)。
worker 数量默认等于 CPU 核数(实测 6 核即 WORKERS: 6),可通过 .env 的 SFU_NUM_WORKERS 显式覆盖。
七、验证服务
另开终端确认监听与 HTTP 响应:
ss -ltn | grep 8145
curl -sk https://127.0.0.1:8145/ -o /dev/null -w "HTTP %{http_code}\n"
实测回显:
LISTEN 0 511 *:8145 *:*
HTTP 200
浏览器访问 https://<服务器IP>:8145,首次会出现自签名证书告警(服务器生成临时证书),高级→继续访问即可看到入会首页。正式使用需替换为域名证书:把 fullchain.pem/privkey.pem 放到 app/src/../ssl/ 目录(对应 .env 的 SERVER_SSL_CERT=../ssl/cert.pem 与 SERVER_SSL_KEY=../ssl/key.pem)。
八、systemd 常驻
npm start 是前台进程,断开 SSH 即退出。创建服务单元:
cat > /etc/systemd/system/mirotalksfu.service <<'EOF'
[Unit]
Description=MiroTalk SFU 2.6.88
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/mirotalksfu
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mirotalksfu
systemctl status mirotalksfu --no-pager | head -5
日志排障:
journalctl -u mirotalksfu -f
九、放行防火墙端口
WebRTC 服务需要两类端口,缺一类客户端就连不上:
ufw allow 3010/tcp # HTTPS 信令 + 网页(按实际 SERVER_LISTEN_PORT 调整)
ufw allow 40000:40100/udp # 媒体流端口段(对应 SFU_MIN_PORT/SFU_MAX_PORT)
ufw status
若部署在 NAT/云安全组之后,必须把 .env 中 SFU_ANNOUNCED_IP 设为服务器的公网 IP,否则 ICE 候选地址全是内网地址,浏览器无法建立媒体连接(信令能通但看不到对方画面,这是 SFU 类服务最典型的故障)。
十、常见问题速查
| 现象 | 原因与处置 |
|---|---|
npm error /usr/bin/python3: No module named pip | 未装 python3-pip,apt-get install -y python3-pip 后重跑 npm install |
failed to download mediasoup-worker prebuilt binary ... ECONNRESET | 预编译包下载失败,会自动本地编译;确保 build-essential 已装,或配置代理后重试 |
GLIBCXX_3.4.32 not found(编译 flatc 时) | libstdc++ 加载被 LD_LIBRARY_PATH 干扰,env -u LD_LIBRARY_PATH npm install 重试 |
| 启动即退出,日志提示 JWT_SECRET | .env 未设置 JWT_SECRET,openssl rand -hex 32 生成后写入 |
| 页面能打开但连不上媒体 | NAT 后未设 SFU_ANNOUNCED_IP,或防火墙未放行 40000-40100/udp |
| 浏览器证书告警 | 默认自签证书,替换 ../ssl/ 下的 cert.pem/key.pem |
至此源码方式部署完成。下一篇演示另一条部署路径:以官方构建产物一键拉起整套服务并实现标准化升级回滚,适合追求环境一致性的运维场景。