GBHub 国标视频平台 - 部署文档

目录

  1. 前置条件
  2. 环境变量配置 (.env)
  3. 部署基础服务 (Docker)
  4. 部署 GB28181 核心服务
  5. 配置 systemd 服务
  6. 验证服务状态
  7. 防火墙与端口开放(iptables/nftables)
  8. 常见问题及解决
  9. 卸载清理
  10. 环境变量速查表(zlm-node)

1. 前置条件

  • 硬件:CPU ≥ 4 核,内存 ≥ 8 GB,硬盘 ≥ 50 GB(根据录像存储需求扩展)
  • 操作系统:CentOS 7 / Ubuntu 20.04+(建议最新稳定版)
  • 固定公网 IP:本文以 1.1.1.1 为例,实际部署请替换
  • 安装 Docker
    curl -fsSL https://get.docker.com | bash -s docker
    systemctl enable --now docker
    
      安装 b3sum(用于生成 Blake3 哈希):
      bash
    
      # Ubuntu / Debian
      cargo install b3sum
      # 或使用预编译二进制下载
      # 访问 https://github.com/BLAKE3-team/BLAKE3/releases
    
      准备安装包:将 gb.tar.gz、m.tar、zlm-node、MediaServer 上传至服务器(如 /root/install/)
    
    
  1. 环境变量配置 (.env)

所有 gbhub 服务(mgr、scheduler、sip)共用 /usr/local/gb/.env,systemd 通过 EnvironmentFile 加载。

⚠️ 重要说明(节点上报认证机制):
zlm-node 启动后会对 NODE_TOKEN 环境变量的值进行 Blake3 哈希,然后将哈希结果通过 X-Node-Token 请求头发送给 gbhub-mgr。
因此,gbhub-mgr 的 .env 中配置的 NODE_REPORT_TOKEN 应当是原始 NODE_TOKEN 的 Blake3 哈希值,而非原始字符串。

💡 如何生成 NODE_REPORT_TOKEN:
使用 b3sum 工具计算原始 NODE_TOKEN 的 Blake3 哈希值:
bash

# 将 your_secret_token_here 替换为实际的 NODE_TOKEN 值
echo -n "your_secret_token_here" | b3sum | awk '{print $1}'

命令拆解说明:

    echo -n:去掉末尾换行符,确保哈希结果与代码中的计算方式完全一致。

    b3sum:计算标准输入内容的 Blake3 哈希值。

    awk '{print $1}':从输出中提取哈希值部分(去除文件名等额外信息)。

示例:
bash

# 假设 NODE_TOKEN="my_secret"
echo -n "my_secret" | b3sum | awk '{print $1}'
# 输出类似:5d3f9e6c8f1a2b4c7d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c

将输出的哈希值填入下方 NODE_REPORT_TOKEN 字段。

创建并编辑 /usr/local/gb/.env:
bash

mkdir -p /usr/local/gb
cat > /usr/local/gb/.env <<‘EOF’

============================================================

国标视频平台 (gbhub) 环境配置

============================================================

数据库 (GreptimeDB / PostgreSQL)

DATABASE_URL=postgres://127.0.0.1:4003/public

Redis 连接池配置

REDIS_URL=redis://127.0.0.1:6379?tcp_keepalive=60
REDIS_POOL_MAX_SIZE=16
REDIS_POOL_TIMEOUT_SECS=5

SIP 信令监听地址

SERVER_LISTEN_ADDR=0.0.0.0:6060
SERVER_LISTEN_ADDR_TCP=0.0.0.0:6060

平台 SIP 标识

SERVER_DEVICE_ID=34020000002000000001
SERVER_REALM=3402000000
SERVER_PASSWORD=QSAe6780

公网 IP (用于 SIP/SDP)

PUBLIC_IP=1.1.1.1

管理服务器 (mgr-server) 监听地址

MGR_API_LISTEN=0.0.0.0:3002

信令服务器 (sip-server) HTTP 监听地址

SIP_API_LISTEN=0.0.0.0:3003

Webhook 回调端口

HOOK_ENABLE=true
HOOK_PUBLIC_IP=127.0.0.1
HOOK_PORT=3003

mgr-server 转发 SIP 请求的目标地址

SIP_API_BASE=http://127.0.0.1:3003

JWT 认证

JWT_SECRET=6n5PVqybFTdWBUbpOPRvwEb6/q1PI1DhTqcmqqhenPo=
JWT_EXPIRE_DAYS=7
ADMIN_INIT_PASSWORD=admin123

内部服务通信(gbhub-mgr ↔ gbhub-sip)

INTERNAL_API_TOKEN=q123456778
PLAY_TOKEN=
PUBLISH_TOKEN=

============================================================

节点上报认证 Token(管理端校验用)

此值应为 zlm-node 中 NODE_TOKEN 原始值的 Blake3 哈希结果

使用命令生成:echo -n “your_secret_token” | b3sum | awk ‘{print $1}’

============================================================

NODE_REPORT_TOKEN=your_blake3_hash_here

EOF

  1. 部署基础服务(Docker)
    3.1 导入 MediaServer 镜像
    bash

docker load -i m.tar

3.2 启动 Valkey(缓存)
bash

docker run -d --network host --name valkey
-e VALKEY_EXTRA_FLAGS=‘–save 60 1 --loglevel warning --rdbcompression no’
-v /data/valkey:/data
valkey/valkey

3.3 启动 GreptimeDB(时序数据库)
bash

docker run -d --network host
-v “/data/greptimedb_data:/greptimedb_data”
–name greptime
greptime-registry.cn-hangzhou.cr.aliyuncs.com/greptime/greptimedb:v1.1.4
standalone start
–http-addr 127.0.0.1:4000
–grpc-bind-addr 127.0.0.1:4001
–mysql-addr 127.0.0.1:4002
–postgres-addr 127.0.0.1:4003

3.4 部署并配置 MediaServer(ZLMediaKit)
3.4.1 准备目录和二进制
bash

mkdir -p /data/m
mv MediaServer /data/m/

3.4.2 首次启动生成默认配置
bash

docker run -d --network host --name me
-v /data/m:/app/m
m /app/m/MediaServer -l 4

sleep 5
docker stop me

3.4.3 修改 /data/m/config.ini
bash

cd /data/m
sed -i ‘s/mediaServerId=./mediaServerId=1/g’ config.ini
sed -i ‘s/port=8000/port=9100/g’ config.ini
sed -i ‘s/tcpPort=8000/tcpPort=9100/g’ config.ini
sed -i 's/externIP=.
/externIP=/g’ config.ini # 留空自动获取,也可手动指定公网IP
sed -i ‘s/port=80/port=9080/g’ config.ini
sed -i ‘s/port=443/port=9443/g’ config.ini
sed -i ‘s/secret=.*/secret=935v73f7-bb6b-4889-a715-d9eb2d1936aa/g’ config.ini

3.4.4 重启容器
bash

docker start me

3.5 部署 zlm-node(ZLM 节点上报程序)
bash

mkdir -p /usr/local/zlm
mv zlm-node /usr/local/zlm/
chmod +x /usr/local/zlm/zlm-node

  1. 部署 GB28181 核心服务
    bash

cd /usr/local
tar -xf gb.tar.gz
cd gb

获取机器码并申请授权:
bash

./gbhub-mgr # 打印 Machine ID,将授权文件 license.lic 放入 /usr/local/gb/

注意:授权文件未放入前,服务启动会因 license 无效而退出。
  1. 配置 systemd 服务
    5.1 gbhub-mgr(管理服务)

创建 /etc/systemd/system/gbhub-mgr.service:
ini

[Unit]
Description=GB28181 Management Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=/usr/local/gb
EnvironmentFile=/usr/local/gb/.env
ExecStart=/usr/local/gb/gbhub-mgr
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=gbhub-mgr

[Install]
WantedBy=multi-user.target

启动服务:
bash

systemctl daemon-reload
systemctl enable --now gbhub-mgr.service

5.2 gbhub-scheduler(调度服务)

创建 /etc/systemd/system/gbhub-scheduler.service(内容类似,ExecStart 改为 gbhub-scheduler,Environment=“RUST_LOG=warn” 可加在 [Service] 段),然后启动。
5.3 gbhub-sip(SIP 信令服务)

创建 /etc/systemd/system/gbhub-sip.service(内容类似,ExecStart 改为 gbhub-sip),然后启动。
5.4 zlm-node(ZLM 节点上报程序)

⚠️ 认证机制说明:
程序启动后会读取 NODE_TOKEN 的原始字符串值,计算其 Blake3 哈希,然后将哈希值放入请求头 X-Node-Token 中上报。
因此,请务必保证 NODE_TOKEN 的原始值,与 /usr/local/gb/.env 中 NODE_REPORT_TOKEN 的哈希值相匹配。

创建 /etc/systemd/system/zlm-node.service:
ini

[Unit]
Description=zlm-node (ZLM Node Reporter)
After=network.target

[Service]
Type=simple
EnvironmentFile=/usr/local/gb/.env

---------- 日志级别 ----------

Environment=“RUST_LOG=warn”

---------- 必填:节点上报原始认证令牌 ----------

此值为原始字符串(明文),程序内部会计算 Blake3 哈希后发送

务必与 .env 中 NODE_REPORT_TOKEN 的哈希值匹配

Environment=“NODE_TOKEN=your_secret_token_here”

---------- 节点标识(必须与 MediaServer 的 mediaServerId 一致) ----------

Environment=“SERVER_ID=1”

---------- ZLM API 地址及密钥 ----------

Environment=“API_BASE=http://127.0.0.1:9080”
Environment=“SECRET=935v73f7-bb6b-4889-a715-d9eb2d1936aa”

---------- 管理端上报接口 ----------

Environment=“MGR_URL=http://127.0.0.1:3002/api/zlm/report-status”

---------- IP 获取策略(优先级:CUSTOM_IP > INTERFACE > 外网API) ----------

1. 手动指定公网 IP(取消注释并填写实际IP)

Environment=“CUSTOM_IP=1.1.1.1”

2. 指定网卡名称(如 eth0)

Environment=“INTERFACE=eth0”

3. 以上均不设置,则自动通过外网API获取(ip.3322.net / ip.automate.org.cn)

---------- 播放地址构造参数 ----------

Environment=“ZLM_HTTP_PORT=9080”
Environment=“USE_HTTPS=false”

---------- 可选:手动指定 http_fmp4_base 或 static_base ----------

Environment=“HTTP_FMP4_BASE=https://custom-domain.com:9443/”

Environment=“STATIC_BASE=http://cdn.example.com/”

---------- 上报间隔(秒) ----------

Environment=“REPORT_INTERVAL_SECS=30”

---------- 是否自动更新 ZLM 的 rtc.externIP(默认 true) ----------

Environment=“ENABLE_RTC_EXTERN_IP_UPDATE=true”

---------- 是否接受无效 TLS 证书(自签名场景) ----------

Environment=“TLS_ACCEPT_INVALID_CERTS=false”

ExecStart=/usr/local/zlm/zlm-node
Restart=always
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动服务:
bash

systemctl daemon-reload
systemctl enable --now zlm-node.service

  1. 验证服务状态
    bash

systemctl status gbhub-mgr gbhub-scheduler gbhub-sip zlm-node
docker ps | grep -E “valkey|greptime|me”

查看 zlm-node 日志(观察上报及 IP 获取情况):
bash

journalctl -u zlm-node -f

  1. 防火墙与端口开放(iptables/nftables)

需开放以下端口(根据实际访问需求调整):
服务 端口 协议 说明
gbhub-sip (SIP) 6060 UDP/TCP SIP 信令
MediaServer (HTTP API) 9080 TCP ZLM HTTP API / Web 页面
MediaServer (HTTPS API) 9443 TCP ZLM HTTPS API / Web 页面
MediaServer (RTP 控制) 9100 TCP RTP 控制端口
MediaServer (RTP 媒体流) 30000-35000 UDP/TCP RTP 媒体传输端口范围
gbhub-mgr API 3002 TCP 管理后台 API
gbhub-sip HTTP API 3003 TCP SIP HTTP 接口 / Webhook

注意:数据库(6379、4000-4003)和 Valkey 端口建议仅监听本地,不对外暴露。

7.1 使用 iptables(CentOS 7 / 传统系统)
bash

开放 SIP 信令

iptables -A INPUT -p udp --dport 6060 -j ACCEPT
iptables -A INPUT -p tcp --dport 6060 -j ACCEPT

开放 MediaServer API

iptables -A INPUT -p tcp --dport 9080 -j ACCEPT
iptables -A INPUT -p tcp --dport 9443 -j ACCEPT

开放 RTP 控制端口

iptables -A INPUT -p tcp --dport 9100 -j ACCEPT

开放 RTP 媒体流端口范围(UDP 和 TCP)

iptables -A INPUT -p udp --dport 30000:35000 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000:35000 -j ACCEPT

开放管理 API

iptables -A INPUT -p tcp --dport 3002 -j ACCEPT
iptables -A INPUT -p tcp --dport 3003 -j ACCEPT

保存规则(CentOS 7)

service iptables save

或 iptables-save > /etc/sysconfig/iptables

7.2 使用 nftables(Ubuntu 20.04+ / 现代发行版)
bash

添加规则(临时生效)

nft add rule inet filter input udp dport 6060 accept
nft add rule inet filter input tcp dport 6060 accept
nft add rule inet filter input tcp dport 9080 accept
nft add rule inet filter input tcp dport 9443 accept
nft add rule inet filter input tcp dport 9100 accept
nft add rule inet filter input udp dport 30000-35000 accept
nft add rule inet filter input tcp dport 30000-35000 accept
nft add rule inet filter input tcp dport 3002 accept
nft add rule inet filter input tcp dport 3003 accept

持久化保存(Ubuntu)

nft list ruleset > /etc/nftables.conf
systemctl enable nftables

提示:若在云平台(如阿里云、腾讯云、AWS)部署,还需在安全组/防火墙策略中放行相应端口。
  1. 常见问题及解决

    授权失败:确认 license.lic 已放入 /usr/local/gb/,机器码匹配。

    zlm-node 上报 401(认证失败):

     检查 /usr/local/gb/.env 中的 NODE_REPORT_TOKEN 是否为 NODE_TOKEN 的 Blake3 哈希值。
    
     确认两边的值完全一致(注意没有换行符等)。
    
     使用命令重新生成哈希值进行比对:
     bash
    
     echo -n "your_secret_token_here" | b3sum | awk '{print $1}'
    

    b3sum 命令未找到:安装 Rust 后执行 cargo install b3sum,或从 官方 Releases 下载预编译二进制。

    自动获取公网 IP 失败:手动设置 CUSTOM_IP。

    MediaServer 端口冲突:修改 config.ini 中端口,并同步修改 zlm-node 的 API_BASE 及 ZLM_HTTP_PORT。

    rtc.externIP 更新失败:确认 API_BASE 和 SECRET 正确,且 ENABLE_RTC_EXTERN_IP_UPDATE=true。

    RTP 媒体流不通:确认防火墙已开放 UDP/TCP 端口范围 30000-35000。

  2. 卸载清理
    bash

systemctl stop gbhub-mgr gbhub-scheduler gbhub-sip zlm-node
systemctl disable gbhub-mgr gbhub-scheduler gbhub-sip zlm-node
rm -f /etc/systemd/system/gbhub-*.service /etc/systemd/system/zlm-node.service
docker rm -f valkey greptime me
rm -rf /usr/local/gb /usr/local/zlm /data/valkey /data/greptimedb_data /data/m
docker rmi m valkey/valkey greptime-registry.cn-hangzhou.cr.aliyuncs.com/greptime/greptimedb:v1.1.4

  1. 环境变量速查表(zlm-node)
    变量名 说明 必填 默认值
    NODE_TOKEN 上报原始令牌(明文,程序内部会计算 Blake3 哈希后发送) 是 无
    NODE_REPORT_TOKEN 管理端 .env 中配置的预期哈希值(应为 NODE_TOKEN 的 Blake3 结果) 是(在 .env 中) 无
    SERVER_ID 节点 ID(与 mediaServerId 一致) 是 “1”
    API_BASE ZLM HTTP API 地址 是 http://127.0.0.1:9080
    SECRET ZLM API 密钥 是 935v73f7-bb6b-4889-a715-d9eb2d1936aa
    MGR_URL 管理端上报接口 是 http://127.0.0.1:3002/api/zlm/report-status
    CUSTOM_IP 手动指定公网 IP(最高优先级) 否 自动获取
    INTERFACE 指定网卡名称 否 无
    ZLM_HTTP_PORT ZLM HTTP 端口(拼接 URL) 否 9080
    USE_HTTPS 是否使用 HTTPS 构造播放地址 否 false
    HTTP_FMP4_BASE 手动指定 http_fmp4_base 否 自动生成
    STATIC_BASE 手动指定静态资源基地址 否 与 http_fmp4_base 相同
    REPORT_INTERVAL_SECS 上报间隔(秒) 否 30
    ENABLE_RTC_EXTERN_IP_UPDATE 自动更新 ZLM 的 rtc.externIP 否 true
    TLS_ACCEPT_INVALID_CERTS 接受无效 TLS 证书 否 false
    RUST_LOG 日志级别(info/warn/debug) 否 程序默认 info

部署完成后,请通过管理 API(http://服务器IP:3002)进行设备接入和配置。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐