# Docker Compose 部署 该部署会构建 `inspect-nvr` 应用镜像,并启动应用与 ZLMediaKit。Java 8、FFmpeg、海康 SDK 与大华 SDK 均位于应用镜像内,宿主机不需要另外安装 Java 或 Maven。业务数据直接连接远程 MySQL,Compose 不启动 MySQL 和 Redis 容器。 ## 1. 准备配置 在 Ubuntu 项目根目录复制环境变量模板: ```bash 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 宿主机可访问的地址,例如: ```text ZLM_HTTP_BASE_URL=http://192.168.1.20:18081 ``` 模板默认使用国内 Maven 镜像源。部署环境在海外时,可按 `.env.example` 中的注释切回 Maven Central。FFmpeg 与海康、大华 SDK 均使用 x86_64 版本,在 amd64 宿主机上不需要 QEMU 模拟。 ## 2. 构建并启动 ```bash docker compose build inspect-nvr docker compose up -d docker compose ps docker compose logs -f inspect-nvr ``` 服务启动后可访问: - 应用首页:`http://localhost:8081/` - Swagger UI:`http://localhost:8081/swagger-ui/index.html` - ZLMediaKit HTTP/HLS:`http://localhost:18081/` 停止服务: ```bash docker compose down ``` Compose 使用命名卷保存 HLS、应用日志、SDK 日志和抓图数据,普通 `docker compose down` 不会删除这些数据。 Compose 不占用宿主机的 `3306`、`6379` 端口。应用通过 `.env` 中的连接参数直接访问远程 MySQL。 ## 3. 数据库说明 远程 MySQL 至少需要包含项目 Mapper 使用的以下表: - `basedata_eqpbook_nvr` - `ivs_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 端口及账号密码。可在远程数据库中检查: ```sql 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 或移除对应缓存逻辑。 ## 4. CPU 架构限制 Compose 将应用固定为 `linux/amd64`,并从 `lib/hik-linux64` 和 `lib/dahua-linux64` 复制海康 HCNetSDK Linux64 与大华 NetSDK Linux64: - x86_64 Ubuntu/Linux 服务器可原生构建和运行,不需要安装 QEMU。 - x86_64 Windows/macOS 的 Docker Desktop 可直接运行 Linux amd64 容器。 - ARM64 服务器不能运行当前镜像;如需 ARM64,应使用对应架构的两套厂商 SDK 另行构建镜像,不能混用 `.so`。 ## 5. 常用排查命令 ```bash 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 配置。