Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
leiyun 28695b65c8 save 1 mese fa
deploy save 1 mese fa
scripts Initial SFU service 1 mese fa
src Initial SFU service 1 mese fa
.dockerignore Initial SFU service 1 mese fa
.env.example Initial SFU service 1 mese fa
.env.live Initial SFU service 1 mese fa
.gitignore Initial SFU service 1 mese fa
.mise.toml save 1 mese fa
DEPLOY.live.md Initial SFU service 1 mese fa
Dockerfile Initial SFU service 1 mese fa
README.md Initial SFU service 1 mese fa
docker-compose.image.yml Initial SFU service 1 mese fa
docker-compose.yml Initial SFU service 1 mese fa
package-lock.json Initial SFU service 1 mese fa
package.json Initial SFU service 1 mese fa

README.md

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

本地启动

npm install
copy .env.example .env
npm start

本地健康检查:

curl http://127.0.0.1:4443/healthz

WebSocket 入口兼容这类地址:

wss://你的域名/ws_webrtc_sfu_api/?roomId=xxx&peerId=xxx
wss://你的域名/ws_webrtc_sfu_api_test/?roomId=xxx&peerId=xxx

如果直接连服务端端口,也可以:

ws://127.0.0.1:4443/?roomId=xxx&peerId=xxx

部署要点

  1. Nginx 负责 HTTPS/WSS,反向代理到本服务的 PORT
  2. 防火墙要放行 MEDIASOUP_RTC_MIN_PORTMEDIASOUP_RTC_MAX_PORT 的 UDP,建议 TCP 也放行作为兜底。
  3. 如果服务在公网 IP 机器上,MEDIASOUP_ANNOUNCED_ADDRESS 填公网 IP 或域名。
  4. 如果服务在内网/NAT 后面,MEDIASOUP_ANNOUNCED_ADDRESS 必须填浏览器可达的公网地址。
  5. 第一阶段 AUTH_ENABLED=false,只校验 roomIdpeerId 是否存在。

Docker 离线部署

可以在 Windows 本地打包镜像,保存为 tar,服务器只负责 docker load 和启动容器。Windows 本机的 Node 版本不影响镜像内容,Dockerfile 使用的是 node:22-bullseye-slim

live 环境完整部署步骤见:

DEPLOY.live.md

本地打包:

cd D:\work\yzx_oa_sfu
.\scripts\docker-build-save.ps1

如果服务器是常见 x86_64 Linux,上面的默认平台 linux/amd64 就可以。生成文件:

yzx-oa-sfu_0.1.0-live_linux-amd64.tar

把这些文件传到服务器同一个目录:

yzx-oa-sfu_0.1.0-live_linux-amd64.tar
docker-compose.image.yml
.env
scripts/docker-load-run.sh(可选)

测试环境 .env 建议:

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

服务器启动:

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

检查:

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 里写死了域名和路径。服务部署好后,建议把它改成环境变量:

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.*

VITE_SFU_WS_URL='wss://oa.qbjjyyun.net/ws_webrtc_sfu_api'

测试环境 oa.live.educlouddata.com 对应:

VITE_SFU_WS_URL='wss://oa.live.educlouddata.com/ws_webrtc_sfu_api_test'

暂未做的事

  • token/业务权限校验
  • TURN/STUN 下发
  • 多进程跨房间横向扩容
  • 录制、旁路推流