上个月给一个园区做视频监控平台对接,甲方要求所有摄像头必须走国标GB28181协议接入,原有的私有SDK方案直接作废。时间紧、任务重,我第一反应就是用wvp-GB28181-pro这套开源方案,配合Docker快速把环境搭起来。折腾了两三天,踩了不少坑,也积累了一些经验。今天就把整个从0到1的部署过程完整记录下来,给后面要搞国标接入的朋友做个参考。
先说清楚wvp-GB28181-pro是什么。它本质上是一套完整的GB28181信令服务加流媒体网关,后端用Java写的,主要负责SIP信令交互、设备目录管理、推拉流鉴权,前端是一套Vue的管理界面。配合ZLMediaKit作为流媒体服务器,可以实现摄像头国标接入、WebRTC播放、语音对讲、录像回放等一整套能力。这套东西你手动编译部署,环境依赖特别多,Java版本、Maven依赖、Node构建、ZLMediaKit编译,每一步都能把人逼疯。但用Docker的话,事情就简单很多,镜像拉下来直接跑,配置改改就能用。这篇文章不是纯教程复述,而是把我实际操作中遇到的问题、排查思路、配置细节全部摊开来讲,适合第一次接触GB28181和服务部署的读者,也适合那些已经被WVP折磨过想找一份完整参考的人。
1. 项目整体架构与部署思路拆解
1.1 wvp-GB28181-pro的技术组成
在动手部署之前,先把wvp-GB28181-pro这套系统的组成搞清楚,后面排错会省很多事。wvp-GB28181-pro不是一个单体应用,它由三个核心部分组成:
- wvp后端服务:Java Spring Boot项目,负责GB28181协议中的SIP信令处理、设备注册认证、目录查询、云台控制、录像计划等业务逻辑。它是整个系统的“大脑”。
- ZLMediaKit流媒体服务:C++编写的高性能流媒体服务器,负责接收摄像头推上来的RTP流,转封装成RTSP、RTMP、HLS、WebRTC等协议,供播放端拉流。它是系统的“血管”。
- wvp前端管理界面:Vue编写,提供设备管理、实时预览、录像回放、平台级联等操作的图形化界面。它是系统的“脸面”。
这三个部分,wvp后端和前端是独立镜像,ZLMediaKit又分成了带WebRTC功能的版本和不带WebRTC的版本。我第一次部署时就是没搞清楚这几个组件的分工,导致出了问题不知道去查哪个服务,走了很多弯路。
1.2 为什么选择Docker方式部署
官方文档提供两种部署方式,源码编译和Docker部署。源码编译这条路我试过一次,说实话体验很差。后端需要JDK8以上、Maven 3.6以上,前端需要Node 14以上,ZLMediaKit还需要自己编译依赖。光是把这些环境在服务器上配齐,就得消耗半天时间。更坑的是,ZLMediaKit编译过程中经常因为依赖库版本问题报错,网上搜的解决方案五花八门,试了一大堆才能编译通过。
Docker方式就优雅多了。官方在Docker Hub上维护了wvp-pro和ZLMediaKit的镜像,拉下来就是完整的运行环境,不污染宿主机。升级也方便,旧容器删掉重新拉新镜像跑就行。对于生产环境部署来说,Docker的隔离性也更好,即使wvp被攻击了,宿主机受到的波及也有限。
我在实际部署中采用的方案是:Docker部署wvp后端 + Docker部署ZLMediaKit + Docker部署数据库和缓存 + 前端镜像或者Nginx托管静态文件。这个方案把每个组件拆成独立容器,互不干扰,排错时也能定位得更准确。
1.3 部署前的网络与端口规划
这一步很多人会忽略,但恰恰是最关键的。GB28181协议涉及到的端口非常多,而且承载不同职责,规划不好后面接入摄像头必出问题。我梳理了一下,wvp整套系统需要用到以下端口:
| 端口 | 服务 | 协议 | 用途 |
|---|---|---|---|
| 5060 | wvp后端 | UDP/TCP | SIP信令传输,摄像头注册、心跳、指令下发都走这里 |
| 8080 | wvp后端 | TCP | 后端API接口,前端界面调用 |
| 8443 | wvp后端 | TCP | HTTPS接口,WebRTC播放信令交互 |
| 10000-20000 | ZLMediaKit | UDP/TCP | RTP媒体流接收,摄像头推流占用 |
| 1935 | ZLMediaKit | TCP | RTMP拉流(若需要) |
| 9999 | ZLMediaKit | TCP | HTTP-FLV拉流(若需要) |
| 8000 | ZLMediaKit | TCP | WebRTC拉流信令端口,新版是UDP 8000 |
| 30000-30500 | ZLMediaKit | UDP | WebRTC媒体端口范围(新版配置) |
如果你是部署在云服务器上,这些端口都要在安全组里放行。如果是内网部署,防火墙也要对应开通。我第一次就是在云服务器上只放行了8080和5060,结果摄像头注册上了但播放不了,排查了半天才发现是媒体端口没放行。
提示:如果摄像头和海康、大华等NVR对接,还要注意GB28181的SIP端口在摄像头侧是可以自定义的,要和wvp里配置的SIP端口保持一致,否则设备侧会显示注册失败。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Docker环境准备与镜像选型
2.1 Docker环境安装与加速配置
Docker环境是部署的前提,这一步要确保没有问题。我用的是Ubuntu 20.04服务器,安装命令很简单:
bash复制sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
安装完验证一下:docker --version,能输出版本号就说明装好了。另外推荐装一下docker-compose,后面管理多容器会方便很多:
bash复制sudo apt install -y docker-compos
