Files
srs-and-danmaku-linux/DEPLOYMENT.md
T
RRRosmontis 359c1c6ead 部署落地:HAProxy 统一入口(RTMPS/HTTP分流) + 8445拉流弹幕口 + hooks 公网化 + 部署文档
- conf/haproxy: 18443 TLS终结+SNI选证+首字节嗅探,RTMPS→1935,HTTP→8445
- conf/nginx:   8445 明文口承载 tsk 双域名 /live/ 与 /danmaku
- conf/certs:   pem 构建脚本(接入 acme.sh 续期钩子)
- run.sh:       修正为当前部署相对路径
- srs.conf:     http_hooks 恢复并指向 api.rrrosmontis.icu (bj live_monitor)
- DEPLOYMENT.md: 完整部署记忆(架构/证书/通知链路/重建步骤/已知坑)
2026-09-03 11:24:33 +08:00

108 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署记忆文档 — srs-and-danmaku-linux
> 部署位置:**cf 服务器**(Celestial-Fulcrum,Ubuntu 24.04,本仓库即部署目录 `/home/srs`)
> 部署日期:2026-09-01 ~ 09-03
> 上游:https://git.rrrosmontis.icu/RoyirinRosmontis/srs-and-danmaku-linux(本仓库)
## 1. 总体架构
```
外网 443(Sakura Frp HTTPS 隧道 ×2,TLS 透传到本机)
├── srs_oversea: tsk.aeolianchi.me (frp-age 节点) ──┐
└── srs_cn: tsk.rrrosmontis.icu (frp-hip 节点) ─┴→ 本机 :18443
│
HAProxy [TLS终结 + 按SNI选证 + 首字节嗅探]
├── 解密后 0x03 (RTMPS 推流) → 127.0.0.1:1935 (SRS)
└── HTTP (拉流/弹幕) → 127.0.0.1:8445 (nginx)
├── /live/ → 127.0.0.1:8080 (SRS HTTP-FLV/HLS)
└── /danmaku → 127.0.0.1:55556 (弹幕 WebSocket)
```
- **推流**:`rtmps://tsk.aeolianchi.me:443/live/room_<房间号>` 或 `rtmps://tsk.rrrosmontis.icu:443/live/room_<房间号>`(OBS / ffmpeg 均可)
- **拉流**:`https://tsk.rrrosmontis.icu/live/room_<房间号>.flv`(或 `.m3u8`,me 域名同)
- **弹幕**:`wss://tsk.rrrosmontis.icu/danmaku`
- 设计要点:全部业务共用 443 对外端口;推流用 **RTMPS**(裸 RTMP 无 SNI 无法过 HTTPS 隧道);nginx stream ssl_preread 分不开「同 SNI 的 RTMPS/HTTPS」,故用 **HAProxy 先终结 TLS 再嗅探首字节**(RTMP 握手恒为 0x03,HTTP 以方法字符开头)。
## 2. 本机组件与路径
| 组件 | 路径 | 说明 |
|---|---|---|
| SRS 源码+编译产物 | `/home/srs/trunk/` | SRS 6.0.172(上游 tag v6.0-b0),二进制 `trunk/objs/srs` |
| 弹幕后端 | `/home/srs/danmaku/danmaku_backend.py` | FastAPI + uvicorn,端口 55556,venv 在 `danmaku/venv/`(gitignore) |
| HAProxy 配置 | `conf/haproxy/haproxy.cfg` | 软链 → `/etc/haproxy/haproxy.cfg` |
| nginx 8445 口 | `conf/nginx/srs-https-8445.conf` | 软链 → `/etc/nginx/sites-enabled/srs-https-8445.conf`(明文 HTTP,TLS 已在 HAProxy 终结) |
| 证书 pem 构建脚本 | `conf/certs/build-pems.sh` | 生成 `/etc/haproxy/certs/*.pem`(cert+key 合一;**私钥不入库**,pem 只在 /etc 下) |
| 主配置 | `trunk/conf/srs.conf` | RTMP 1935 / API 1985 / HTTP 8080 / WebRTC 8000(UDP) |
### systemd 服务(均 enabled 开机自启)
| 服务 | 启动 | 日志 |
|---|---|---|
| `srs-server.service` | `trunk/run.sh`(`./objs/srs -c ./conf/srs.conf`,WorkingDirectory=/home/srs/trunk) | `journalctl -u srs-server -f` |
| `srs-danmaku.service` | `danmaku/venv/bin/python danmaku_backend.py` | `journalctl -u srs-danmaku -f` |
| `haproxy.service` | `/etc/haproxy/haproxy.cfg`(软链至 conf/) | `journalctl -u haproxy -f` |
## 3. 证书与续期
- `tsk.aeolianchi.me`:acme.sh(阿里云 DNS API,ecc),装于 `/etc/nginx/cert/tsk.aeolianchi.me/`
- `tsk.rrrosmontis.icu`:复用 acme.sh 泛域名证书 `*.rrrosmontis.icu`(`/home/server/cert/extra/rrrosmontis.icu/`)
- **续期钩子**:两张证书的 `--reloadcmd` 均为 `conf/certs/build-pems.sh && systemctl reload nginx && systemctl reload haproxy`,续期后自动重拼 pem 并重载,无需人工干预
## 4. 开播通知链路(http_hooks)
```
SRS on_publish/on_unpublish
→ https://api.rrrosmontis.icu/v1/live/publish/local/on_publish (bj nginx 公网入口)
→ bj:1986 /remote_srs/local/on_publish (live_monitor.py, napcat 伴生 Flask)
→ 按 record.json 关注列表发 QQ 通知;返回 {"code":0} 放行推流
```
- SRS 6.0 的 http_hooks 原生支持 https 回调(源码 http client 带 TLS)
- **流名必须为 `room_<房间号>`** 才会被识别为房间;hook 失败 SRS 会拒绝推流
- 主站(aliyun)走 `/remote_srs/on_publish`(site=1),本机为副站(`/remote_srs/local/...`,site=2)
## 5. 前端页面(hk 服务器)
- `https://lfr.aeolianchi.me` → hk:/home/srs-frontend(index.html + js/hls、mpegts 播放库)
- 页面内副站地址已改为 `tsk.rrrosmontis.icu`(拉流 base + 弹幕 wss)
- hk nginx:`/etc/nginx/conf.d/lfr.aeolianchi.me.conf`(80 跳转 + 443 静态,证书 webroot HTTP-01 自动续期)
## 6. 从零重建步骤(换机/重装备忘)
1. `git clone` 本仓库到部署目录(如 `/home/srs`)
2. 补编译依赖:`apt install -y automake autoconf libtool pkg-config tclsh cmake`(另需 gcc/g++/make)
3. **补齐 `trunk/3rdparty/`**(仓库 .gitignore 排除了它,裸仓库无法编译):从官方 `ossrs/srs` tag `v6.0-b0` 稀疏克隆 `trunk/3rdparty` 拷入——版本号必须与本仓库 `trunk/src/core/srs_core_version6.hpp` 的 `VERSION_REVISION` 一致(当前 172)
4. 编译:`cd trunk && ./configure && make -j$(nproc)`(大任务放 tmux)
5. 弹幕后端:`python3 -m venv danmaku/venv && danmaku/venv/bin/pip install fastapi 'uvicorn[standard]'`
6. 软链配置:`conf/haproxy/haproxy.cfg → /etc/haproxy/haproxy.cfg`、`conf/nginx/srs-https-8445.conf → /etc/nginx/sites-enabled/`
7. 证书签发(acme.sh dns_ali)+ `build-pems.sh` + 续期钩子(见第 3 节)
8. systemd:创建 `srs-server.service` / `srs-danmaku.service`(见第 2 节),`daemon-reload && enable --now`
9. Sakura Frp:两条 HTTPS 隧道绑定各自域名,本地目标 `127.0.0.1:18443`
## 7. 已知行为与坑
- **SRS 对不在线流的 .flv 请求会挂住连接等流出现**(不是 404)——拉流方需自行设置超时;测试时推流建立延迟会造成"拉到 0 字节"的假象
- `srs.conf` 中 `rtc_server.candidate = 39.97.55.150`(bj 公网 IP):WebRTC 播放需 UDP 8000 能路由到该地址,当前未配转发,WebRTC 播放未打通(HTTP-FLV/HLS 不受影响)
- `daemon off` + 控制台日志是配合 systemd 的刻意配置,非调试残留
- 免费版 Sakura 节点偶发新连接抖动,客户端重试即可
- `run.sh` 依赖 systemd 的 `WorkingDirectory=/home/srs/trunk`(内用相对路径),改路径两处同步
## 8. 本仓库相对上游的变更
| 文件 | 变更 |
|---|---|
| `trunk/run.sh` | 修正旧绝对路径(srs-server-6.0-b0 → 当前部署路径),改为相对路径 |
| `trunk/conf/srs.conf` | http_hooks 指向 api.rrrosmontis.icu 公网入口(bj live_monitor) |
| `conf/` | 新增:HAProxy 分流配置、nginx 8445 拉流/弹幕口、pem 构建脚本 |
| `.gitignore` | 追加 `danmaku/venv/`、`*.log` |
| `DEPLOYMENT.md` | 本文档 |
## 9. 快速运维
```bash
systemctl restart srs-server srs-danmaku # 重启业务
journalctl -u srs-server -f # 看 SRS 日志(含 hook 回调记录)
/home/srs/conf/certs/build-pems.sh # 手动重建 HAProxy pem
tmux attach -t <会话> # 编译类长任务用 tmux(单字母命名惯例)
```