# yzx_oa_sfu 这是给 OA 前端 `src/views/live/room_sfu.vue` 准备的 mediasoup + protoo SFU 服务。当前版本先兼容现有前端协议,不做 token 校验。 ## 版本 - Node.js >= 22 - mediasoup 3.21.2 - protoo-server 4.0.8 ## 本地启动 ```bash npm install copy .env.example .env npm start ``` 本地健康检查: ```bash curl http://127.0.0.1:4443/healthz ``` WebSocket 入口兼容这类地址: ```text wss://你的域名/ws_webrtc_sfu_api/?roomId=xxx&peerId=xxx wss://你的域名/ws_webrtc_sfu_api_test/?roomId=xxx&peerId=xxx ``` 如果直接连服务端端口,也可以: ```text ws://127.0.0.1:4443/?roomId=xxx&peerId=xxx ``` ## 部署要点 1. Nginx 负责 HTTPS/WSS,反向代理到本服务的 `PORT`。 2. 防火墙要放行 `MEDIASOUP_RTC_MIN_PORT` 到 `MEDIASOUP_RTC_MAX_PORT` 的 UDP,建议 TCP 也放行作为兜底。 3. 如果服务在公网 IP 机器上,`MEDIASOUP_ANNOUNCED_ADDRESS` 填公网 IP 或域名。 4. 如果服务在内网/NAT 后面,`MEDIASOUP_ANNOUNCED_ADDRESS` 必须填浏览器可达的公网地址。 5. 第一阶段 `AUTH_ENABLED=false`,只校验 `roomId` 和 `peerId` 是否存在。 ## Docker 离线部署 可以在 Windows 本地打包镜像,保存为 tar,服务器只负责 `docker load` 和启动容器。Windows 本机的 Node 版本不影响镜像内容,Dockerfile 使用的是 `node:22-bullseye-slim`。 live 环境完整部署步骤见: ```text DEPLOY.live.md ``` 本地打包: ```powershell cd D:\work\yzx_oa_sfu .\scripts\docker-build-save.ps1 ``` 如果服务器是常见 x86_64 Linux,上面的默认平台 `linux/amd64` 就可以。生成文件: ```text yzx-oa-sfu_0.1.0-live_linux-amd64.tar ``` 把这些文件传到服务器同一个目录: ```text yzx-oa-sfu_0.1.0-live_linux-amd64.tar docker-compose.image.yml .env scripts/docker-load-run.sh(可选) ``` 测试环境 `.env` 建议: ```text NODE_ENV=production LISTEN_IP=0.0.0.0 PORT=4443 PUBLIC_BASE_URL=https://oa.live.educlouddata.com/ws_webrtc_sfu_api_test AUTH_ENABLED=false MEDIASOUP_WORKERS=1 MEDIASOUP_LISTEN_IP=0.0.0.0 MEDIASOUP_ANNOUNCED_ADDRESS=oa.live.educlouddata.com MEDIASOUP_RTC_MIN_PORT=40000 MEDIASOUP_RTC_MAX_PORT=40100 MEDIASOUP_ENABLE_UDP=true MEDIASOUP_ENABLE_TCP=true MEDIASOUP_PREFER_UDP=true MEDIASOUP_INITIAL_AVAILABLE_OUTGOING_BITRATE=1000000 ROOM_IDLE_TIMEOUT_MS=300000 ``` 服务器启动: ```bash docker load -i yzx-oa-sfu_0.1.0-live_linux-amd64.tar SFU_IMAGE=yzx-oa-sfu:0.1.0-live docker compose -f docker-compose.image.yml up -d ``` 检查: ```bash docker logs -f yzx-oa-sfu curl http://127.0.0.1:4443/healthz ``` 测试环境 OA 域名是 `https://oa.live.educlouddata.com/` 时,Nginx 需要把 `/ws_webrtc_sfu_api_test/` 反代到容器映射出来的 `127.0.0.1:4443`。 ## 当前兼容的前端能力 - 加入房间、成员上下线 - 音频/视频/屏幕共享生产和消费 - DataChannel `chat` 通知,用于前端刷新业务聊天列表 - 主持人远端静音、全体静音、解除静音 - 基础 stats 接口 - 部分在线课堂扩展命令按 target 透传广播,后续可以接业务权限和状态 ## 前端接入建议 当前 OA 前端的 `src/utils/sfu/urlFactory.js` 里写死了域名和路径。服务部署好后,建议把它改成环境变量: ```js const baseUrl = import.meta.env.VITE_SFU_WS_URL || `wss://${window.location.hostname}/ws_webrtc_sfu_api` const url = `${baseUrl}/?roomId=${roomId}&peerId=${peerId}` ``` 对应 `.env.*`: ```text VITE_SFU_WS_URL='wss://oa.qbjjyyun.net/ws_webrtc_sfu_api' ``` 测试环境 `oa.live.educlouddata.com` 对应: ```text VITE_SFU_WS_URL='wss://oa.live.educlouddata.com/ws_webrtc_sfu_api_test' ``` ## 暂未做的事 - token/业务权限校验 - TURN/STUN 下发 - 多进程跨房间横向扩容 - 录制、旁路推流