[SEN] 在 GoAdmin 基线上重建 MediaMTX 配置、生命周期与状态对账 #67

Closed
opened 2026-08-14 10:26:39 +08:00 by ila · 3 comments
Owner

状态

已完成

基本信息

  • 类型:需求 / 新 GoAdmin 基线重建
  • 任务类型:单项目独立任务
  • 主项目:Sense
  • 主 agent:Sense agent
  • 所属 Epic:#7
  • 所属 MVP:#8
  • 前置工单:#66
  • 是否允许与前置工单并行:否
  • 原因:媒体期望配置必须来自已持久化并验证的设备/Profile/RTSP 输入。
  • 独立运行:Brain、Bell 均不启动时完成实现和验收

原始需求与追溯

  • 来源:用户于 2026-08-14 要求先建立 Sense 全部独立任务工单;Product-Requirements、Product-Roadmap、Requirements-Migration-Matrix。
  • 需求摘要:在 #61 冻结 GoAdmin/go-admin-ui 源码派生骨架上,重新实现 Sense 独立纵切;旧 explore 只用于业务、测试和故障证据,不复制自研基础框架。
  • 历史对照:#25、#51、#54 的路由创建、Control API 就绪、路径恢复和错误状态经验。

目标

保持 MediaMTX 为独立二进制,由 Sense 管理安全配置、进程生命周期、按需拉流路径、reader/上游实际态和幂等对账。

做什么

实现路径期望态、增改删除、启动就绪等待、冷启动恢复、退避重试、孤儿安全闸、状态采集和脱敏诊断;接入成功后幂等建立媒体路由。

不做什么

不把媒体内核嵌入 GoAdmin handler 或 GORM model;不实现浏览器播放页面;不修改根级部署;不把凭据写入日志或公开配置。

GoAdmin 复用与文档门禁

  • 必须沿用 #61 建立的 Cobra、Gin、GORM、Casbin、JWT、迁移、Router、Store、Axios、Layout 和权限链。
  • 优先复用 go-admin-ui 的页面容器、搜索栏、表格、表单、分页、Dialog、Tag、权限按钮和反馈组件。
  • 冻结 go-admin-doc 必查:cmd/server.md、advanced/config.md、service.md、db.md、router.md。
  • 在工单评论记录实际阅读文件、采用方式及无法复用而新增的业务组件。
  • 不永久删除默认模块;无关能力采用菜单、路由、权限和后端访问同时禁用。

写路径

  • Sense/server/app/sense/media/**
  • Sense/server/app/sense/reconcile/**
  • Sense/server/config/mediamtx/**
  • Sense/server/cmd/migrate/migration/version/*media*
  • Sense/ui/src/views/sense/media/**
  • Sense/ui/src/api/sense/media*
  • Sense/server/tests/media/**
  • Sense/server/app/admin/router/sense_media.go
  • Sense/server/cmd/api/server.go
  • Sense/server/app/sense/admission/apis.go
  • Sense/ui/tests/unit/sense/media*.spec.js
  • Sense/README.md

禁止写入:Brain/**、Bell/**、contracts/**、根级部署配置。任务归档阶段仅允许按 Wiki 主源流程同步 docs/** 与 wiki-docs.json。如实现发现必须修改这些路径,停止并转协同工单。

文档影响

更新 MediaMTX 二进制位置、配置生成、生命周期、Control API、冷启动恢复、状态与排错。

长期文档先更新 Gitea Wiki;本地 docs/ 镜像由单一协调工单同步,避免共享路径冲突。

验收标准

  • 已验证 Profile 可幂等建立和更新 MediaMTX 路径
  • MediaMTX 未启动、启动中、失败和恢复状态可定位
  • Sense/MediaMTX 冷启动后恢复 desired=running 路径
  • reader、上游拉流、退避、下次重试和孤儿安全闸可观察
  • 配置、日志和 API 不泄漏摄像头凭据
  • MediaMTX 失败不破坏设备/Profile 已验证状态

验证方式

  • 配置渲染、进程控制、对账状态机与并发单元测试
  • 真实 MediaMTX Control API 集成和冷启动恢复测试
  • 重复 add/replace、进程退出、端口冲突和凭据扫描
  • Brain/Bell 不启动的媒体路由 smoke

风险与回退

进程管理和错误对账可能产生僵尸进程或错误路径。使用受控测试目录与端口,限制重试;回退配置和任务迁移,不删除摄像机数据。

协同需求摘要

本工单不建立跨项目契约。发现 Sense→Brain 源/区域配置或 Sense/Brain→Bell 事件/证据需求时,只记录生产者、消费者、目的与建议验证,不取得共享写路径。

实施结果(2026-08-14)

  • 实现提交:19f9bfa;长期文档提交:4149cc4;待验收归档镜像提交:263a68c;验收镜像提交:35b9c7b。
  • PR:#85 已合并到 dev,merge commit:b1bdb91fdb94711d2e974a663687265691f393b1。
  • 后端 go test ./...、go vet ./...、go build ./... 通过;媒体/对账 race 测试通过。
  • 前端 lint 0 error(32 条继承/目录 warning),10 suites / 35 tests 通过,生产构建通过(6 条继承 warning)。
  • 本机真实 MediaMTX v1.19.3 Control API 就绪、path add/patch/delete 通过;PostgreSQL 17 冷启动恢复通过;定向迁移验证 3 个菜单、12 条策略、1 条迁移记录。
  • Wiki 归档:Task-67-Sense视频服务生命周期与状态对账,revision 4642924705d7a3406874ef532579fb2d6a25a88b;镜像一致性检查通过。
  • 测试期间 MediaMTX 自动生成的临时 TLS 证书/私钥已在推送前从最终提交和对应松散 Git 对象移除;进程工作目录已固定为仓库外配置目录,HEAD/远端不含该生成物。
  • 未验证:客户真实摄像机、现场网络、持续上游拉流、reader 变化和目标浏览器。
  • 相邻已知问题:空白 PostgreSQL 的完整上游迁移链在到达 #67 前被既有 sys_config 字段长度问题中止;#67 定向迁移已在 PostgreSQL 17 通过。空库安装链留给 #70/#71 复核,不混入本工单。

验收结论(2026-08-14)

用户明确验收通过;工单归档完成并合并到 dev。

## 状态 已完成 ## 基本信息 - 类型:需求 / 新 GoAdmin 基线重建 - 任务类型:单项目独立任务 - 主项目:Sense - 主 agent:Sense agent - 所属 Epic:#7 - 所属 MVP:#8 - 前置工单:#66 - 是否允许与前置工单并行:否 - 原因:媒体期望配置必须来自已持久化并验证的设备/Profile/RTSP 输入。 - 独立运行:Brain、Bell 均不启动时完成实现和验收 ## 原始需求与追溯 - 来源:用户于 2026-08-14 要求先建立 Sense 全部独立任务工单;Product-Requirements、Product-Roadmap、Requirements-Migration-Matrix。 - 需求摘要:在 #61 冻结 GoAdmin/go-admin-ui 源码派生骨架上,重新实现 Sense 独立纵切;旧 `explore` 只用于业务、测试和故障证据,不复制自研基础框架。 - 历史对照:#25、#51、#54 的路由创建、Control API 就绪、路径恢复和错误状态经验。 ## 目标 保持 MediaMTX 为独立二进制,由 Sense 管理安全配置、进程生命周期、按需拉流路径、reader/上游实际态和幂等对账。 ## 做什么 实现路径期望态、增改删除、启动就绪等待、冷启动恢复、退避重试、孤儿安全闸、状态采集和脱敏诊断;接入成功后幂等建立媒体路由。 ## 不做什么 不把媒体内核嵌入 GoAdmin handler 或 GORM model;不实现浏览器播放页面;不修改根级部署;不把凭据写入日志或公开配置。 ## GoAdmin 复用与文档门禁 - 必须沿用 #61 建立的 Cobra、Gin、GORM、Casbin、JWT、迁移、Router、Store、Axios、Layout 和权限链。 - 优先复用 go-admin-ui 的页面容器、搜索栏、表格、表单、分页、Dialog、Tag、权限按钮和反馈组件。 - 冻结 go-admin-doc 必查:`cmd/server.md`、`advanced/config.md`、`service.md`、`db.md`、`router.md`。 - 在工单评论记录实际阅读文件、采用方式及无法复用而新增的业务组件。 - 不永久删除默认模块;无关能力采用菜单、路由、权限和后端访问同时禁用。 ## 写路径 - `Sense/server/app/sense/media/**` - `Sense/server/app/sense/reconcile/**` - `Sense/server/config/mediamtx/**` - `Sense/server/cmd/migrate/migration/version/*media*` - `Sense/ui/src/views/sense/media/**` - `Sense/ui/src/api/sense/media*` - `Sense/server/tests/media/**` - `Sense/server/app/admin/router/sense_media.go` - `Sense/server/cmd/api/server.go` - `Sense/server/app/sense/admission/apis.go` - `Sense/ui/tests/unit/sense/media*.spec.js` - `Sense/README.md` 禁止写入:`Brain/**`、`Bell/**`、`contracts/**`、根级部署配置。任务归档阶段仅允许按 Wiki 主源流程同步 `docs/**` 与 `wiki-docs.json`。如实现发现必须修改这些路径,停止并转协同工单。 ## 文档影响 更新 MediaMTX 二进制位置、配置生成、生命周期、Control API、冷启动恢复、状态与排错。 长期文档先更新 Gitea Wiki;本地 `docs/` 镜像由单一协调工单同步,避免共享路径冲突。 ## 验收标准 - [x] 已验证 Profile 可幂等建立和更新 MediaMTX 路径 - [x] MediaMTX 未启动、启动中、失败和恢复状态可定位 - [x] Sense/MediaMTX 冷启动后恢复 desired=running 路径 - [x] reader、上游拉流、退避、下次重试和孤儿安全闸可观察 - [x] 配置、日志和 API 不泄漏摄像头凭据 - [x] MediaMTX 失败不破坏设备/Profile 已验证状态 ## 验证方式 - 配置渲染、进程控制、对账状态机与并发单元测试 - 真实 MediaMTX Control API 集成和冷启动恢复测试 - 重复 add/replace、进程退出、端口冲突和凭据扫描 - Brain/Bell 不启动的媒体路由 smoke ## 风险与回退 进程管理和错误对账可能产生僵尸进程或错误路径。使用受控测试目录与端口,限制重试;回退配置和任务迁移,不删除摄像机数据。 ## 协同需求摘要 本工单不建立跨项目契约。发现 Sense→Brain 源/区域配置或 Sense/Brain→Bell 事件/证据需求时,只记录生产者、消费者、目的与建议验证,不取得共享写路径。 ## 实施结果(2026-08-14) - 实现提交:`19f9bfa`;长期文档提交:`4149cc4`;待验收归档镜像提交:`263a68c`;验收镜像提交:`35b9c7b`。 - PR:#85 已合并到 `dev`,merge commit:`b1bdb91fdb94711d2e974a663687265691f393b1`。 - 后端 `go test ./...`、`go vet ./...`、`go build ./...` 通过;媒体/对账 race 测试通过。 - 前端 lint 0 error(32 条继承/目录 warning),10 suites / 35 tests 通过,生产构建通过(6 条继承 warning)。 - 本机真实 MediaMTX v1.19.3 Control API 就绪、path add/patch/delete 通过;PostgreSQL 17 冷启动恢复通过;定向迁移验证 3 个菜单、12 条策略、1 条迁移记录。 - Wiki 归档:`Task-67-Sense视频服务生命周期与状态对账`,revision `4642924705d7a3406874ef532579fb2d6a25a88b`;镜像一致性检查通过。 - 测试期间 MediaMTX 自动生成的临时 TLS 证书/私钥已在推送前从最终提交和对应松散 Git 对象移除;进程工作目录已固定为仓库外配置目录,HEAD/远端不含该生成物。 - 未验证:客户真实摄像机、现场网络、持续上游拉流、reader 变化和目标浏览器。 - 相邻已知问题:空白 PostgreSQL 的完整上游迁移链在到达 #67 前被既有 `sys_config` 字段长度问题中止;#67 定向迁移已在 PostgreSQL 17 通过。空库安装链留给 #70/#71 复核,不混入本工单。 ## 验收结论(2026-08-14) 用户明确验收通过;工单归档完成并合并到 `dev`。
ila added the kind/taskproject/sensescope/independentpriority/p0 labels 2026-08-14 10:26:39 +08:00
Author
Owner

前置 #66 已验收关闭,开始实施。代码图 MCP 本会话未提供,代码发现按仓库规则回退到 rg 与精确文件读取。

写路径校正:

  • 迁移遵循当前 GoAdmin 骨架,改为 cmd/migrate/migration/version/*media*;
  • 生命周期启动/优雅停止需要 cmd/api/server.go;
  • GoAdmin JWT/Casbin 路由需要 app/admin/router/sense_media.go;
  • 接入成功后的幂等建路由需要在 admission/apis.go 调用媒体内部端口;
  • 补充前端单测、README 和归档镜像路径。
    这些校正不改变已确认目标、非目标或跨项目边界。

已完整阅读冻结 go-admin-doc:

  • docs/intro/cmd/server.md:沿用 Cobra server、指定配置文件和现有启动/关闭生命周期;
  • docs/intro/advanced/config.md:运行参数保持外部环境配置,不提交真实路径或凭据;
  • service.md:业务状态与 GORM 操作留在 service,不塞入 handler;
  • db.md:使用 PostgreSQL/GORM 迁移与时间字段规范;
  • router.md:使用标准注册函数、JWT 与角色鉴权。
    UI 继续复用 BasicLayout、Element Plus 表格/Tag/按钮和现有请求封装,不新增通用组件。
前置 #66 已验收关闭,开始实施。代码图 MCP 本会话未提供,代码发现按仓库规则回退到 `rg` 与精确文件读取。 写路径校正: - 迁移遵循当前 GoAdmin 骨架,改为 `cmd/migrate/migration/version/*media*`; - 生命周期启动/优雅停止需要 `cmd/api/server.go`; - GoAdmin JWT/Casbin 路由需要 `app/admin/router/sense_media.go`; - 接入成功后的幂等建路由需要在 `admission/apis.go` 调用媒体内部端口; - 补充前端单测、README 和归档镜像路径。 这些校正不改变已确认目标、非目标或跨项目边界。 已完整阅读冻结 go-admin-doc: - `docs/intro/cmd/server.md`:沿用 Cobra server、指定配置文件和现有启动/关闭生命周期; - `docs/intro/advanced/config.md`:运行参数保持外部环境配置,不提交真实路径或凭据; - `service.md`:业务状态与 GORM 操作留在 service,不塞入 handler; - `db.md`:使用 PostgreSQL/GORM 迁移与时间字段规范; - `router.md`:使用标准注册函数、JWT 与角色鉴权。 UI 继续复用 BasicLayout、Element Plus 表格/Tag/按钮和现有请求封装,不新增通用组件。
Author
Owner

#67 已完成实现并进入待验收。

  • PR #85:feature/67-sense-mediamtx-reconcile → dev,打开且未合并。
  • 提交:19f9bfa(实现)、4149cc4(长期文档)、263a68c(归档镜像)。
  • 后端:全量 test/vet/build 与 media/reconcile race 通过。
  • 前端:lint 0 error、10 suites / 35 tests、生产构建通过。
  • 真实集成:本机 MediaMTX v1.19.3 的 Control API 就绪及 path add/patch/delete 通过;PostgreSQL 17 desired route 冷启动恢复通过;定向迁移为 3 菜单、12 Casbin 策略、1 迁移记录。
  • 安全:Control API 仅 loopback、禁代理/重定向;外部进程孤儿闸;路由/响应/基础配置无凭据。测试自动生成的 TLS 私钥在推送前已从最终提交和对应 Git 松散对象清除,运行工作目录固定到外部配置目录。
  • Wiki revision:8ce039b45a20e680e378932331d9a8da1cae1654,镜像检查通过。
  • 未验证:真实摄像机持续拉流、现场网络、reader 变化和目标浏览器。
  • 相邻问题:空白 PostgreSQL 完整上游迁移链在到达 #67 前被既有 sys_config 字段长度问题中止;#67 定向迁移已通过,已提示 #70/#71 复核空库安装链。
#67 已完成实现并进入待验收。 - PR #85:`feature/67-sense-mediamtx-reconcile` → `dev`,打开且未合并。 - 提交:`19f9bfa`(实现)、`4149cc4`(长期文档)、`263a68c`(归档镜像)。 - 后端:全量 test/vet/build 与 media/reconcile race 通过。 - 前端:lint 0 error、10 suites / 35 tests、生产构建通过。 - 真实集成:本机 MediaMTX v1.19.3 的 Control API 就绪及 path add/patch/delete 通过;PostgreSQL 17 desired route 冷启动恢复通过;定向迁移为 3 菜单、12 Casbin 策略、1 迁移记录。 - 安全:Control API 仅 loopback、禁代理/重定向;外部进程孤儿闸;路由/响应/基础配置无凭据。测试自动生成的 TLS 私钥在推送前已从最终提交和对应 Git 松散对象清除,运行工作目录固定到外部配置目录。 - Wiki revision:`8ce039b45a20e680e378932331d9a8da1cae1654`,镜像检查通过。 - 未验证:真实摄像机持续拉流、现场网络、reader 变化和目标浏览器。 - 相邻问题:空白 PostgreSQL 完整上游迁移链在到达 #67 前被既有 `sys_config` 字段长度问题中止;#67 定向迁移已通过,已提示 #70/#71 复核空库安装链。
ila closed this issue 2026-08-14 18:17:00 +08:00
Author
Owner

用户于 2026-08-14 明确验收通过。Wiki 归档已更新为已完成(revision 4642924705d7a3406874ef532579fb2d6a25a88b),镜像提交 35b9c7b;PR #85 已合并到 dev,merge commit b1bdb91fdb94711d2e974a663687265691f393b1。工单关闭。

用户于 2026-08-14 明确验收通过。Wiki 归档已更新为已完成(revision `4642924705d7a3406874ef532579fb2d6a25a88b`),镜像提交 `35b9c7b`;PR #85 已合并到 `dev`,merge commit `b1bdb91fdb94711d2e974a663687265691f393b1`。工单关闭。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ila/yovision#67