From efb48b4030a105b1888c32e5cda348e01676b01f Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Wed, 12 Aug 2026 18:28:00 +0800 Subject: [PATCH] docs: document Sense Windows package workflow (#37) --- docs/00-project-profile.md | 17 +++++-- docs/02-architecture-and-code-map.md | 24 ++++++++-- docs/03-business-rules-and-glossary.md | 20 +++++++- docs/04-local-development-and-verification.md | 47 +++++++++++++++++-- docs/06-troubleshooting.md | 17 ++++++- docs/delivery/README.md | 15 +++++- 6 files changed, 122 insertions(+), 18 deletions(-) diff --git a/docs/00-project-profile.md b/docs/00-project-profile.md index 7915e6e..5d5ade4 100644 --- a/docs/00-project-profile.md +++ b/docs/00-project-profile.md @@ -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 # 项目档案 @@ -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` 仍为只读参考。 + + + +## 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 的用户会话。 + diff --git a/docs/02-architecture-and-code-map.md b/docs/02-architecture-and-code-map.md index f5ce75c..60c6f88 100644 --- a/docs/02-architecture-and-code-map.md +++ b/docs/02-architecture-and-code-map.md @@ -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 # 架构与代码地图 @@ -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` 是窄适配端口,不是跨项目契约。 + + + +## 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。 + diff --git a/docs/03-business-rules-and-glossary.md b/docs/03-business-rules-and-glossary.md index d694caf..a6f9a52 100644 --- a/docs/03-business-rules-and-glossary.md +++ b/docs/03-business-rules-and-glossary.md @@ -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 # 业务规则与术语 @@ -80,3 +80,19 @@ synchronized_at: 2026-08-12T09:32:06Z - **播放会话**:由当前 Sense 用户创建,最长两分钟;设备分页和媒体路径不以 16 路作为硬上限,页面一次只打开一路流。 - **区域版本**:坐标为 0..1 归一化值,并绑定 Device、Profile、宽高。每次发布或停用形成新版本;范围、点数、自交、退化、方向和期望版本由后端校验。Profile 分辨率变化后旧版本必须标记为需要重新校准。 + + + +## 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**:只有处置人或管理员可以完成;必须选择“确认有危险、误报、现场正常、无法确认”之一,可附备注。相同重复请求幂等,其他改变结果的请求被拒绝。 +- **审计事实**:成功生命周期事实只追加;失败、重复和拒绝尝试写入安全审计,但不记录令牌、密码或连接密钥。 + diff --git a/docs/04-local-development-and-verification.md b/docs/04-local-development-and-verification.md index 807f673..d63bdfe 100644 --- a/docs/04-local-development-and-verification.md +++ b/docs/04-local-development-and-verification.md @@ -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 # 本地开发与验证 @@ -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 部署验证。 + + + +## 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 或生产数据库。 + + + +## 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、系统服务、客户数据或秘密。 + diff --git a/docs/06-troubleshooting.md b/docs/06-troubleshooting.md index 6c750e7..ee57c52 100644 --- a/docs/06-troubleshooting.md +++ b/docs/06-troubleshooting.md @@ -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 # 故障排查 @@ -58,3 +58,16 @@ synchronized_at: 2026-08-12T09:32:15Z 自动测试不访问真实摄像头或未授权网络。PostgreSQL、MediaMTX、目标浏览器与实验室摄像机的联合验证必须在获准部署环境完成。 + + +## 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 验证替代。 + diff --git a/docs/delivery/README.md b/docs/delivery/README.md index 776afb2..208176a 100644 --- a/docs/delivery/README.md +++ b/docs/delivery/README.md @@ -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 # 交付文档指南 @@ -91,3 +91,14 @@ Sense 面向网管、实施人员和非技术现场人员,菜单按日常任 交付验收必须使用仓库外测试账户和获准实验室设备;文档、截图、工单和日志不得包含摄像机密码、Cookie、令牌、含凭据 URI 或客户真实画面。当前自动化已覆盖内部状态和安全边界;真实 PostgreSQL、MediaMTX、摄像机兼容与目标浏览器画面仍需实施人员验证。 + + +## 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` 是现场操作入口;不得把真实连接串、密码或令牌回填进示例文件后重新分发。 +