部署指南
本文定位
本文是国标监控中间件的部署实操指南——从零把 ZLMediaKit 媒体服务与平台国标模块跑起来并联调出图。各配置项的完整语义与默认值见 配置详解,运行全过程见 运行流程,出问题的定位见 故障排查,多实例水平扩展见 分片部署。
一、部署架构
国标监控由两个面协同,部署为两个独立进程:
- 信令面:
blade-server承担 SIP 注册 / 点播 / 控制,监听5060。 - 媒体面:ZLMediaKit 承担 RTP 收流、转封装(FLV / HLS / RTMP / WebRTC)、录制、截图。
两者经 ZLM 的 HTTP API(平台 → ZLM) 与 Webhook(ZLM → 平台) 双向联动。数据流向:设备把 SIP 信令注册到 blade-server、把 RTP 流推给 ZLM,浏览器再从 ZLM 拉流。
注意
信令面地址(sip.host)指向 blade-server,媒体面地址(zlm.*)指向 ZLM 节点,两者是不同地址,切勿混填。部署前须先备好 MySQL / Redis 并导入 SQL(见 启动服务(中间件))。
二、部署 ZLMediaKit
官方镜像会随机生成 API 密钥且默认不开 Hook,须先改好 config.ini 再挂载启动。可从 BladeX-Links/script/docker/zlm/config.ini 取模板。
2.1 修改 config.ini
仅需改动三处——API 密钥、节点标识、Hook 回调:
[api]
# 与平台 vms.gb28181.zlm.secret 一致
secret=<zlm-api-secret>
[general]
# 与平台 vms.gb28181.zlm.node-id 一致(on_server_keepalive 按此值命中节点)
mediaServerId=blade-zlm-1
[hook]
enable=1
# 四个回调均指向 blade-server,末尾 ?secret= 与平台 vms.gb28181.zlm.hook-secret 一致
on_stream_changed=http://<blade-server-host>:80/blade-iot/vms/webhook/on_stream_changed?secret=<zlm-hook-secret>
on_stream_none_reader=http://<blade-server-host>:80/blade-iot/vms/webhook/on_stream_none_reader?secret=<zlm-hook-secret>
on_publish=http://<blade-server-host>:80/blade-iot/vms/webhook/on_publish?secret=<zlm-hook-secret>
on_server_keepalive=http://<blade-server-host>:80/blade-iot/vms/webhook/on_server_keepalive?secret=<zlm-hook-secret>注意
ZLM 原生 Hook body 不带 secret,平台从回调 URL 的 ?secret= 取值校验,每个回调 URL 末尾必须带 ?secret=,否则回调被拒、流注册不上、节点判离线。
2.2 docker 启动
改好 config.ini 后挂载启动(-v 用本地绝对路径):
docker run -id --name zlmediakit \
-p 1935:1935 -p 8800:80 -p 8443:443 -p 8554:554 \
-p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp \
-v /path/to/config.ini:/opt/media/conf/config.ini \
zlmediakit/zlmediakit:master_py| 端口 | 用途 |
|---|---|
8800:80 | HTTP API / Web 管理(容器内 80,映射宿主机 8800) |
10000 tcp+udp | RTP 单端口收流(须与 [rtp_proxy] port 及平台 rtp-port 一致) |
1935 / 8554 / 8443 | RTMP / RTSP / HTTPS |
8000 udp / 9000 udp | WebRTC / SRT |
提示
8800:80把 HTTP API 映射到宿主机8800,对应平台http-port: 8800、internal-http-port: 0(回环抓图仍走容器内80)。- 采用
script/docker下的 docker-compose 部署时已内置links-zlm服务(内网172.30.0.70:80),平台直连即可,无需单独启动。
三、配置平台国标参数
平台配置位于 application-xxx.yml(xxx 为激活的 profile,如 dev / prod / test)的 vms.gb28181,分 sip(信令面)与 zlm(媒体面)两组。核心项如下,完整字段与语义见 配置详解 §一:
vms:
enabled: true # 模块总开关,false 则不监听 SIP、不加载 ZLM
gb28181:
sip:
host: <blade-server-host> # 对外信令 IP = blade-server 可达地址
port: 5060 # SIP 监听端口(国标默认 5060)
server-id: 34020000002000000001 # 本平台 20 位国标编号(设备端「上级 SIP 服务器编号」)
domain: '3402000000' # SIP 域(编号前 10 位)
password: <sip-password> # 设备注册鉴权口令,须与设备端一致
register-mode: AUTO # AUTO 自动接入 / MANUAL 白名单
zlm:
node-id: blade-zlm-1 # 须与 config.ini [general] mediaServerId 一致
host: <zlm-host> # 平台访问 ZLM REST API 的地址
http-port: 8800 # ZLM HTTP API 端口(NAT 部署填对外映射端口)
secret: <zlm-api-secret> # 须与 config.ini [api] secret 一致
hook-secret: <zlm-hook-secret> # 须与 config.ini 各 hook URL 的 ?secret= 一致
rtp-port: 10000 # RTP 单端口收流(须与 ZLM [rtp_proxy] port 一致)
tcp-mode: true # RTP 是否 TCP 被动收流,NAT 场景建议 true
# sdp-ip / public-host:dev 可省(跳过强制校验);生产必填为设备 / 浏览器可达地址平台与 ZLM 两侧的密钥、节点标识须严格呼应,任一不一致都会导致回调被拒或节点判离线:
平台 application-xxx.yml | ZLM config.ini | 方向 / 用途 |
|---|---|---|
zlm.node-id | [general] mediaServerId | 节点身份匹配(保活命中) |
zlm.secret | [api] secret | 平台 → ZLM:REST 调用鉴权 |
zlm.hook-secret | 各 hook URL 的 ?secret= | ZLM → 平台:回调鉴权 |
提示
平台启动期对 hook-secret、以及生产环境的 sdp-ip / public-host / allowed-hook-ips 等做 fail-fast 校验,配错即启动失败而非运行时黑屏。校验清单见 配置详解 §四。
四、设备与平台接入配置
平台侧 sip 的四个字段即设备接入的关键,设备端国标配置需逐字对齐:
平台侧(vms.gb28181.sip) | 设备侧国标配置 |
|---|---|
server-id | 上级 SIP 服务器编号 |
domain | 上级 SIP 域 |
host / port | 服务器地址 / 端口 |
password | 注册密码 |
平台运行后,也可在【视频中心】>【国标平台】页在线管理与查看这些接入信息。设备侧字段对照、20 位国标编号规则与配置示例详见 国标平台配置。
五、联动验证
启动 blade-server 后,按序确认媒体面与信令面已打通:
- 媒体节点在线:进入【视频中心】>【媒体节点】,ZLM 节点显示在线,即
on_server_keepalive回调正常(依赖node-id与mediaServerId一致、hook-secret正确)。 - 设备注册:设备按上表填好国标参数后,在【视频中心】>【国标设备】出现并在线,即信令面(SIP 注册)通。
- 点播出图:进入【视频监控】选通道播放,画面正常,即媒体面(设备 RTP 推流 → ZLM 转封装 → 浏览器拉流)全链路贯通。
任一步不通,按现象到 故障排查 对症定位(注册失败、Catalog 为空、点播 WAITING 等均有专节)。
