Debian 12 安装 MiroTalk SFU 2.6.88 指南

Debian 12 源码方式部署 MiroTalk SFU 2.6.88:编译依赖、Node.js 24、mediasoup worker 编译实测、systemd 常驻与防火墙放行,全部命令带真实回显。

MiroTalk SFUWebRTC视频会议MiroTalk2026/10/26

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

三个依赖缺一不可,实测两次踩坑都源于此:

  1. 缺 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
    
  2. 预编译二进制下载失败不算失败:网络不佳时 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()
    
  3. 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

至此源码方式部署完成。下一篇演示另一条部署路径:以官方构建产物一键拉起整套服务并实现标准化升级回滚,适合追求环境一致性的运维场景。