3.7 KiB
ARM 应用健康监控上线设计
1. Safety Boundary
上线只改变 ARM 上的应用健康探测器、两个 systemd units 和独立状态目录;共用 helper 会更新为仓库已通过备份回归的版本,但不修改 webhook、备份 receiver、dead-man、归档或 OA 主机。所有远端写操作通过非交互 sudo 执行;若预检不满足,任务停在只读阶段。
2. Source and Secret Provenance
部署源固定为工作提交 bb5113c 中的探测器、helper 和安装器。先确认三个部署源相对 HEAD 无未提交改动并复跑专项/备份合同;当前 Trellis 任务记录可按正常流程保持未提交。安装前后比较 SHA-256;不使用远端旧仓库或聊天中的粘贴内容。
webhook 文件路径从既有 hyb-oa-offhost-deadman.service 的 ExecStart 参数在 ARM 内解析。解析结果必须是绝对路径、普通非符号文件、root-owned、mode 0600;流程从不读取文件正文,也不把路径打印到会话证据。
3. Rollout Sequence
local contracts
-> ARM read-only preflight
-> reject pre-existing app-health artifacts
-> upload committed sources to temporary directory
-> sudo installer install (disabled)
-> verify hashes/permissions/units
-> manual real /ready baseline
-> sudo installer enable
-> verify timer
-> stop only app-health timer
-> direct probe #1 against localhost unreachable HTTPS (pending)
-> direct probe #2 (one real failure alert)
-> direct probe #3 (deduplicated)
-> start formal service against public /ready (one recovery)
-> start timer and verify final state
-> remove temporary directory
失败命令预期非零时必须显式捕获退出码,不能让 shell 把受控故障误判为 rollout 脚本崩溃。状态验证只读取允许字段:schema version、连续失败计数、稳定类别、告警状态和 helper 的 sent=true|false。
4. Drill Isolation
演练不改 unit、不改 DNS、不停止公网服务。timer 暂停后,以 root 直接执行已安装探测器,目标为 ARM 本机一个预先确认未监听的低风险 TCP 端口,超时 1 秒;其余参数使用正式状态目录、helper 和 webhook。这样覆盖真实 TLS/连接分类、失败阈值、helper、机器人和恢复链,同时不会影响 OA 用户。
正式恢复必须通过 systemd service 执行真实公网 /ready,从而同时验证已安装 unit。成功后恢复 timer,并再观察至少一次定时健康执行或核对最近成功时间。
5. Rollback and Alert Closure
- 安装前失败:无远端写入,仅清理临时目录。
- 安装后、真实告警前失败:disable/stop 并运行安装器
uninstall,保留独立状态证据和共用文件。 - 真实告警后失败:先移除故障输入并运行正式 service 争取发送恢复通知;成功后可决定保留或卸载。若恢复仍失败,timer 保持停用,明确报告群内告警未闭环,不伪造恢复。
- 任一路径都不删除共用 helper、webhook、备份 dead-man、receiver 或归档。
6. Evidence and Privacy
证据记录提交短哈希、布尔预检、文件哈希比对结果、固定权限、systemd enabled/active、稳定故障类别、连续次数和 helper 发送布尔值。不得保存 SSH 地址、IP、用户名、webhook、完整远端路径、原始 /ready 响应、journal 或企微 payload。
人工收件确认与自动链路证据分开:脚本显示发送成功不等于用户已经看到消息,最终 AC9 需用户确认。
7. Compatibility
安装器会更新共用 helper,因此上线前必须复跑 73 项自动备份合同。上线后只检查既有 dead-man unit/timer 仍存在且状态未变,不主动运行 dead-man,避免归档异常时产生额外真实告警。