ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Chatto语音视频通话搭建指南:LiveKit集成、信令流程与E2EE加密

Chatto语音视频通话搭建指南:LiveKit集成、信令流程与E2EE加密 Chatto语音视频通话搭建指南LiveKit集成、信令流程与E2EE加密【免费下载链接】chattoA fully-featured team and group chat application that you can easily selfhost.项目地址: https://gitcode.com/gh_mirrors/chatt/chattoChatto 是一款功能完整的、可轻松自托管的团队与群组聊天应用内置基于 LiveKit 的实时音视频通话能力。本文将带新手快速搭建 Chatto 语音视频通话环境讲解 LiveKit 媒体服务器的集成方式、通话信令与 Webhook 状态同步流程以及每通电话独立的 E2EE 端到端加密密钥机制让你在几小时内就能拥有一个带加密通话的私有聊天系统。一、架构总览Chatto 与 LiveKit 如何分工 很多人以为 Chatto 自己处理 WebRTC 媒体流其实并不是。Chatto 的设计哲学是各做擅长的事组件职责Chatto 服务器房间成员校验、短期令牌签发、通话生命周期事件、权限管理、前端 UILiveKit 服务器WebRTC 媒体传输音频/视频/屏幕共享、SFU 转发、NAT 穿透一次通话的完整链路如下用户点击房间侧边栏的电话标签发起开始通话或加入通话Chatto 校验其房间成员身份与call.*权限签发短期 LiveKit JWT 令牌浏览器直连LiveKit 服务器建立 WebRTC 连接媒体不经过 ChattoLiveKit 通过 Webhook 通知 Chatto 有人加入/离开房间列表实时显示通话指示器这种信令走 Chatto、媒体走 LiveKit 直连的架构让 Chatto 的服务器带宽几乎不随通话规模增长。详见 docs/fdr/FDR-016-voice-calls.md。二、LiveKit 集成四步搭建法最快配置方法第 1 步运行 LiveKit 服务器本地开发最快路径是安装 LiveKit CLI 后运行开发模式它会在ws://localhost:7880启动并内置 API 密钥devkey/secret。生产部署则建议直接使用仓库提供的 Docker Compose 完整示例里面已包含 LiveKit、NATS、Chatto 和 Caddy 反向代理。第 2 步配置 Chatto 的[livekit]段在chatto.toml中加入字段定义见 cli/internal/config/integrations.go[livekit] enabled true url wss://livekit.example.com # 生产环境务必用 wss:// api_key your-api-key api_secret your-api-secret # 切勿泄露仅用于服务端签名也可以用环境变量CHATTO_LIVEKIT_ENABLED、CHATTO_LIVEKIT_URL、CHATTO_LIVEKIT_API_KEY、CHATTO_LIVEKIT_API_SECRET配置。webhook_url默认指向{webserver.url}/webhooks/livekit通常无需修改。第 3 步配置 LiveKit WebhookLiveKit 必须能把事件 POST 回 Chatto否则通话指示器无法工作。参考仓库示例 examples/dockercompose/livekit.yamlwebhook: urls: - https://chat.example.com/webhooks/livekit api_key: your-api-key⚠️ 注意livekit-server --dev开发模式会禁用 Webhook只适合测试本地媒体连通性正式部署必须保证 Webhook 可达。第 4 步重启 Chatto完成以上三步后重启 Chatto房间侧边栏就会出现电话标签。若服务器未配置 LiveKitChatto 会优雅降级——整个通话 UI 直接隐藏不会出现点不动的灰色按钮。完整的分步教程见官方文档源文件 apps/docs-website/src/content/docs/guides/infrastructure/voice-calls.mdx一键部署参考 examples/dockercompose/README.md。三、信令流程深度解析Webhook 驱动 周期对账 这是 Chatto 通话设计中最值得学习的部分。早期方案是客户端崩溃时离开事件永远不会触发导致参与者卡在通话里。Chatto 采用了三重保障1. Webhook 驱动的状态事实核心机制LiveKit 在 WebRTC 传输层检测到断开连接哪怕客户端直接崩溃、关浏览器都会发出participant_left事件并通过 HMAC 签名 POST 到/webhooks/livekit。Chatto 将其记录为持久的房间事件事实CallStartedEvent→evt.room.{roomId}.call_startedCallParticipantJoinedEvent→evt.room.{roomId}.call_joinedCallParticipantLeftEvent→evt.room.{roomId}.call_leftCallEndedEvent→evt.room.{roomId}.call_ended2. 投影驱动的实时读取活跃通话与参与者列表来自事件投影而非进程内存缓存。用户点击加入后 UI 可短暂显示乐观状态随后由 LiveKit Webhook 确认或修正——远端观察者看到的状态永远有据可查。3. 周期对账Reconciliation兜底持有租约的协调器每 30 秒将投影状态与 LiveKit 的实际房间/参与者列表比对差异会被追加RECONCILIATION事件纠正。若连续 3 个周期无法列出 LiveKit 房间则清理所有僵死通话避免阻塞新会话。多副本部署下房间聚合的 OCC 乐观锁保证不会写入重复的转场事实。完整决策记录见 docs/adr/ADR-009-webhook-driven-voice-call-state.md。生产环境端口规划用户浏览器直连LiveKit媒体流量不走 Chatto 的反向代理因此防火墙要放通端口用途TCP 443LiveKit API 与 WebSocket 信令代理到 7880TCP 7881UDP 不可用时的 ICE/TCP 媒体回退UDP 3478内置 TURN/STUN 中继UDP 7882直连 WebRTC 媒体对称 NAT、部分移动网络场景下LiveKit 内置 TURN 中继turn.enabled: trueUDP 3478能解决大多数 NAT 穿透失败完全封锁 UDP 的网络才需要额外的 TURN/TLS 服务。四、E2EE 端到端加密每通电话一把钥匙 Chatto 的客户端默认强制启用 LiveKit E2EE且密钥管理完全由 Chatto 掌控按通话生成密钥房间内第一个人加入时Chatto 通过内置 KMS 边界生成一个新的通话 ID 与 E2EE 共享密钥密钥不落事件日志原始密钥存放在ENCRYPTION_KEYS存储中CallStartedEvent只记录密钥引用事件日志被复制也解不开被窃听的媒体随令牌下发voiceCallToken同时返回token与e2eeKey前端据此创建ExternalE2EEKeyProvider、配置 LiveKit 的 E2EE worker 后再连接通话结束即销毁最后一人离开时记录CallEndedEvent并触发密钥 shredding销毁由持久化消费者跨崩溃重试确保新通话永远使用全新密钥材料这一设计意味着LiveKit 服务器本身也解不出你的通话内容。代价是启用 E2EE 后不支持该特性的旧版客户端将无法解码媒体。五、权限管理谁能发起、谁能发言️通话能力由 5 个独立权限精细控制可在服务器、房间组、房间或私聊四级作用域配置权限控制的行为call.start发起通话需同时具备call.joincall.join加入活跃通话含纯收听者call.voice发布麦克风音频call.camera发布摄像头视频call.screenshare共享屏幕、窗口、标签页含捕获音频几个实用技巧只想做听众允许call.join、拒绝三个媒体权限即可客户端不会请求麦克风/摄像头权限即时回收客户端收到更新的房间权限会立即停止被撤销的媒体服务器还会在 30 秒对账周期中复查已连接参与者令牌很短命浏览器令牌 5 分钟过期原生推流令牌 1 分钟但令牌过期本身不会断开已建立的媒体连接六、常见问题与生产建议 ✅必须用wss://生产环境的CHATTO_LIVEKIT_URL要用wss://公网子域且CHATTO_LIVEKIT_API_KEY/SECRET必须与 LiveKit 配置中的keys:完全一致通话不工作优先检查 Webhook URL 是否可被 LiveKit 访问、API 密钥两侧是否一致LiveKit 启动报could not resolve external IP放行其出站 STUN 请求或关闭外网 IP 发现并显式配置node_ip多服务器共享一个 LiveKit 集群为每个 Chatto 服务器设置唯一的CHATTO_LIVEKIT_SERVER_ID用于房间名前缀隔离不需要通话删除[livekit]段或设enabled falseUI 自动消失零残留Chatto 把通话收敛为房间的一等公民每个房间最多一个活跃通话通话事实持久化在房间聚合中重启不丢状态。这套架构让你无需自建任何媒体组件仅凭一个 LiveKit 服务就能获得崩溃自愈、可审计、端到端加密的团队通话体验。【免费下载链接】chattoA fully-featured team and group chat application that you can easily selfhost.项目地址: https://gitcode.com/gh_mirrors/chatt/chatto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表