選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
leiyun 28695b65c8 save 1ヶ月前
deploy save 1ヶ月前
scripts Initial SFU service 1ヶ月前
src Initial SFU service 1ヶ月前
.dockerignore Initial SFU service 1ヶ月前
.env.example Initial SFU service 1ヶ月前
.env.live Initial SFU service 1ヶ月前
.gitignore Initial SFU service 1ヶ月前
.mise.toml save 1ヶ月前
DEPLOY.live.md Initial SFU service 1ヶ月前
Dockerfile Initial SFU service 1ヶ月前
README.md Initial SFU service 1ヶ月前
docker-compose.image.yml Initial SFU service 1ヶ月前
docker-compose.yml Initial SFU service 1ヶ月前
package-lock.json Initial SFU service 1ヶ月前
package.json Initial SFU service 1ヶ月前

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 下发
  • 多进程跨房间横向扩容
  • 录制、旁路推流