项目/监控运维
监控运维 · 运行中 · AI 自动收录

外网看门狗:外网视角入口监控告警

外网看门狗:外网视角入口监控告警

用香港 VPS 从外网探测家里 19 个公网入口,连续失败 3 次即发中文邮件告警。

✦ 从外部 VPS 盯住家里 19 个公网入口,异常与恢复都发中文邮件。
约 6 分钟阅读
外网监控可用性告警Pythonsystemd自建服务邮件通知
← 返回列表

外网看门狗 v2 是一个部署在香港 VPS 上的外部可用性探测服务,从公网视角周期性检查家里全部对外入口是否还活着。它监控 12 个独立子域名(主页、博客、DSH 控制台、OpenList 网盘、夸克自动转存、Gitea 代码库、Memos 朋友圈、PhotoPrism 相册、Jellyfin 影音、Firefly 记账、OpenWebUI 对话、Vaultwarden 密码库)和主页下的 7 条路径(音乐 Navidrome、量化 AQF、FileBrowser 文件管理、监控台、Minecraft 地图、分享页、Git 备份),共 19 个目标。

做它的原因很直接:家里的监控台只能在家里网络正常时工作,一旦断网或断电,恰恰是最需要告警的时候却发不出消息。把探测点放到外部 VPS,才能在家庭网络整体失联时仍然发现问题并通知。它与家里监控台不冲突——家里做内部细节监控,它只回答一个问题:从外网看,家里的入口还活着吗。

判定规则上,200–399、401、403 都算存活,登录跳转和鉴权拦截属于正常;超时、连接失败、5xx、404 算异常。每 5 分钟探测一轮,单目标连续失败 3 次(约 15 分钟)才告警,避免抖动误报;同一轮 60% 以上目标同时不可达时,合并成一封「家里入口大面积不可达」邮件,疑似断网断电。恢复后补发恢复通知,告警为中文可读格式,包含中文名、URL、连续失败次数与首次发现时间;状态持久化,重启不丢告警状态。

目前 v2 已上线并完成验证:19 个目标一轮全部 OK(含 302/307/401 均判活),假目标测试触发的告警邮件已送达,服务常驻运行。

功能

  • 从香港 VPS 出网探测,家里断网断电时仍能发现并告警
  • 覆盖 19 个入口:12 个独立子域名 + 7 条主页路径
  • 单目标连续失败 3 次(约 15 分钟)才告警,避免网络抖动误报
  • 同一轮 60% 以上目标同时失联时合并为一封「大面积不可达」邮件
  • 中文告警邮件,含中文名、URL、连续失败次数、首次发现时间与失败原因
  • 状态持久化,重启不丢告警状态;恢复后发送恢复通知

技术栈

PythonrequestssystemdJSONSMTP/TLSBrevo 邮件中继

使用 / 部署教程

1. 准备

  • 一台带公网出口的 VPS(资料中为 38.76.200.139),安装 Python 3 与 requests。
  • 一个可用的 SMTP 账号。资料中方案为本机 mailserver 127.0.0.1:587(TLS + 账号认证),经 Brevo 中继投递到 126 邮箱。

2. 放置程序与配置

/opt/external-watchdog/watchdog.py   # 主程序
/opt/external-watchdog/config.json   # 目标/阈值/收件人/SMTP,权限 600
/var/lib/external-watchdog/state.json # 状态持久化

3. 编写 config.json

在 targets 数组中逐条列出目标:中文名 + URL,共 19 条(12 个独立域名 + 7 条主页路径,如 https://xiejun-server.top/music/);再设置探测间隔 300 秒、失败阈值 3 次、收件人邮箱与 SMTP 参数。

4. 注册 systemd 服务

新建 /etc/systemd/system/external-watchdog.service,ExecStart 指向 python3 /opt/external-watchdog/watchdog.py,设置 Restart=always(unit 具体字段资料未给出,此处按通用做法编写)。随后:

systemctl daemon-reload
systemctl enable --now external-watchdog

5. 验证

systemctl is-active external-watchdog      # 期望 active
journalctl -u external-watchdog -n 40 --no-pager
# 期望日志出现 19 targets / 300s / threshold 3

再临时加一个不存在的假目标,确认收到中文告警邮件(主题形如「[外网看门狗] ⚠️ 入口异常:测试假目标」),并检查邮件中继日志出现 status=sent,验证后删除假目标。

6. 日常运维

ssh vps 'systemctl status external-watchdog --no-pager'
ssh vps 'journalctl -u external-watchdog -n 40 --no-pager'
ssh vps 'cat /opt/external-watchdog/config.json'   # 改完 restart
ssh vps 'cat /var/lib/external-watchdog/state.json' # 看各目标连续失败次数

7. 回滚

ssh vps 'systemctl disable --now external-watchdog && \
  rm -rf /opt/external-watchdog /var/lib/external-watchdog \
  /etc/systemd/system/external-watchdog.service && systemctl daemon-reload'

常见问题

为什么只发邮件,不做手机推送?

按需求方要求,v2 只发中文邮件到指定 126 邮箱,不做手机推送。若以后需要,可再增加 ntfy/Telegram 等渠道。

家里断网断电了,它还能告警吗?

能。探测从香港 VPS 出网,不依赖家里网络;连续失败 3 次后发邮件,若同一轮 60% 以上目标同时挂,会合并成一封「家里入口大面积不可达」邮件,疑似断网或断电。

登录跳转、401/403 会不会被误判成故障?

不会。判定规则把 200–399、401、403 都视为存活,登录跳转与鉴权拦截属正常;只有超时、连接失败、5xx、404 才算异常。

怎么新增或删除监控目标?

只改 config.json 里的 targets 数组,然后执行 systemctl restart external-watchdog 即可,无需改动主程序。

注意

  • config.json 含 SMTP 账号与收件人,务必保持 600 权限,不要提交到代码库或公开。
  • 阈值与频率为默认值 5 分钟 / 3 次,误报或漏报明显时再调整,不建议一开始就降到 1 次。
  • 它与家里监控台是互补关系:家里断网时只有它能发出告警,但内网细节仍需家里监控台。
  • 部署前用临时假目标验证一次告警链路,确认邮件能真正送达再依赖它。

评论

加载中…