safesight/docs/superpowers/specs/2026-04-20-profile-centered-config-design.md

349 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 以 Profile 为中心的配置设计
## 目的
明确 `template`、`profile`、`overlay` 三层之间的字段边界,使后台管理系统能够把 `profile` 当作一等配置资产,而不是仅仅把它当成一个下拉选项。
目标运行模型如下:
- 一台物理设备对应一份 profile
- template 可以在多台设备、多个现场之间复用
- overlay 只负责 debug、灵敏度和临时运行模式
- media-server 的内部实现参数默认不暴露给普通用户
该设计建立在现有模板渲染工作流之上,不会回到手工维护多份完整 JSON 的旧模式。
## 当前背景
当前受维护的配置来源为:
- template`configs/templates/workshop_face_shoe_alarm.json`
- profile`configs/profiles/local_3588_test.json`
- overlays`configs/overlays/*.json`
- 生成配置:`configs/generated/*.json`
从现有配置文件看,当前实际情况是:
- `template` 已经承载了流水线骨架、节点图、模型、告警结构和默认阈值
- `overlay` 当前的定位基本正确,已经主要用于 debug / 测试 / 安静运行模式
- `profile` 已经开始承载设备独特属性,例如 `rtsp_url`,但同时又混入了共享的外部服务配置
这类混放是当前的核心问题。它会让后台很难把 profile 清晰地表达成“设备/现场身份与设备级接入配置”。
## 设计目标
1.`profile` 成为单台设备身份与设备级接入配置的唯一归属层。
2. 让方案级共享配置继续通过 template 复用。
3. 保持 overlay 小而纯粹,专注运行模式。
4. 阻止底层实现细节泄漏到面向用户的配置界面。
5. 支持多模板并存,且每个模板都能灵活对接不同的外部服务和存储后端。
## 字段归属边界
### Template
`template` 负责方案级共享配置。
典型内容包括:
- DAG 结构:`nodes`、`edges`
- 插件/节点选择
- 共享模型默认值
- 共享算法默认值
- 共享告警动作结构
- 共享外部服务配置
- 共享存储配置
- 默认发布协议结构
`workshop_face_shoe_alarm.json` 为例,适合归属于 template 的内容包括:
- 节点类型和节点 ID
- 模型路径和模型尺寸
- 跟踪器模式及默认阈值
- 告警规则结构
- 快照/录像上传结构
- External API 动作结构
- 发布输出结构
重要规则:
- template 中的共享服务字段必须保持“可编辑模板参数”的属性
- 不能把它们当成写死的常量
这样才能支持不同 template 对接不同 MinIO 或不同外部告警服务。
### Profile
`profile` 负责设备级身份和设备级运行绑定。
一份 profile 对应一台物理设备。
典型内容包括:
- 业务显示名
- 站点身份
- 设备本地输入源
- 设备本地发布输出参数
- 设备本地资源路径
- 外部系统需要的设备级业务标识
当前已经明显适合保留在 profile 的字段:
- `rtsp_url`
本设计建议新增的 profile 字段:
- `display_name`
- `device_code`
- `site_name`
- `publish_hls_path`
- `publish_rtsp_port`
- `publish_rtsp_path`
- `channel_no`
后台设备列表应优先展示 `display_name`。像 `device_id`、`hostname` 这样的技术标识,应该收纳到设备详情页。
### Overlay
`overlay` 负责短周期运行模式。
允许的用途包括:
- debug 开关
- 测试灵敏度
- 安静生产模式
- 临时验证行为
当前已经比较符合这一定位的 overlay
- `face_debug.json`
- `shoe_debug.json`
- `face_test_sensitive.json`
- `shoe_test_sensitive.json`
- `production_quiet.json`
overlay 不应承载:
- 设备身份
- 设备本地视频源
- 每台设备自己的输出主机/路径/端口
- 长期稳定的外部服务归属
### 程序内部默认参数与高级设置
以下内容不应进入普通后台主配置编辑:
- `cpu_affinity`
- queue 实现细节
- `rga_max_inflight`
- 底层 tensor / 输入输出假设
- 插件之间的内部 glue 参数
- 其他容易配坏、主要面向工程调试的字段
这些参数应按两类处理:
#### 1. 程序内部默认参数
如果某些参数在当前部署模式下应固定,则应直接回收到程序默认、模板默认或部署默认,不再暴露成配置字段。
当前明确建议内收的字段:
- `face_gallery_path`
- 应由部署流程将人脸库放到约定默认目录
- 不应允许在后台中修改
- `rga_gate`
- 如果最终确认始终固定使用同一组 RGA 资源分组,则应回收到模板默认或程序默认
- 当前 `workshop_face_shoe_alarm` 已固定为 `main_pipeline_rga`
#### 2. 高级设置
如果某些字段仅在工程调试、特殊部署或排障时才需要保留,则可以在 UI 中进入“高级设置”,并默认折叠,不进入日常运维主流程。
## 标准 Profile 模型
建议把单个 profile 组织为以下几组字段:
### 1. 设备身份
- `display_name`
- `device_code`
- `site_name`
### 2. 输入源
- `rtsp_url`
### 3. 输出发布
- `publish_hls_path`
- `publish_rtsp_port`
- `publish_rtsp_path`
- `channel_no`
原因:
- 发布输出是设备级属性,不是共享属性
- 它天然包含设备自己的 IP / 主机 / 端口 / 路径语义
- 它往往直接决定外部系统如何消费这台盒子的输出流
### 4. 设备本地资源
- 仅保留未来确有设备差异的本地资源路径
- 当前不建议把 `face_gallery_path` 暴露为 profile 字段
- 当前不建议把 `rga_gate` 暴露为 profile 字段
- 只有在后续确认不同设备之间确实存在差异时,才考虑进入高级设置
## Template 参数模型
当某些外部服务属于“方案级共享配置”时,它们应保留在 template而不是塞进每台设备自己的 profile。
建议由 template 管理的共享字段包括:
- `minio_endpoint`
- `minio_bucket`
- `minio_access_key`
- `minio_secret_key`
- `external_get_token_url`
- `external_put_message_url`
- `tenant_code`
原因:
- 这类配置通常在同一类部署方案中是共享的
- 如果把它们复制进每台设备的 profile会造成重复和漂移
- 不同 template 仍然可能对接不同共享服务,因此它们必须保持 template 级可编辑,而不是写死
## 渲染参数迁移方向
当前 template 中已经存在的占位符包括:
- `${rtsp_url}`
- `${face_gallery_path}`
- `${minio_endpoint}`
- `${minio_bucket}`
- `${minio_access_key}`
- `${minio_secret_key}`
- `${external_get_token_url}`
- `${external_put_message_url}`
- `${tenant_code}`
- `${name}`
本设计建议下一步按以下方向迁移:
### 保留为 profile 驱动占位符
- `${rtsp_url}`
### 保留为 template 驱动占位符
- `${minio_endpoint}`
- `${minio_bucket}`
- `${minio_access_key}`
- `${minio_secret_key}`
- `${external_get_token_url}`
- `${external_put_message_url}`
- `${tenant_code}`
当前 `workshop_face_shoe_alarm` 已将 `rga_gate` 从占位符体系中移除,改回模板默认。
当前主线模板已将人脸库路径固定为 `./models/face_gallery.db`,后续由部署默认目录解决。
### 新增为 profile 驱动占位符
- `${display_name}`,如后续用于后台展示元数据或业务标签
- `${publish_hls_path}`
- `${publish_rtsp_port}`
- `${publish_rtsp_path}`
- `${channel_no}`
## 输出发布部分的调整
当前 template 中的 publish 输出结构本身是合理的,但其中部分字段不应再写成固定值。
建议调整为:
- 输出协议结构继续保留在 template
- 每台设备不同的输出值改为引用 profile 字段
建议演进方向:
- HLS 输出路径:使用 `${publish_hls_path}`
- RTSP server 端口:使用 `${publish_rtsp_port}`
- RTSP server 路径:使用 `${publish_rtsp_path}`
- External API 中的 `channelNo`:改为使用 `${channel_no}`,不再直接使用 `${name}`
原因:
- 当前 `${name}` 把实例名和外部业务通道语义混在了一起
- 对外平台通道号应当是明确字段,而不是靠实例名隐式复用
- 输出路径和端口显然属于单设备运行属性
## 对后台管理模型的影响
这套字段边界意味着后台应逐步演进成以下资产模型:
### Device
由 agent 发现得到的运行对象:
- device ID
- hostname
- agent 可达性
- media-server 状态
- 当前应用配置元数据
### Profile
与设备一对一绑定的配置资产:
- 在独立的 profile 详情页中编辑
- 承载设备身份、输入、输出和本地资源设置
### Template
可复用的方案资产:
- 在独立的 template 详情页中编辑
- 承载流水线结构和共享服务参数
### Overlay
运行模式资产:
- 在预览/下发流程中进行选择
- 不作为长期设备身份配置的主要承载层
## 对 UI 的直接含义
后台不应再把 profile 仅仅当成一个下拉框。
最小方向应当是:
1. profile 成为配置资产中的一等对象
2. 每台设备详情页都要明确显示当前绑定的 profile
3. 设备显示名应该来自 profile而不是直接来自 agent 默认命名
4. 预览/应用页面只负责“选择 profile”而不应成为 profile 的主要编辑入口
## 迁移路径
这套设计不要求立刻重写全部配置。更实际的迁移路径是:
1. 先定义标准 profile 字段模型
2. 把 template 中的发布输出字段参数化
3. 把共享外部服务配置从 profile 迁到 template 参数
4.`face_gallery_path` 收回部署默认目录
5. 若模板中的 `rga_gate` 已固定,则收回模板默认或程序默认
6. 在后台引入 profile 页面和设备-profile 绑定界面
7. overlay 保持现状,仅做必要清理
## 暂不覆盖的内容
本设计当前不包含以下内容:
- 完整的后台 profile 编辑页布局
- template 编辑器的 UI schema 生成方式
- 老 profile JSON 的自动迁移工具
- template 与 profile 的权限模型
这些内容应放到下一轮设计和实施计划中继续展开。