该部署会构建 inspect-nvr 应用镜像,并启动应用与 ZLMediaKit。Java 8、FFmpeg、海康 SDK 与大华 SDK 均位于应用镜像内,宿主机不需要另外安装 Java 或 Maven。业务数据直接连接远程 MySQL,Compose 不启动 MySQL 和 Redis 容器。
在 Ubuntu 项目根目录复制环境变量模板:
cp .env.example .env
至少修改 .env 中的 DB_URL、DB_USERNAME、DB_PASSWORD 和所有带 change_me 的密钥。远程 MySQL 必须允许 Ubuntu 宿主机所在地址连接。NVR 名称、IP、SDK/RTSP/HTTP 端口及账号密码全部维护在远程库的 basedata_eqpbook_nvr 表,摄像机维护在 ivs_camera,不再使用 HIK_NVR_* 环境变量。ZLM_API_SECRET 会在容器启动时写入临时配置,避免使用 ZLMediaKit 已禁止的公开示例密钥。若浏览器从局域网其他电脑访问,还要把 ZLM_HTTP_BASE_URL 改为 Docker 宿主机可访问的地址,例如:
ZLM_HTTP_BASE_URL=http://192.168.1.20:18081
模板默认使用国内 Maven 镜像源。部署环境在海外时,可按 .env.example 中的注释切回 Maven Central。FFmpeg 与海康、大华 SDK 均使用 x86_64 版本,在 amd64 宿主机上不需要 QEMU 模拟。
docker compose build inspect-nvr
docker compose up -d
docker compose ps
docker compose logs -f inspect-nvr
服务启动后可访问:
http://localhost:8081/http://localhost:8081/swagger-ui/index.htmlhttp://localhost:18081/停止服务:
docker compose down
Compose 使用命名卷保存 HLS、应用日志、SDK 日志和抓图数据,普通 docker compose down 不会删除这些数据。
Compose 不占用宿主机的 3306、6379 端口。应用通过 .env 中的连接参数直接访问远程 MySQL。
远程 MySQL 至少需要包含项目 Mapper 使用的以下表:
basedata_eqpbook_nvrivs_camera缺表时可参考 deploy/mysql/init/001-basedata-eqpbook-nvr.sql 和 docs/sql/ivs_camera.sql,但正式库应按现有数据库迁移流程执行,不要由容器自动建表。
basedata_eqpbook_nvr 中可以维护多台 NVR。页面会读取全部启用记录,并按各自 nvr_code 的 # 后缀关联 ivs_camera.nvr_code。每台可操作 NVR 必须配置名称、IP、SDK/RTSP/HTTP 端口及账号密码。可在远程数据库中检查:
SELECT nvr_id, patrol_device_name, nvr_code, nvr_ip,
sdk_port, rtsp_port, http_port, username, enabled
FROM basedata_eqpbook_nvr
WHERE enabled IS NULL OR enabled <> 0
ORDER BY nvr_id;
当前 Compose 不提供 Redis。项目中少量历史接口仍包含 Redis 缓存调用;不使用这些旧接口时不影响应用启动和当前海康 NVR 页面链路。若后续需要这些接口,应再接入外部 Redis 或移除对应缓存逻辑。
Compose 将应用固定为 linux/amd64,并从 lib/hik-linux64 和 lib/dahua-linux64 复制海康 HCNetSDK Linux64 与大华 NetSDK Linux64:
.so。docker compose ps
docker compose logs --tail 200 inspect-nvr
docker compose exec inspect-nvr java -version
docker compose exec inspect-nvr ffmpeg -version
docker compose exec inspect-nvr sh -c 'echo $LD_LIBRARY_PATH'
应用必须能从容器网络访问 NVR 的 SDK、RTSP 和 HTTP 端口。若宿主机能访问设备但容器不能访问,应优先检查 Docker Desktop/服务器路由、防火墙和设备所在网段,而不是修改 Java 配置。