Files
Migu2.0/docs/superpowers/specs/2026-07-19-migu-ota-watchdog-design.md
T
zhaowei.huangandCursor 4223a572c5 新增 OTA WatchDog 编排与车队健康/报警后端。
覆盖包库回传、任务下发、CDM 任务同步与报警采集,并为包/任务 ID 与上传文件名加上路径安全校验。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 11:31:51 +08:00

11 KiB
Raw Blame History

迷榖车辆运维 OTA(WatchDog)设计规格

日期: 2026-07-19 状态: 已批准并实现中 范围: 在迷榖「车辆运维」中交付完整 OTA 能力;车上协议沿用 WatchDog;管理面由 MiGu.Server 编排。


1. 背景与目标

1.1 参考实现

E:\Work\FRLD\OTA\ota 为 Electron OTA 管理工具:版本拉取/管理、多车 M/D/C 同步、自定义文件、配置 JSON 下发、带宽限速与分批。车上依赖 WatchDog(:9776)。参考工具缺少任务状态机、可靠进度与正式回滚。

1.2 迷榖现状

  • 「车辆运维」=VehicleHubView:运维总览 / 维护策略 / 车队生命周期。
  • OTA 仅为 OtaPolicyenabled / batchSize / rollbackOnFail)只读占位,无包库、下发、进度或审计。

1.3 目标

  1. 车辆运维顶部仅保留 运维总览OTA
  2. 删除「维护策略」「车队生命周期」Tab 及维护策略配置页(本期不迁移)。
  3. OTA 全面对齐参考工具能力,并补齐平台侧任务进度、失败重试、审计。
  4. 车上协议 沿用 WatchDog;浏览器不直连车辆。
  5. UI 按迷榖运维工作台语言重做,不照搬 Electron 通用后台壳。

1.4 非目标(本期)

  • 差分/增量包、签名验签、A/B 双分区
  • 空闲时段自动升级
  • 浏览器直连 WatchDog
  • 维护策略配置的任何入口保留或迁移

2. 架构决策

选定:方案 A — 平台编排。

组件 职责
前端 仅调用 /api/ota/*,展示对照/进度/设置
MiGu.Server OTA 模块 包存储、目标版本、任务状态机、分批、限速、延迟探测、审计
车队名单 复用现有投影/车辆列表(IP、名称、状态)
WatchDog :9776 装包、读版本、回传包、读写 JSON、自定义文件

3. 信息架构

3.1 车辆运维 Tab

Tab 内容
运维总览 保持现有:健康卡片、维护态、车队分配
OTA 新工作台
  • 路由:/admin/config/vehicle-hub?tab=ota(监控侧同理)。
  • ?tab=maintenance / ?tab=fleet 深链重定向到 ota

3.2 OTA 子导航(左侧)

  1. 车辆升级 — 版本对照、勾选、分组件/全量同步、延迟检测开关
  2. 版本库 — 从车拉取 / 本地上传、设为目标、清理
  3. 任务中心 — 进行中/历史、进度、重试、取消
  4. 配置同步 — Medulla/Detour/Clumsy JSON 浏览、编辑、多车下发
  5. 自定义文件 — 文件 + 车上路径 + 重启策略
  6. 设置 — 带宽、并发、备份、延迟检测阈值与门禁策略

3.3 与运维总览的边界

能力 Tab
健康、电量、报警、维护态、车队分配、开车上页 运维总览
版本对照、包库、下发、JSON/自定义文件、任务、OTA 设置、延迟检测 OTA

运维总览不强制展示完整 MDC 哈希;若后续加「版本落后」标记,仅作跳转 OTA 的入口。


4. 后端:存储、API、任务

4.1 存储布局

根目录:MiGu.Server/data/ota/(可配置)

路径 用途
packages/{id}/ 一次拉取或上传的 M/D/C 文件树
target.json 当前目标版本(等价参考 ota.json
jobs/ 任务元数据与事件日志
history/ 定时备份(JSON ± exe
  • 版本标识:文件 MD5Base64,去除 -,与 WatchDog getMDCInfo 对齐。
  • 组件映射:内置/可配置 MDCPathMedulla / Detour / Clumsy 的 exe·dll·pdb)。

4.2 API

方法 路径 作用
GET /api/ota/vehicles 车列表 + 车上 MDC 版本 +(可选)RTT
POST /api/ota/packages/pull 从指定车拉取包
POST /api/ota/packages/upload 管理端上传包
GET /api/ota/packages 版本库列表
POST /api/ota/packages/{id}/activate 设为目标版本
DELETE /api/ota/packages/{id} 清理(当前目标不可删)
GET /api/ota/target 当前目标
POST /api/ota/jobs 创建下发任务(全量/组件/自定义文件/JSON)
GET /api/ota/jobs · /jobs/{id} 列表与详情进度
POST /api/ota/jobs/{id}/retry · cancel 重试失败项 / 取消未开始
GET/PUT /api/ota/settings 带宽、maxCar、备份、延迟检测
GET/PUT /api/ota/config/{carId}/{app} 单车 JSONmedulla
POST /api/ota/config/push JSON 多车下发(走 job
GET /api/ota/latency 按需批量 RTT(受设置开关约束)

权限:JWT/RBACPlatform 全量写;Monitor 可读 + 受控执行(ops.ota.*)。写操作进入审计。

4.3 任务状态机

pending → probing(可选) → running → succeeded
                              ↘ failed | partial
                              ↘ cancelled
  • 分批: maxCar(兼容原 ota.batchSize 语义)
  • 限速: 服务端上传流按 bandwidth kb/s 节流
  • 进度: 按「车 × 组件」;SSE 或短轮询推到任务中心
  • 重试: 仅重跑失败车辆/组件
  • 取消:pending / 未开始批次;已在传的组件尽量完成并标记
  • 延迟门禁: 任务可带 requireLatencyCheck;超阈值按设置跳过或二次确认后仍下发

4.4 WatchDog 映射

能力 WatchDog
读版本 GET /getMDCInfo
拉包 GET /getmdcsexe → 车推到平台接收端(或平台主动拉,实现时选更稳方案)
下发 /updateMedullaExecutable 等 + /updateFile/{name}/{op}/
JSON get*json / update*json
备份 gethistoryexe + 平台 history/

参考工具 Express :8000 接收能力收进 MiGu(内部端点,仅供 WatchDog 回传)。服务端对 WatchDog 统一超时与有限重试。


5. UI 设计

Design Read 工业 B2B 运维工作台;延续运维总览玻璃卡片 + 状态色 + JetBrains Mono;密度偏驾驶舱。 Dial Variance 4 / Motion 3 / Density 7。使用 --mg-* 与 --mg-status-*。

5.1 骨架

左子导航 + 右工作区;顶条固定:当前目标版本摘要(M/D/C 短哈希 + 名称)+ 进行中任务角标。

5.2 车辆升级

  • 工具条:搜索、车队筛选、「仅显示不一致」、网络延迟检测开关、刷新、同步全部/分组件
  • 主表:勾选 | 车名/ID | IP | Medulla | Detour | Clumsy | RTT | 维护态
    • 与目标一致 → 绿;不一致 → 琥珀;不可达 → 灰
    • 延迟检测关:RTT 为「—」;开:数值 + 超阈值着色
  • 有勾选时底栏粘性操作条:已选数、预计批次、开始下发(二次确认)

5.3 版本库

包列表(时间、来源 IP、体积、是否目标)+ 包内文件树与哈希;操作:拉取、上传、激活、删除。

5.4 任务中心

进行中(车×组件进度)+ 历史;详情含错误摘要、重试失败项、取消未开始。

5.5 配置同步 / 自定义文件 / 设置

  • 配置:选车 → JSON 树 → 编辑 → 多车下发(进任务)
  • 自定义文件:文件、车上路径、重启策略(无/M/D/C/WatchDog)、多车 → 任务
  • 设置:传输(带宽、maxCar)、延迟检测(默认开关、RTT 阈值、超限策略)、备份、展示名

5.6 交互原则

  • 下发二次确认,写清目标版本与车辆数
  • 延迟开且超阈值:默认排除并提示;设置可改为「仍允许但确认」
  • 任务进度可离页后续看(持久化)
  • 动效克制:进度与状态点过渡即可

6. 错误处理与审计

场景 行为
WatchDog 不可达/超时 该车失败,不阻塞同批其他车;任务可为 partial
上传中断/哈希不匹配 组件级失败;可按失败项重试
延迟超阈值 依设置跳过或确认后下发
无目标版本却同步 前端拦截 + API 400
磁盘满/包损坏 拉取/上传失败,不激活残包
任务取消 仅未开始批次

审计覆盖:激活目标、创建/取消/重试任务、改设置、推 JSON/自定义文件(操作者、时间、摘要)。


7. 前端改动要点(实现指引)

  • VehicleHubViewTab 改为 overview | ota;移除 VehicleMaintenanceView / FleetLifecycleView 挂载。
  • 新增 views/.../OtaWorkbenchView.vue(及子页/composables/api)。
  • 新增 src/api/ota.ts 对接 /api/ota/*。
  • 路由/深链:maintenance/fleetota
  • 删除或停用对维护策略页、FleetLifecycle 只读 OTA 页的导航依赖;FleetLifecycleConfig.ota 可迁移到 /api/ota/settings 后废弃只读 UI。

8. 后端改动要点(实现指引)

  • 新增 OTA Controller / Service / 存储 / Job runner / WatchDog HttpClient。
  • 配置项:OTA 数据根路径、WatchDog 端口(默认 9776)、超时。
  • RBACops.ota.*;与现有 Ops 审计集成或并行 OTA audit store。
  • 包接收端点替代原 Express :8000upload-mdcs* / upload-history*。

9. 验收标准

  1. 车辆运维仅见「运维总览」「OTA」;旧 Tab 深链落到 OTA。
  2. 可从车拉取或上传包,激活为目标,在车辆升级页看到绿/琥珀对照。
  3. 可分批全量或分组件下发;任务中心可见进度;失败可重试;可取消未开始。
  4. 延迟检测开关生效:关不探测;开显示 RTT 并按阈值门禁。
  5. 配置 JSON 多车下发、自定义文件同步可用。
  6. 设置可持久化(带宽、并发、备份、延迟策略)。
  7. 写操作有审计;浏览器不直连 :9776

10. 已确认决策摘要

决策 选择
车上协议 WatchDog
IA 运维总览 + OTA;去掉维护策略与生命周期
维护策略配置 本期删除
功能范围 全面对齐参考工具 + 平台任务/进度/重试
架构 MiGu.Server 平台编排
延迟检测 OTA 内按钮开关;开才检测