跳到主要内容

Supervisor 系统管理组件设计

对应路线图阶段:系统部署测试期 → OS 镜像期
状态:设计稿
相关模块:Genapsed、操作系统层(systemd)、首次启动配置向导


1. 组件定位

Supervisor 是 Everpast 系统管理层面的守护进程,仅在 Everpast OS 集成部署中存在。它负责填补 Genapsed(应用层守护进程)和操作系统之间的管理空白。

发音建议:/ˈsuːpərvaɪzər/
命名来源:沿用 Unix/Linux 系统中"supervisor"作为安全管理守护进程的经典命名法。
同时对标 Home Assistant Supervisor 的职责层次——"系统"在前,"应用"在后。

1.1 一句话定义

Supervisor 是 Everpast 的操作系统管理层守护进程:管服务、管网络、管存储、管更新,但不参与任何应用层业务逻辑。

1.2 什么时候需要 Supervisor?

部署方式是否需要 Supervisor说明
pip installdocker run不需要用户自行管理系统和网络,Genapsed 直接运行
Everpast OS(虚拟机镜像)需要Supervis or 随系统启动,负责首次配置和系统管理
树莓派 / 单机部署包需要用户不需要 Linux 运维经验,Supervisor 代管一切

2. 设计目标与非目标

2.1 设计目标

  1. 系统层与应用层职责分离
    Genapsed 管理应用组件和插件,Supervisor 管理系统服务和硬件资源。二者职责不重叠,不互相依赖核心逻辑。

  2. 无运维经验的用户也可用
    首次启动时 Supervisor 提供 Web 配置向导,引导用户完成网络设置、摄像头添加、插件选择等初始化流程。

  3. 安全可靠的系统管理
    系统更新支持版本化回滚;服务崩溃时自动自愈;磁盘不足时提前预警。

  4. 可选可卸载
    Supervisor 是可选组件,不强制任何部署场景使用。docker-compose up 部署的用户完全感受不到 Supervisor 的存在。

  5. 与 Genapsed 数据互通但不耦合
    Supervisor 通过 MQTT 发布系统状态(磁盘、温度、服务健康),Genapsed 可以读取和展示,但 Genapsed 不依赖 Supervisor 运行。

2.2 非目标

  1. 不参与应用层消息路由
    MQTT 消息的发布、订阅和转发由 Genapsed 全权管理,Supervisor 只作为一个普通组件发布自己的状态消息。

  2. 不管理插件生命周期
    插件的安装、卸载、更新、权限由 Genapsed 的插件管理器负责。Supervisor 只保证 Genapsed 进程本身正常运行。

  3. 不负责摄像头接入和视频处理
    摄像头配置可以经由 Supervisor 的向导完成,但实际视频流接入和处理完全由 Frigate 和 Genapsed 管理。

  4. 不替代用户手动管理系统的能力
    Supervisor 不锁定系统,用户仍可通过 SSH 或终端直接管理 Linux 系统。


3. 职责边界

3.1 职责总览

职责说明对应功能模块
系统服务管理管理 Genapsed 等核心组件的 systemd 启停、状态监控和自愈service_manager
网络配置WiFi 扫描与连接、静态 IP、网桥配置network_manager
存储管理磁盘分区、存储池初始化、录像目录挂载与健康监控storage_manager
系统更新检查 OS 镜像更新、下载、安装、回滚update_manager
首次配置向导全新安装时引导用户完成初始化setup_wizard
系统监控CPU 温度/磁盘/内存/服务状态上报monitor
系统恢复配置重置、升级失败回退、恢复出厂设置recovery

3.2 系统服务管理(service_manager)

Service Manager 负责管理 Genapsed 及其他核心组件的 systemd 服务。

主要能力:

  1. 在首次启动时注册 Genapsed 的 systemd unit 文件;
  2. 监控各核心服务运行状态(active / failed / stopped);
  3. 服务崩溃时自动重启(Restart=always),连续崩溃3次以上则停止重试并告警;
  4. 对外提供 API:start / stop / restart / status / logs
  5. 配置开机自启选项。

3.3 网络配置(network_manager)

Network Manager 负责系统网络的配置与管理。

主要能力:

  1. 扫描并列出可用 WiFi 网络;
  2. 连接/断开 WiFi,支持 WPA2/WPA3;
  3. 配置静态 IP 或 DHCP;
  4. 配置 DNS;
  5. 配置网桥(用于摄像头隔离网络);
  6. 对外提供 API:scan / connect / disconnect / status

实现建议:底层通过 nmcliiwctl 调用系统网络管理器,不直接操作 netlink。

3.4 存储管理(storage_manager)

Storage Manager 负责磁盘和存储的管理。

主要能力:

  1. 列出可用磁盘和分区;
  2. 格式化和挂载存储分区;
  3. 初始化录像存储目录并设置权限;
  4. 监控磁盘使用率,超过阈值时预警;
  5. 支持存储迁移(从一块磁盘迁移到另一块)。

3.5 系统更新(update_manager)

Update Manager 负责 OS 级更新的检查和应用。

主要能力:

  1. 检查 Everpast OS 镜像更新(连接更新服务器);
  2. 下载更新包并校验完整性;
  3. 安装更新(支持 A/B 分区无中断升级或停机升级);
  4. 更新失败时回滚到上一个版本;
  5. 对外提供 API:check / install / rollback / status

3.6 首次配置向导(setup_wizard)

Setup Wizard 在全新启动的 Everpast OS 上自动运行,引导用户完成初始化。

流程:

系统启动 → Supervisor 启动 → 检测到首次启动

启动 Web 配置向导(临时 HTTP 服务)

用户通过浏览器访问 http://everpast.local:8080

步骤 1:网络配置(WiFi 连接)
步骤 2:摄像头添加(扫描/手动添加)
步骤 3:存储配置(选择录像存储位置)
步骤 4:插件选择(推荐插件包选择)
步骤 5:创建管理员账户

配置完成 → 启动 Genapsed 进入正常模式

配置向导 Web 服务关闭

3.7 系统监控(monitor)

Monitor 负责收集系统级指标并通过 MQTT 发布。

发布 topic:everpast/supervisor/status/normal

{
"source": "supervisor",
"type": "system_health",
"timestamp": 1741000000,
"payload": {
"cpu": {
"temperature_celsius": 52.3,
"load_percent": 23
},
"memory": {
"total_gb": 8,
"used_gb": 3.2,
"available_gb": 4.8
},
"disk": {
"total_gb": 256,
"used_gb": 89,
"available_gb": 167,
"usage_percent": 35
},
"services": {
"genapsed": "running",
"frigate": "running",
"mqtt": "running",
"minivlm": "running"
},
"uptime_seconds": 24601
}
}

3.8 系统恢复(recovery)

Recovery 模块为系统提供安全兜底能力。

场景恢复方式
配置错误导致无法启动通过恢复模式重置配置
系统更新失败自动回滚到上一个版本
用户忘记管理员密码恢复模式提供密码重置入口
磁盘损坏提示用户更换存储介质,引导迁移

4. 与 Genapsed 的关系

4.1 职责二维矩阵

系统层 (root) 应用层 (user)
┌────────────────────┐ ┌────────────────────┐
│ Supervisor │ │ Genapsed │
│ │ │ │
│ • systemd 管理 │ │ • MQTT 路由 │
│ • 网络配置 │ 通过 │ • 组件生命周期 │
│ • 磁盘存储 │ MQTT │ • 插件管理 │
│ • 系统更新 │ 互通 │ • 权限控制 │
│ • 首次配置向导 │ │ │ • 配置管理(模块) │
│ • 系统监控 │ │ • 日志查询与管理 │
└────────────────────┘ └────────────────────┘
│ │
│ MQTT topic 通信 │
└───────────────────────────────┘

4.2 通信方式

Supervisor 与 Genapsed 的通信遵循系统统一的 MQTT 规范。

方向Topic内容频率
Supervisor → Genapsedeverpast/supervisor/status/normal系统健康状态每 60 秒
Supervisor → Genapsedeverpast/supervisor/event/high系统告警(磁盘满/温度高/服务崩溃)触发时
Genapsed → Supervisoreverpast/genapsed/cmd/normal/supervisor管理命令(如请求重启服务/触发更新检查)按需
Supervisor → Genapsedeverpast/supervisor/log/low系统日志持续

关键原则:Supervisor 不订阅也不处理任何应用层 topic(不监听 everpast/frigate/+/+everpast/minivlm/+/+everpast/plugin.+/+/+ 等)。

4.3 启动时序

系统上电

├── 1. 引导加载程序(Grub/U-Boot)
├── 2. Linux 内核启动
├── 3. initramfs → 根文件系统挂载
├── 4. systemd 初始化

├── 5. Supervisor 启动 (root)
│ ├── 首次启动?→ 运行配置向导
│ └── 正常启动 → 监控系统服务

├── 6. Supervisor 启动 MQTT Broker → 检查网络连通性
├── 7. Supervisor 启动 Genapsed

└── 8. Genapsed 接管应用层
├── 启动 Frigate
├── 启动 MiniVLM
├── 加载插件
└── 打开 Web UI

5. 接口设计

5.1 MQTT Topic

Topic方向QoS说明
everpast/supervisor/status/normal→ Genapsed0系统健康状态心跳
everpast/supervisor/event/high→ Genapsed1系统告警事件
everpast/supervisor/log/low→ Genapsed0系统日志
everpast/supervisor/log/normal→ Genapsed1系统错误/预警日志
everpast/genapsed/cmd/normal/supervisor← Genapsed2管理命令

5.2 管理命令格式

{
"msg_id": "uuid-v4",
"source": "genapsed",
"target": "supervisor",
"type": "restart_service",
"payload": {
"service": "frigate"
},
"metadata": {
"requires_ack": true,
"trace_id": "trace-uuid"
}
}

支持的命令类型:

命令payload说明
restart_service{ "service": "genapsed" }重启指定服务
update_check{}触发更新检查
update_install{ "version": "v1.2.0" }安装指定版本更新
update_rollback{}回滚到上一个版本
disk_info{}返回完整磁盘信息
network_scan{}扫描 WiFi 网络
network_connect{ "ssid": "...", "password": "..." }连接 WiFi
network_status{}返回网络状态
reboot{}重启系统
shutdown{}关闭系统
factory_reset{}恢复出厂设置

5.3 Web API(配置向导期间)

首次配置向导在 http://everpast.local:8080 提供临时 Web API:

端点方法说明
/api/setup/statusGET获取配置向导进度
/api/setup/network/scanGET扫描 WiFi
/api/setup/network/connectPOST连接 WiFi
/api/setup/storage/disksGET列出磁盘信息
/api/setup/storage/initPOST初始化存储
/api/setup/camera/scanGET扫描局域网摄像头
/api/setup/camera/addPOST添加摄像头
/api/setup/plugins/availableGET查询可用插件包
/api/setup/plugins/installPOST安装插件包
/api/setup/admin/createPOST创建管理员账号
/api/setup/completePOST完成配置,启动系统

6. 配置项设计

Supervisor 的配置文件默认位于 /etc/everpast/supervisor.yaml

supervisor:
enabled: true

mqtt:
broker_host: "127.0.0.1"
broker_port: 1883
client_id: "supervisor"
status_topic: "everpast/supervisor/status/normal"
event_topic: "everpast/supervisor/event/high"
cmd_topic: "everpast/genapsed/cmd/normal/supervisor"

services:
- genapsed
- frigate
- mosquitto
- minivlm

monitor:
interval_seconds: 60
cpu_temperature_threshold_celsius: 85
disk_usage_warning_percent: 80
disk_usage_critical_percent: 95
memory_warning_percent: 85

network:
default_interface: "wlan0"
fallback_to_dhcp: true

updates:
server_url: "https://update.everpast.cn"
check_on_boot: true
auto_update: false # 默认关闭自动更新,用户可开启
backup_before_update: true

setup_wizard:
enabled: true
port: 8080
auto_close_after_complete: true

7. 安全设计

  1. 最小权限原则
    Supervisor 以 root 运行,但 Genapsed 以普通用户运行。Supervisor 通过 MQTT 接收 Genapsed 的管理命令,Genapsed 不能直接执行系统级操作。

  2. 命令认证
    Supervisor 对 MQTT 命令消息进行来源校验,只处理来自 Genapsed 的已知 topic 的命令。

  3. 配置向导安全
    首次配置向导的 Web 服务只监听 127.0.0.1:8080everpast.local:8080(仅局域网可达),不暴露到公网。配置完成后自动关闭。

  4. 更新安全
    更新包需经过 GPG 签名校验;下载通过 HTTPS;A/B 分区更新确保中断后仍可回滚。

  5. 恢复模式保护
    恢复模式需要物理按键或串口触发,防止远程攻击者触发恢复操作。


8. 部署方案

8.1 Everpast OS(完整镜像)

分区布局:
┌───────────────────────┐
│ /boot │ ← 引导分区 (512MB)
├───────────────────────┤
│ / (root) - 分区 A │ ← 主系统分区 (4GB ext4)
├───────────────────────┤
│ / (root) - 分区 B │ ← 备用系统分区 (4GB ext4)
├───────────────────────┤
│ /data │ ← 录像与持久化数据 (剩余空间)
└───────────────────────┘

A/B 分区策略允许无中断升级:

  • 当前运行在 A 分区
  • 更新下载并安装到 B 分区
  • 下次启动自动切换到 B 分区
  • 如果 B 分区启动失败,自动回退到 A 分区

8.2 Docker 部署(无 Supervisor)

Genapsed 管理的基础设施 Compose:
mysql:

应用服务 Compose(部署层编排):
genapsed:
frigate:
mosquitto:
minivlm:
timeline:
query-engine:
web-ui:

Docker 部署不需要 Supervisor。MySQL 等基础设施可由 Genapsed 生成项目内 Compose 文件管理,默认写入 data/genapsed/docker/compose.yaml,数据放在 data/db/mysql;应用服务的生命周期仍由部署层 Docker Compose 或系统服务管理。系统级管理(网络、存储、更新)由主机操作系统负责。


9. 路线图

阶段内容预计时间
原型期(当前)Genapsed 直接用 systemd unit 管理自身服务;不开发 Supervisor
系统部署测试期Supervisor 原型开发:service_manager + monitor + 基础 MQTT 通信原型完成后
OS 镜像期Setup Wizard + Network Manager + Storage Manager + Update Manager部署测试完成后
成熟期恢复模式、A/B 分区更新、多设备管理长期迭代

10. 待确认问题

  1. Supervisor 使用哪种编程语言实现?建议 Python(与 Genapsed 保持一致)还是 Go(更低的系统资源占用和更好的独立二进制分发)?
  2. 首次配置向导使用 Web 界面还是终端 TUI?Web 界面需要内嵌 HTTP 服务,初装时用户可能还没有安装浏览器(需通过手机访问)。
  3. A/B 分区更新方案是否适用于树莓派 SD 卡场景?SD 卡空间和写入寿命限制可能影响方案选择。
  4. Supervisor 和 Genapsed 之间的 MQTT 通信是否需要独立的内部 broker 连接?还是共用系统 MQTT Broker?