diff --git a/Task-67-Sense%E8%A7%86%E9%A2%91%E6%9C%8D%E5%8A%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E7%8A%B6%E6%80%81%E5%AF%B9%E8%B4%A6.-.md b/Task-67-Sense%E8%A7%86%E9%A2%91%E6%9C%8D%E5%8A%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E7%8A%B6%E6%80%81%E5%AF%B9%E8%B4%A6.-.md index 07f6fe8..9dd17a4 100644 --- a/Task-67-Sense%E8%A7%86%E9%A2%91%E6%9C%8D%E5%8A%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E7%8A%B6%E6%80%81%E5%AF%B9%E8%B4%A6.-.md +++ b/Task-67-Sense%E8%A7%86%E9%A2%91%E6%9C%8D%E5%8A%A1%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E4%B8%8E%E7%8A%B6%E6%80%81%E5%AF%B9%E8%B4%A6.-.md @@ -1,42 +1,58 @@ # 67 Sense视频服务生命周期与状态对账 -- 类型:需求 / 缺陷 / 重构 -- 所属 Epic:# -- 所属 MVP / 版本:# -- 状态:待验收 / 已完成 +- 类型:需求 +- 所属 Epic:#7 +- 所属 MVP / 版本:#8 +- 状态:待验收 - 日期:2026-08-14 -- Gitea 工单:https://git.ilapage.cn/ila/yovision/issues/67 -- Wiki 页面:Task-67-Sense视频服务生命周期与状态对账 -- Wiki revision:见本地镜像头 +- 工单:https://git.ilapage.cn/ila/yovision/issues/67 +- Pull Request:https://git.ilapage.cn/ila/yovision/pulls/85 +- 主项目:Sense ## 背景与目标 - +在 #66 已验证设备/Profile 上重建 MediaMTX 安全配置、独立进程生命周期、按需路径和持久化状态对账。Brain、Bell 不启动时可独立运行和验收。 ## 最终方案 - - -## 修改文件 - -- `<文件>`:<改动说明> +- MediaMTX 保持独立二进制;Sense 在 GoAdmin server 生命周期内启动后台对账,只停止自己启动的子进程。 +- Control API 只允许 loopback HTTP,禁用代理和重定向;检测到外部实例时标记“外部启动(受保护)”,孤儿安全闸禁止停止。 +- 路由只持久化 Device/Profile 引用、哈希路径、desired/actual、reader、失败次数、退避和下次重试,不保存带凭据 URI。 +- 摄像头凭据按需从 #65 内部端口读取,仅在 MediaMTX v1.19.3 loopback 请求边界临时组装,不进入基础配置、日志或 Sense API。 +- 接入成功后幂等建立路由;冷启动恢复 desired=running,明确 stopped 路径保持停止;稳定路径只刷新状态,不重复下发或增加版本。 +- 复用 GoAdmin JWT/Casbin/操作审计、迁移、动态菜单和 go-admin-ui BasicLayout、Element Plus Descriptions/Table/Tag/Button/MessageBox。 ## 验收结果 -| 验收标准 | 结果 | +| 标准 | 结果 | |---|---| -| | 通过 / 未通过 | +| 已验证 Profile 幂等建立/更新路径 | 单元测试及接入内部端口通过 | +| 进程未启动、启动中、失败和恢复可定位 | 状态机、真实二进制和页面反馈通过 | +| 冷启动恢复 running 路径 | PostgreSQL 17 重建 Service 测试通过 | +| reader、上游、退避、下次重试、孤儿闸可观察 | DTO、页面、退避和外部进程测试通过 | +| 配置、日志和 Sense API 不泄漏凭据 | loopback 边界、无秘密模型/响应及扫描通过 | +| MediaMTX 失败不破坏 Profile | 失败持久化测试确认 Profile 保持 ready | ## 测试 -- 执行命令:`<命令>` -- 结果: -- **未验证部分**: +- `go test ./...`、`go vet ./...`、`go build ./...`:通过。 +- `go test -race ./app/sense/media ./app/sense/reconcile`:通过。 +- 前端 lint:0 error,32 条上游/目录命名 warning。 +- 前端单测:10 suites、35 tests 通过。 +- 前端生产构建:通过,6 条上游继承 warning。 +- 真实 MediaMTX v1.19.3:Control API 就绪、path add/patch/delete 通过。 +- PostgreSQL 17:desired route 保存后重建 Service 并恢复为 ready 通过。 +- PostgreSQL 17 定向迁移:3 个菜单、12 条角色策略、1 条迁移记录通过。 +- Wiki 镜像检查:通过。 +- 已处理测试安全问题:MediaMTX 自动 TLS 文件的工作目录已固定到外部配置目录;临时证书/私钥未进入最终提交或远端。 +- 未验证部分:未连接客户真实摄像机和现场网络;真实上游持续拉流、reader 变化、端口 ACL 和目标浏览器留待授权现场验收。 +- 已知相邻问题:空白 PostgreSQL 执行完整上游迁移链时,在到达 #67 前被旧 `sys_config` 初始化字段长度问题中止;#67 定向迁移已通过,空库安装链应由 #70/#71 单独复核,不在本工单混改上游初始化。 -## 遗留问题 +## 回退 - +回退 PR #85 可移除运行时、路由和页面入口;已验证 Device/Profile 不受影响。媒体路由表保留可审计状态,停止/回退不删除摄像机数据。 ## 相关提交 -- `<提交哈希>` <提交说明> +- 19f9bfa feat: 重建 MediaMTX 生命周期与状态对账 (#67) +- 4149cc4 docs: 记录 Sense 视频服务生命周期 (#67)