这是什么
.155 是我家里那台 Windows 主用机,也是我日常干活的主力。我经常在外面,机器就一直关着。但监控台不这么想:它把这台机器当成了必须一直在线的服务器,于是我一关机,它就反复报警。
问题出在好几处:notify.py 每 6 小时重推一次「仍未恢复:本机 离线」;Gatus 的 SSH 探测一失败就通过 ntfy 告警;面板上的告警条一直挂着红色严重项;概览里的「机器在线 3 / 4」和「数据新鲜度」也被这台机器的数据拖累,长时间显示为异常。三条通道一起响,人不在家也得被念。
怎么解决的
核心做法只有一句话:给这台机器加一个 "optional": True 标记,含义是「允许不在线」。前端和推送器都读同一个字段:可选节点离线就直接跳过,不产生问题、不推送、不重推;指向它的探测永远只作展示,不计入正常率和告警。面板上则是灰点、「未开机」加一句说明,关机前的数据可以折叠展开查看。
关键点是只放过“关机”这一个状态:机器开机时,磁盘占用、内存、CPU/NVMe 温度、Defender、更新、失败服务照常检查、照常告警。Gatus 里对应的端点保留,只是去掉了 alerts: 块,面板上照样能看到它在不在。
现在
项目已归档。关机、开机两个瞬间都实测过,不再出现误报;以后要给笔记本、备用机开同样的模式,只需加一行标记。
功能
- 给节点加
optional标记,「允许关机」的机器离线不再告警,也不重复推送 - 关机、开机瞬间的探测失败窗口只作展示,不计入正常率、不闪红
- 面板灰点加中性样式,关机前的历史数据可折叠查看
- 概览的在线数、探测数、数据新鲜度按同一套规则排除可选节点
- Gatus 对应端点保留监控但移除
alerts:,其余端点推送照旧 - 开机后磁盘、内存、CPU/NVMe 温度、Defender、更新、失败服务照常检查告警
技术栈
使用 / 部署教程
部署步骤
这套改动是数据驱动的,改动集中在四个文件加一份 Gatus 配置,按下面的顺序来。
1. 打标记(面板机 .164)
编辑 /opt/dashboard/server.py 的节点表,在目标节点的字典里加一行:
"win": {
# 这台工作站是主用机,人不在家就关着。离线属于正常状态。
"id": "win", ..., "stale_after": 170, "optional": True,
}
同时把 optional 加进 stats() 的 meta 白名单,否则前端拿不到这个字段。
2. 让推送器闭嘴
/opt/dashboard/notify.py 的 evaluate() 里,遇到 optional 节点离线直接跳过,不产生问题项、不推送、不重推。
3. 面板展示
app.js:computeAlerts 里离线不算故障;指向可选机器的探测只作展示,不计入正常率;卡片用中性样式,陈旧数据折叠;概览口径同步排除;关机卡片排到最后。index.html 补 .dot.idle、.card.idle、.idlenote、.prow.skip 等样式。
4. 关掉 Gatus 推送(.223)
在 /opt/gatus/config/config.yaml 里把 Windows .155(SSH) 端点的 alerts: 块删掉,端点本身保留,然后 docker restart gatus。
5. 验证
- 构造快照直接跑
evaluate():可选机器离线返回[],普通机器离线照常报crit,可选机器开机但磁盘 95% 照常报。 - 线上看
notify-state.json的problems是否为空,日志里应出现「正常,当前问题 0 项」。 - 面板检查顶栏、概览四宫格、机器卡片,再在 430px 窄屏和 1600px 四卡一行下各过一遍。
6. 回滚
改动前先备份。回滚就是把备份的 app.js、index.html、server.py、notify.py 拷回 /opt/dashboard/ 并重启 dashboard,Gatus 侧用 config.yaml 备份覆盖后重启容器。
注意事项
历史遗留的 win:offline 问题是先清状态文件再重启服务、静默清掉的,这样不会收到一条莫名其妙的「已恢复」。另外两个服务重启之间有个短暂窗口,探测已经失败而节点数据还没过期,这正是「探测只作展示」要覆盖的那段。
注意
optional只适合「允许随时关机」的机器(笔记本、备用机)。给常在线服务器打开会掩盖真实故障。- Gatus 那边是删
alerts:块而不是删端点,改完确认其余端点的 provider 配置没受影响。 - 改动前备份四个面板文件和 Gatus 配置,回滚路径要提前写下来。