83 lines
7.7 KiB
Markdown
83 lines
7.7 KiB
Markdown
|
|
# Monitor Windows 部署
|
|||
|
|
|
|||
|
|
## 客户安装与使用
|
|||
|
|
|
|||
|
|
支持 Windows 10/11 x64 的 CPU 部署。运行 `Monitor-Setup-x64.exe` 安装,随后双击桌面 Monitor。安装时需要管理员权限,安装器会要求指定日常运行的 Windows 账号(默认当前安装账号);如果使用了另一个管理员账号授权安装,应填写实际操作员的账号。日常启动使用该指定账号。首次启动只监听本机:导出机器申请、导入厂商签名授权、设置至少 12 位管理员密码并选择局域网网卡。完成后自动重启服务,浏览器访问 `http://127.0.0.1:10001/login`;其他电脑使用部署电脑的 IP。
|
|||
|
|
|
|||
|
|
程序目录在 `Program Files\Monitor`,运行数据在 `ProgramData\Monitor`。多 Windows 用户共享同一安装需要系统管理员明确授予数据目录权限,安装器不向所有本机用户开放密钥。不要把程序目录当作数据备份。
|
|||
|
|
|
|||
|
|
托盘可访问网页、查看状态、打开日志、重启和退出。关闭浏览器不会停止服务;退出托盘或注销 Windows 用户会结束服务。本版不是 Windows 系统服务,不自动开机启动。视频分析需登录后手动开始,已配置的录像和视频代理由后台启动。
|
|||
|
|
|
|||
|
|
初始防火墙规则仅作用于专用/域网络、本地子网与本程序。默认端口:Web TCP 10001;SIP TCP/UDP 15060;ZLM TCP 10002、10554、10935;RTP TCP/UDP 20002–40000(含 SIP 分配的 20002–30000 与 ZLM 的 30001–40000)。修改端口或网络网段后由管理员同步调整规则。不要把管理端暴露到公网;公网或不可信网络需要另行部署 HTTPS 与访问限制。
|
|||
|
|
|
|||
|
|
安装包不附带开发数据库、摄像头密码、模型、录像或发行私钥。模型通过后台上传;对会反序列化 Python 的 .pt 文件,须先验证来源,再在部署电脑执行:
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
& 'C:\Program Files\Monitor\Monitor.exe' --trust-model 'C:\ProgramData\Monitor\static\upload\weight\reviewed.pt' --yes
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 离线签发(仅厂商)
|
|||
|
|
|
|||
|
|
厂商保留源仓库与签发工具;客户只收到安装包和授权文件。使用 Ed25519,公钥编译关联到发行包,客户程序中没有签发私钥。
|
|||
|
|
|
|||
|
|
本次工作目录内的 `vendor-private/issuer.dpapi` 用当前 Windows 用户 DPAPI 加密,配套公钥是 `vendor-private/license-public.pem`。**不得将 vendor-private 发给客户或提交 Git。** DPAPI 私钥只能在原 Windows 用户及可用的原 DPAPI 凭据下解密;仅复制该文件不能保证重装系统后的恢复。长期发行建议由厂商另外生成带口令的可备份 PEM 私钥,并用对应公钥重新构建。
|
|||
|
|
|
|||
|
|
生成新发行密钥(不会覆盖已有文件):
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
& .build-venv/Scripts/python.exe deploy/windows/issue_license.py keygen --private-key '厂商离线目录/issuer.pem' --public-key '厂商离线目录/public.pem'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
签发有期限授权;省略 `--expires` 表示永久:
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
& .build-venv/Scripts/python.exe deploy/windows/issue_license.py issue --private-key vendor-private/issuer.dpapi --request '客户机器申请.json' --customer '客户名称' --expires '2027-12-31T23:59:59+08:00' --output '客户授权.json'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
机器指纹不依赖 IP/MAC。硬件或系统重装可能需要重新签发。过期、签名错误、机器不符或明显时间回拨会禁止业务;仍可在本机登录并续期。运行中发现失效会停止后台业务并切换为本机授权模式。离线方案无法可靠阻止本机管理员修改程序或回滚整机快照。
|
|||
|
|
|
|||
|
|
## 构建
|
|||
|
|
|
|||
|
|
需要 Windows x64 Python 3.12、Visual Studio C++ Build Tools、Windows SDK、Inno Setup 6.7.3。依赖来源锁定在 `requirements-windows-cpu.lock.txt` 与 `build-tools.lock.txt`。构建脚本使用独立 `.build-venv`,首次可复制当前已验证的 CPU 环境,再安装独立构建依赖;不会修改 `.venv`。
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
./deploy/windows/build.ps1 -PublicKey vendor-private/license-public.pem -PrepareEnvironment
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
如工具不在默认路径,提供 `-Vcvars` 和 `-Iscc`。也可分阶段执行:
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
& .build-venv/Scripts/python.exe deploy/windows/build.py --public-key vendor-private/license-public.pem --phase compile
|
|||
|
|
& .build-venv/Scripts/python.exe deploy/windows/build.py --public-key vendor-private/license-public.pem --phase bundle
|
|||
|
|
& .build-venv/Scripts/python.exe deploy/windows/build.py --public-key vendor-private/license-public.pem --phase installer
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
完整构建或 `--phase stage` 必须先执行。暂存区只会清理 `.windows-build` 下对应构建目录。业务模块及授权模块编译为 .pyd;Python 包与 Django 数字迁移保留自动生成的纯导入入口。构建会拒绝回退到未编译业务模块。模板及浏览器 JavaScript 必须随程序提供,不承诺隐藏客户端代码或绝对防逆向。
|
|||
|
|
|
|||
|
|
输出为 `dist/windows/Monitor-Setup-x64.exe`、SHA-256 校验文件与运行文件清单。没有代码签名证书时生成未签名安装包,Windows 可能提示未知发布者。可给 `build.py` 提供 `--sign-thumbprint` 使用证书库中的证书;生产签名的时间戳、证书权限由发行方管理。
|
|||
|
|
|
|||
|
|
## 数据保护、升级与诊断
|
|||
|
|
|
|||
|
|
安装器升级前要求原进程退出,并备份数据库(含存在的 WAL)、配置、密钥及授权;备份失败会中止覆盖安装。数据库迁移前也会自动备份数据库、配置与运行密钥。升级不重置用户、不重新生成已有加密密钥。卸载默认保留 ProgramData 数据。备份应包含整个数据目录,不能只备份 SQLite,否则摄像头密码等加密数据可能无法恢复。本版不自动导入旧开发目录数据库。
|
|||
|
|
|
|||
|
|
日志:`ProgramData\Monitor\log\desktop.log`、`service.log`、应用日志;ZLM 工作目录:`.runtime\zlm`。端口冲突不会自动杀死其他进程。服务失败会明确显示状态,不无限重启。
|
|||
|
|
|
|||
|
|
可在独立空数据目录运行离线自检(不会接入摄像头或加载客户模型):
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
$env:MONITOR_DATA_DIR = 'D:\Monitor-validation'
|
|||
|
|
& 'C:\Program Files\Monitor\Monitor.exe' --self-test
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
结果写入指定数据目录的 `.runtime/self-test.json`,错误见日志。验证后删除该进程环境变量,避免日常误用测试数据目录。
|
|||
|
|
|
|||
|
|
发布前须在干净 Windows 10/11 主机验收安装、普通用户运行、第二台局域网电脑访问、真实 RTSP/GB28181 接入与录像。当前开发机测试不能替代这些环境验收。商业分发须核实 Ultralytics、FFmpeg、ZLM、播放器与模型的许可;编译不会改变第三方许可义务。
|
|||
|
|
|
|||
|
|
## 第三方发行检查
|
|||
|
|
|
|||
|
|
当前附带 FFmpeg 报告版本为 `7.1-essentials_build-www.gyan.dev`,构建含 `--enable-gpl --enable-version3`。ZLM 二进制随原仓库提供,版本文件标记 `2025/05/11 master`。第三方包的许可文本随运行环境收集在 `third-party-notices`;这些文本不能替代对应源码提供义务或商业授权。当前产物用于部署验证,商业交付前仍须核验所用具体二进制、模型和播放器的完整授权链。
|
|||
|
|
|
|||
|
|
参考:[Ultralytics 官方许可](https://www.ultralytics.com/license)、[FFmpeg 官方许可说明](https://ffmpeg.org/legal.html)、[PyInstaller 对 Cython 和源码保护的说明](https://pyinstaller.org/en/stable/operating-mode.html#hiding-the-source-code)。
|
|||
|
|
|
|||
|
|
本机自动验证脚本:`tests/test_windows_license.py`(签名与机器约束)、`tests/windows_integration.py`(隔离数据库、CSRF、授权与初始化)、`tests/windows_lifecycle.py`(真实服务、到期续期、端口冲突与 Job Object)。生命周期测试要求显式指定可解密的厂商 DPAPI 测试签发密钥,生成的短期测试授权不得放入安装包。`--self-test` 还执行随机权重 YOLO 的 CPU 推理,仅验证执行链路,不代表模型准确率验收。
|