feat: live module and jenkins pipeline to harbor deploy

This commit is contained in:
Yvan
2026-09-23 17:42:54 +08:00
parent e376ff02aa
commit 53e8599bdd
145 changed files with 8984 additions and 269 deletions
+115
View File
@@ -0,0 +1,115 @@
# Go WebRTC Live
直播功能使用 Pion WebRTC,在现有 GVA WebSocket 和 JWT 用户体系上实现单主播、多观众的 SFU 转发。
## WebSocket
连接现有 WebSocket 地址(默认 `/ws`),握手必须携带 GVA JWT:
```text
wss://host/ws?token=<x-token>
```
连接后发送:
```json
{"type":"Join","payload":{"role":"publisher","streamId":"room-1"}}
```
角色支持 `publisher`、`subscriber`、`observer`。主播和观众完成 Join 后,浏览器发送 SDP offer:
```json
{"type":"Offer","payload":{"type":"offer","sdp":"v=0..."}}
```
服务端返回 `Answer`。主播使用发送方向的 transceiver,观众使用接收方向的 transceiver。媒体轨道由 Pion 在服务端复制给同一房间的所有观众。
其他消息:
- `Heartbeat` / `HeartbeatAck`
- `PublisherStatus`
- `NewProducer`
- `ProducerClosed`
- `NewSubscriber`
- `SubscriberLeft`
- `StreamListUpdate`
- `Kicked`
- `ChatHistory`:加入房间后返回最近 100 条聊天和礼物消息
- `ChatMessage`:普通聊天广播
- `GiftMessage`:送礼成功后的礼物广播
发送聊天消息:
```json
{"type":"ChatSend","payload":{"content":"大家好"}}
```
聊天只允许已经以主播或观众身份加入该房间的登录用户发送,内容最多 50 个字符。
主播和观众 45 秒没有心跳会被清理,直播房间最多 20 个;同一用户在同一房间重复观看时,旧连接会收到 `Kicked`。
## HTTP
公开列表接口:
```text
GET /live/streams
GET /live/streams/:streamId
GET /api/streams # 旧客户端兼容别名
GET /live/categories
GET /live/rooms?page=1&pageSize=20&categoryId=1&status=live
GET /live/rooms/:id
GET /live/rooms/:id/messages?limit=100
GET /live/gifts
```
PC 客户端账号接口:
```text
POST /live/client/auth/register
POST /live/client/auth/login
GET /live/client/me
PUT /live/client/me
PUT /live/client/me/password
```
客户端账号使用系统的 `sys_users` 表,注册时创建普通直播角色并初始化 100 钻石。注册和修改密码都会返回新的 JWT 登录态。
登录后可调用:
```text
POST /live/rooms/:id/gifts
GET /live/recharge/plans
POST /live/recharge/orders
```
创建充值订单直接接入 KRA 通用支付订单,请求使用支付模块的渠道标识:
```json
{
"planId": 1,
"provider": "wechat-v3",
"notifyUrl": "https://example.com/api/payment/callback/wechat-v3",
"returnUrl": "https://example.com/recharge/result"
}
```
充值档位、用户和钻石数量保存在直播业务订单中;渠道交易号、支付状态、回调、退款状态和事件流水统一保存在 KRA 的 `pay_orders` / `pay_events`。支付确认后由通用支付发货流程幂等增加钻石余额。
礼物数量必须使用礼物接口返回的 `tiers`,扣款、礼物流水和钱包余额在同一事务内完成;成功后通过 `GiftMessage` 广播给房间内在线用户。
全站设置继续保存在 `live_settings`。字典用于稳定的枚举和下拉选项,不适合承载站点名称、公告、功能开关、兑换比例等需要类型校验和运行时读取的配置。
直播状态和在线连接是进程内状态,行为与旧项目一致;服务重启后房间自动清空。
## 网络配置
默认使用 Pion 主机候选。生产环境可以配置:
```text
KRA_LIVE_STUN_URL=stun:stun.example.com:3478
KRA_LIVE_UDP_MIN_PORT=40000
KRA_LIVE_UDP_MAX_PORT=49999
```
配置 UDP 端口范围后,需要在防火墙或容器网络中放行对应端口。