多 VPS 统一监控(四):Uptime Kuma

这是《多 VPS 统一监控》系列的第四篇。前三篇讲了技术路线和 Beszel(机器内部指标)。这篇讲 Uptime Kuma:从外部盯着服务活没活——网站能不能打开、SSH 端口通不通、证书和域名还有几天到期,挂了就往手机上推送告警。

先升级到 v2

部署时 compose 里我一开始写的是 louislam/uptime-kuma:1,结果面板打开就弹黄条警告:v1.23.17 已停止维护,没有安全更新。官方推荐用 :2 这个 tag。反正当时数据库还是空的,直接改 compose 里的镜像 tag 并重建容器:

# docker-compose.yml 里把这一行
image: louislam/uptime-kuma:1
# 改成
image: louislam/uptime-kuma:2
docker compose up -d uptime-kuma
docker ps  # 确认 uptime-kuma 显示 healthy,版本 v2.5.6

升级后如果浏览器提示”与 socket 服务器连接丢失”,别慌——先确认服务端是不是真的有问题:

# 测 socket.io 握手
curl -sk -o /dev/null -w "%{http_code}\n" \
  "https://status.nettodata.com/socket.io/?EIO=4&transport=polling"
# 返回 200 → 服务端没问题,是浏览器缓存了 v1 的旧前端页面

我当时测出来就是 200,服务端一点问题没有。用无痕模式打开 https://status.nettodata.com,或者硬刷新(Ctrl+Shift+R),连的就是 v2 的新页面了。

顺带一提,v2 自带了域名到期监控,正好覆盖我最初”域名该续期了要提醒”的需求,这也是升级的另一个理由。

10 个监控项

打开 https://status.nettodata.com 建好管理员账号后,开始加监控。我的清单是 10 个:

6 个 HTTPS 监控(60 秒检查一次,连续 2 次失败才判 DOWN,开启证书到期检查):

  • 博客主站 https://nettodata.com
  • 博客 www https://www.nettodata.com
  • WebSSH https://webssh.toit.qzz.io(另一台 VPS 上的应用)
  • Beszel 自监控 https://monitor.nettodata.com
  • Uptime Kuma 自监控 https://status.nettodata.com
  • Portainer 自监控 https://manage.nettodata.com

注意后面三个:监控平台自己也要被监控。面板挂了你还以为一切正常,是最坑的情况,所以互相盯着。

4 个 TCP 端口监控(盯每台 VPS 的 22 端口,整台机器挂了第一时间知道):博客主机、RackNerd 1G、Bandwagon、Dedirock 各一个。

我是直接往 Uptime Kuma 的 SQLite 数据库(kuma.db)里批量写入这批监控项的——动手前一定先备份:

docker exec uptime-kuma cp /app/data/kuma.db /app/data/kuma.db.bak-20261014
# 写入监控项后重启容器让 v2 加载
docker restart uptime-kuma

(小白建议:直接在网页上一个一个点”添加监控项”也行,10 个也就十几分钟,还不用碰数据库。)

加完重启,仪表盘上 10 条全绿、有 UP 心跳:

Uptime Kuma 状态速览:10 个监控项全部正常
Uptime Kuma 的状态速览:10 个监控项全部正常,0 故障。红框标出的是统计行——这就是每天想看到的样子。

证书和域名到期提醒

证书到期检查是每个 HTTPS 监控项自带的开关,打开就行。域名到期提醒在 v2 里是挂在 HTTP 监控项上的一个开关,不会单独建一条目:在”博客主站”这个监控项的设置里打开 域名到期通知(domain_expiry_notification),我给主站和 www 都开了。

开完我去 Verisign RDAP 查了一嘴:

curl -s https://rdap.verisign.com/com/v1/domain/nettodata.com \
  | python3 -c "import json,sys; d=json.load(sys.stdin); print([e['eventDate'] for e in d['events'] if e['eventAction']=='expiration'])"
# ['2027-08-31T09:01:53Z']

nettodata.com 到期日是 2027-08-31,还早得很。快到期时 Bark 会自动推你,不用记日子。

接 Bark 推送

通知渠道我选的是 Bark(免费、不限量,直接推到 iPhone 通知栏;安卓用户可以用 Server酱推到微信,原理一样)。步骤:

  1. App Store 搜 Bark 下载安装,打开首页就有一串 Key,复制下来;
  2. 先裸调一次确认 Key 有效:
    curl "https://api.day.app/你的Key/测试标题/测试内容",返回 200 就是通的;
  3. 在 Uptime Kuma 里建通知:设置 → 通知 → 新建,类型选 Bark,填 Key,起名”Bark推送”,设为默认通知;
  4. 把 10 个监控项全部绑定这个通知。

这里有个坑:v2 的通知类型是存在 config JSON 里的,provider 名字大小写敏感,必须写 Bark(大写 B)。我一开始写成小写 bark,看 uptime-kuma 的容器日志:

docker logs uptime-kuma 2>&1 | grep -i "notification" | tail -3
# Notification type is not supported

演练的告警全没发出去。把 provider 改成大写 Bark、重启容器后,日志干净了。每个监控项的编辑页右侧都能看到通知绑定情况:

Uptime Kuma 监控项通知设置:Bark推送已绑定为默认
监控项编辑页的”通知”栏:”Bark推送”开关已打开,并设为默认通知(主机名 IP 已打码)。红框标出的就是通知绑定位置。

故障演练:故意搞挂一个服务

配完不测等于没配。我建了一个临时的”必挂服务”监控(指向一个根本不存在的地址),等它变红变 DOWN,看手机能不能收到 Bark 推送。

第一次演练正好撞上上面那个大小写坑,推送没发出去;修正后重新演练,日志干净了。随后临时监控从数据库里清理掉,正式监控项恢复 10 个。

当天 16:02,手机真的收到了推送(标题类似 “UptimeKuma Monitor Down”)——端到端告警链路正式跑通。从那以后,半夜服务挂了,手机会第一时间响。

下一篇

下一篇《多 VPS 统一监控(五):Portainer(一)初始化与多机接管》讲容器统一管理:Portainer CE 的管理员初始化(三翻车一 API 直建)、Agent 怎么装到另外三台机器上、endpoint 怎么注册。

发表评论