docs: document Sense Windows package workflow (#37)

This commit is contained in:
QiuSW
2026-08-12 18:28:22 +08:00
parent e80180e2b6
commit efb48b4030
6 changed files with 122 additions and 18 deletions
+13 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Project-Profile
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Project-Profile.-
wiki_revision: 3f5324fdcb32700a628b7434f1d7800e4bb0f64f
synchronized_at: 2026-08-12T08:50:45Z
wiki_revision: 8d21b036c7a4077560b44790bb55602c84caaab1
synchronized_at: 2026-08-12T10:21:47Z
<!-- gitea-wiki-mirror:end -->
# 项目档案
@@ -19,7 +19,7 @@ synchronized_at: 2026-08-12T08:50:45Z
| 首期客户场景 | 民办寄宿学校,默认 16 路高风险点位 |
| 首期规则 | 越线、危险区域、聚集等匿名安全规则;不启用人脸 |
| 产品形态 | Sense 与 Bell 两个独立销售产品,Brain 为独立推理交付单元 |
| 当前阶段 | 新仓库文档与开发流程初始化,业务代码尚未迁移 |
| 当前阶段 | Sense 与 Bell 首个独立 MVP 纵切已实现并待验收;Brain 尚未初始化 |
| 历史来源 | `D:\OPC\yovision_old`,只读追溯 |
## 子项目与交付单元
@@ -42,7 +42,7 @@ synchronized_at: 2026-08-12T08:50:45Z
- 证据:客户侧 MinIO/S3 兼容对象存储;常态录像优先留在客户已有 NVR。
- 首期验证平台:NVIDIA x86/Jetson;M1-M3 不承诺 GB/T 28181、信创或原生 App。
业务代码尚未初始化;Sense/Bell 的 Go/Node 基线已冻结并记录于下文,Brain 的 Python/CUDA 版本仍须在对应骨架工单中冻结。
Sense 与 Bell 的独立业务骨架及首个 MVP 纵切已实现并待验收;Brain 尚未初始化。Sense/Bell 的 Go/Node 基线已冻结并记录于下文,Brain 的 Python/CUDA 版本仍须在对应骨架工单中冻结。
## 阅读入口
@@ -98,3 +98,12 @@ Sense、Bell 共用的可复现技术基线记录在仓库根 `goadmin-baseline.
Sense 已从冻结的 GoAdmin 基线初始化为独立产品:后端使用 Go 1.26.5 与 PostgreSQL,管理端使用 Node.js 22.22.1、pnpm 9.15.1、Vue 3.5.41、Element Plus 2.14.4 和 Vue CLI 5.0.9。产品代码只位于 `Sense/`,不依赖 Brain 或 Bell 启动;`D:\github\goadmin` 仍为只读参考。
<!-- sense-runtime:end -->
<!-- bell-runtime:start -->
## Bell 当前实现基线
Bell 已从冻结的 GoAdmin 基线实现独立 Event → Alert → ack → close 纵切:后端使用 Go 1.26.5 与独立 PostgreSQL 数据库,管理端使用 Node.js 22.22.1、pnpm 9.15.1、Vue 3.5.41、Element Plus 2.14.4 和 Vue CLI 5.0.9。产品代码只位于 `Bell/`,不依赖 Sense 或 Brain 启动;`D:\github\goadmin` 仍为只读参考。
Bell 不提供默认账户、默认密码或默认会话密钥。部署时必须从进程环境提供独立 `BELL_DATABASE_URL` 和至少 32 字符的 `BELL_SESSION_SECRET`;Cookie 固定为 `bell_session`,不接受 Sense 的用户会话。
<!-- bell-runtime:end -->
+20 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Architecture-and-Code-Map
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Architecture-and-Code-Map.-
wiki_revision: 45c9a75d6044a918d7da6b236cb7b1625c5713e3
synchronized_at: 2026-08-12T09:32:01Z
wiki_revision: 1712a8053f365781aef9cbf33c576c97491f31d4
synchronized_at: 2026-08-12T10:21:55Z
<!-- gitea-wiki-mirror:end -->
# 架构与代码地图
@@ -33,13 +33,13 @@ Bell 也可接收合成事件、传感器平台或第三方系统事件;Sense
|---|---|---|---|---|
| Sense 产品 | `Sense/` | `Sense/AGENTS.md`;后续 README/入口 | `Sense/` 内测试 | 高:设备、媒体、凭据、并发对账 |
| Brain 推理 | `Brain/` | `Brain/AGENTS.md`;后续包入口 | `Brain/` 内测试与契约测试 | 高:模型、GPU、隐私、事件语义 |
| Bell 产品 | `Bell/` | `Bell/AGENTS.md`;后续 README/入口 | `Bell/` 内测试 | 高:认证、事件、告警状态机、通知 |
| Bell 产品 | `Bell/` | `Bell/README.md`、`Bell/server/main.go`、`Bell/web/src/main.js` | `Bell/server` Go 测试与 `Bell/web` lint/build | 高:认证、不可变事件、告警状态机、并发处置 |
| 共享契约 | `contracts/` | `contracts/AGENTS.md` | 三端消费者/生产者测试 | 高:兼容性与跨项目影响 |
| Harness | `dev_scripts/` | `check_harness.py` | `tests/` | 中 |
| 工单模板 | `.gitea/issue_template/` | `task.md` | Harness 严格检查 | 中 |
| Wiki 镜像 | `docs/` | `docs/README.md` | `sync_wiki_docs.py --check` | 低;禁止直接编辑 |
业务代码尚未迁入;具体函数、路由和测试入口必须随各项目骨架工单更新,不复制旧仓库代码地图。
Sense 与 Bell 已建立独立业务入口;Brain 的具体函数、路由和测试入口仍须随骨架工单更新,不复制旧仓库代码地图。
## 两条主要执行路径
@@ -108,3 +108,19 @@ Sense 后端功能以 `Sense/server/app/sense/` 为根,并通过 `Sense/server
前端在 `Sense/ui/src/{api,views,router/modules,components}/sense/` 使用对应模块;通用页面复用 Element Plus 表单、表格、分页、Dialog、Tag 和应用容器,只为播放器与区域画布新增局部业务组件。项目内 `identity.RecordAudit`、`device.ReadCredential`、`admission.VerifiedProfile`、`media.PlaybackRoute` 和 `area.ExportCurrent` 是窄适配端口,不是跨项目契约。
<!-- sense-mvp:end -->
<!-- bell-mvp:start -->
## Bell MVP 模块地图
- `Bell/server/main.go` 与 `cmd/bell/root.go`:命令入口、配置、迁移、HTTP 注册和优雅退出。
- `Bell/server/app/auth/`、`rbac/`、`audit/`:Bell 独立账户、bcrypt 密码、服务端会话、管理员/操作员/只读角色与只追加审计。
- `Bell/server/app/event/`、`receipt/`:不可变 Event、`(producer_id, source_event_id)` 永久幂等回执和游标查询。
- `Bell/server/app/synthetic/` 与 `server/testdata/events/`:只在 development/test 注册的匿名合成事件,复用正式 Event 服务。
- `Bell/server/app/rule/`:规则版本、每次评估解释、实际规则快照和按规则/地点关联 Alert。
- `Bell/server/app/alert/query/`、`alert/lifecycle/`:Event/Alert 双向追溯、单一 ack 获胜者、结果必填的 close、幂等重复和只追加时间线。
- `Bell/server/migrations/`:事务迁移与数据库不可变触发器;所有表只属于 Bell 数据库。
- `Bell/web/src/{api,views,store,layout}/`:Vue 3 + Element Plus 管理端,一级导航为工作台、预警管理、事件查询、规则配置;系统与合成入口按权限/环境出现。
Event 写入、幂等 Receipt、规则评估和 Alert 创建/关联处于同一数据库事务;规则或关联失败时不保留半成品 Event。一个 Event 可匹配多个规则,一个未关闭 Alert 可聚合相同规则与地点的多个 Event。
<!-- bell-mvp:end -->
+18 -2
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Business-Rules-and-Glossary
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Business-Rules-and-Glossary.-
wiki_revision: 36a49f985cdd6ebd93759273fbc53158ba13b152
synchronized_at: 2026-08-12T09:32:06Z
wiki_revision: 2b222ffc8c2d943fa2a27d9e28ffaf4896143950
synchronized_at: 2026-08-12T10:21:57Z
<!-- gitea-wiki-mirror:end -->
# 业务规则与术语
@@ -80,3 +80,19 @@ synchronized_at: 2026-08-12T09:32:06Z
- **播放会话**:由当前 Sense 用户创建,最长两分钟;设备分页和媒体路径不以 16 路作为硬上限,页面一次只打开一路流。
- **区域版本**:坐标为 0..1 归一化值,并绑定 Device、Profile、宽高。每次发布或停用形成新版本;范围、点数、自交、退化、方向和期望版本由后端校验。Profile 分辨率变化后旧版本必须标记为需要重新校准。
<!-- sense-mvp:end -->
<!-- bell-mvp:start -->
## Bell MVP 业务与安全规则
- **独立身份**:Bell 仅接受自己的 `bell_session`;管理员管理用户、角色与规则,操作员读取事件/预警并处置,只读用户仅查询。后端权限是最终边界。
- **安全初始化**:系统没有默认用户、密码或签名密钥;首次管理员密码只通过一次性进程环境传入,密码至少 12 位且包含大小写字母和数字。
- **Event 与 Receipt**:Event 正文不可更新或删除。相同 `(producer_id, source_event_id)` 与相同 payload 返回原回执;相同键但不同 payload 返回冲突,跨进程重启仍成立。
- **合成事件**:只在 development/test 注册,使用虚构匿名 fixture,并走与未来生产者适配器相同的 Event/Receipt 服务;production 直接请求返回 404。
- **规则评估**:每个已接收 Event 都记录匹配或未匹配解释。匹配时固化实际规则快照;未匹配 Event 保持可查询,不能标成已通知或已处置。
- **Alert 关联**:同一 Event 可产生多个 Alert;同一规则与地点的多个 Event 可聚合到同一未关闭 Alert,Event 与 Alert 双向可追溯。
- **处置状态**:界面“待处理”对应新 Alert,“处理中/已看到”对应首个成功 ack,“已完成”对应记录现场结果后的 close。普通用户不需要理解 Event/Alert 内部模型,技术详情仍保留完整事实链。
- **并发 ack**:PostgreSQL 条件更新只允许首个操作员成为处置人;后来者得到真实处置人,不能覆盖。
- **close**:只有处置人或管理员可以完成;必须选择“确认有危险、误报、现场正常、无法确认”之一,可附备注。相同重复请求幂等,其他改变结果的请求被拒绝。
- **审计事实**:成功生命周期事实只追加;失败、重复和拒绝尝试写入安全审计,但不记录令牌、密码或连接密钥。
<!-- bell-mvp:end -->
+43 -4
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Local-Development-and-Verification
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Local-Development-and-Verification.-
wiki_revision: 0a0354b0fed4c7edc68a1c6c887a0f2886e47541
synchronized_at: 2026-08-12T08:50:58Z
wiki_revision: 3bf0987ec9d7ddf543602e465faa088aead46531
synchronized_at: 2026-08-12T10:22:02Z
<!-- gitea-wiki-mirror:end -->
# 本地开发与验证
@@ -59,7 +59,7 @@ Sense/Bell 的 Go、Node 与 pnpm 基线已冻结并记录于下文;Brain 的
|---|---|---|---|---|
| Sense | 待骨架工单冻结 | 待冻结 | 待冻结 | 未初始化业务代码 |
| Brain | 待骨架工单冻结 | 待冻结 | 待冻结 | 未初始化业务代码 |
| Bell | 待骨架工单冻结 | 待冻结 | 待冻结 | 未初始化业务代码 |
| Bell | `go build ./...`;`pnpm build:prod` | `go test ./...`;`pnpm lint` | `go run . migrate`;`go run . serve`;`pnpm dev` | 首个独立纵切已实现,待验收 |
不得复制旧仓库命令来填空。每个骨架工单必须同时建立 README、可复制命令和最小测试。
@@ -107,7 +107,7 @@ pnpm --version
`D:\github\goadmin` 下三个仓库只允许读取和核对,不允许在其中开发或提交 yovision 产品代码。本机路径不是跨机器事实;缺少该路径时,应从清单中的上游 URL 检出相同 commit 到仓库外目录。
截至 2026-08-12 的本机核对结果:Go 1.23.0,不满足 go-admin `go.mod` 声明的 Go 1.26.5;Node.js 22.22.1 符合基线;pnpm 尚未安装,Corepack 0.34.6 可用。因此后端构建和 pnpm 前端构建均未完成验证。安装隔离的 Go 1.26.5 并通过 Corepack 启用 pnpm 9.15.1 后,才可执行后续骨架构建验收。
截至 2026-08-12,系统 Go 1.23.0 仍不满足基线;开发机已在仓库外安装并校验隔离 Go 1.26.5,并通过 Corepack 使用 pnpm 9.15.1。Sense、Bell 的后端测试/构建与前端 lint/build 已在该隔离工具链完成。隔离目录是开发机临时事实,不得写入部署配置;其他机器应从官方来源安装相同精确版本。
`go-admin-doc` 只用于理解上游框架;项目自己的架构、开发规则和版本事实仍以 yovision Wiki、Agent 规则与 `goadmin-baseline.json` 为准。
@@ -132,3 +132,42 @@ powershell -ExecutionPolicy Bypass -File .\Sense\scripts\bootstrap\smoke.ps1
正式后端启动必须设置 `SENSE_DATABASE_MODE=postgres` 和仓库外提供的 `SENSE_DATABASE_URL`。健康检查为 `GET /healthz`,就绪检查为 `GET /readyz`。本地 smoke 明确设置 `SENSE_DATABASE_MODE=memory`,不能代替 PostgreSQL 部署验证。
<!-- sense-runtime:end -->
<!-- bell-runtime:start -->
## Bell 本地构建与验证
先从根 `goadmin-baseline.json` 核对精确版本,再从仓库外环境设置 Bell 专用数据库与会话密钥。命令中的值只能使用本地测试凭据,不得提交:
```powershell
powershell -ExecutionPolicy Bypass -File .\Bell\scripts\bootstrap\check-toolchain.ps1
Set-Location Bell\server
go test ./...
go build ./...
go run . migrate
go run . serve
Set-Location ..\web
corepack pnpm@9.15.1 install --frozen-lockfile
corepack pnpm@9.15.1 lint
corepack pnpm@9.15.1 build:prod
```
后端启动前必须提供独立 `BELL_DATABASE_URL` 与至少 32 字符的 `BELL_SESSION_SECRET`;`BELL_ENV` 可取 development、test、production。健康检查为 `GET /healthz`,就绪检查为 `GET /readyz`。首次管理员用 `go run . create-admin` 创建,密码通过 `BELL_BOOTSTRAP_PASSWORD` 进程环境一次性提供。
在 Sense、Brain 停止时,development/test 可使用“合成事件测试”完成 Event 入站、规则匹配、Alert 关联、ack 和结果必填 close。production 必须验证 `/api/v1/synthetic/*` 返回 404。PostgreSQL 集成测试使用空的 Bell 专用测试数据库,禁止复用 Sense 或生产数据库。
<!-- bell-runtime:end -->
<!-- sense-windows-package:start -->
## Sense Windows 打包与产物验证
将冻结的 Go 1.26.5 放在 `PATH` 首位后,从仓库根目录运行:
```powershell
cmd /c .\Sense\scripts\package-windows.bat
Get-FileHash .\Sense\dist\sense-windows-amd64.zip -Algorithm SHA256
```
脚本精确校验 Node 22.22.1 和 pnpm 9.15.1,冻结安装并构建前端,以 Windows amd64/CGO 关闭方式编译后端,然后生成被 Git 忽略的 `Sense\dist\sense-windows-amd64\` 和 ZIP。可重复运行只会覆盖这两个固定产物。
解压后运行 `start-sense.bat demo` 可做内存模式临时预览;生产运行 `start-sense.bat` 前必须从仓库和运行包外注入 PostgreSQL URL、签名密钥、引导令牌和摄像头凭据加密密钥。包内不含 PostgreSQL、MediaMTX、系统服务、客户数据或秘密。
<!-- sense-windows-package:end -->
+15 -2
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Troubleshooting
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Troubleshooting
wiki_revision: 3ee073ae07bb2ab04f02b1178b6d289f6f5a2063
synchronized_at: 2026-08-12T09:32:15Z
wiki_revision: a076590915040eae0d165be6254c6302f308fc5a
synchronized_at: 2026-08-12T10:22:09Z
<!-- gitea-wiki-mirror:end -->
# 故障排查
@@ -58,3 +58,16 @@ synchronized_at: 2026-08-12T09:32:15Z
自动测试不访问真实摄像头或未授权网络。PostgreSQL、MediaMTX、目标浏览器与实验室摄像机的联合验证必须在获准部署环境完成。
<!-- sense-mvp:end -->
<!-- sense-windows-package:start -->
## Sense Windows 打包与启动排错
| 现象 | 检查与处理 |
|---|---|
| 打包提示 Go/Node/pnpm 版本不符 | 对照根 `goadmin-baseline.json` 安装精确版本,并把 Go 1.26.5 放到 `PATH` 首位;不要修改脚本绕过版本检查。 |
| 生产启动提示缺少环境变量 | 在运行包外设置 `SENSE_DATABASE_URL`、`SENSE_IDENTITY_SIGNING_KEY`、`SENSE_BOOTSTRAP_TOKEN`、`SENSE_CREDENTIAL_KEY`;启动脚本不会读取示例文件。 |
| 本机健康检查被代理返回空响应 | localhost 可能被 `HTTP_PROXY` 接管;测试工具应对 `127.0.0.1` 使用 no-proxy,再检查 `SENSE_HTTP_ADDRESS` 端口占用。 |
| 页面可打开但视频不可用 | Windows 运行包不包含 MediaMTX;按包内说明配置独立 MediaMTX 二进制、配置和 Control API。 |
`demo` 只用于临时查看。生产数据持久性、真实设备和媒体链路不能用 demo 验证替代。
<!-- sense-windows-package:end -->
+13 -2
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Delivery-Documentation-Guide
wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Delivery-Documentation-Guide.-
wiki_revision: 9847e4c065e513107f8f79617c6529a8300874cb
synchronized_at: 2026-08-12T09:32:40Z
wiki_revision: 8127e9a6e6a92ed192639232bdc8813f5a9dea51
synchronized_at: 2026-08-12T10:25:18Z
<!-- gitea-wiki-mirror:end -->
# 交付文档指南
@@ -91,3 +91,14 @@ Sense 面向网管、实施人员和非技术现场人员,菜单按日常任
交付验收必须使用仓库外测试账户和获准实验室设备;文档、截图、工单和日志不得包含摄像机密码、Cookie、令牌、含凭据 URI 或客户真实画面。当前自动化已覆盖内部状态和安全边界;真实 PostgreSQL、MediaMTX、摄像机兼容与目标浏览器画面仍需实施人员验证。
<!-- sense-mvp:end -->
<!-- sense-windows-package:start -->
## Sense Windows 运行包交付
交付对象为实施和运维人员。`sense-windows-amd64.zip` 包含后端程序、已构建前端、空值示例配置、上游许可证、启动脚本与包内说明;不包含 PostgreSQL、MediaMTX、Windows 服务、生产数据或秘密。
- 临时查看必须显式运行 `start-sense.bat demo`,其内存数据在进程结束后丢失,不能当作生产部署。
- 生产启动前由运维在运行包外安全注入数据库、身份签名、初始化令牌和凭据加密配置,再运行 `start-sense.bat`。
- 交付时记录 ZIP SHA-256,并至少验证 `/healthz` 与首页;真实 PostgreSQL、MediaMTX、摄像机和目标浏览器仍需在获准环境验收。
- 包内 `README-WINDOWS.md` 是现场操作入口;不得把真实连接串、密码或令牌回填进示例文件后重新分发。
<!-- sense-windows-package:end -->