这是《多 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 心跳:

证书和域名到期提醒
证书到期检查是每个 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酱推到微信,原理一样)。步骤:
- App Store 搜 Bark 下载安装,打开首页就有一串 Key,复制下来;
- 先裸调一次确认 Key 有效:
curl "https://api.day.app/你的Key/测试标题/测试内容",返回 200 就是通的; - 在 Uptime Kuma 里建通知:设置 → 通知 → 新建,类型选 Bark,填 Key,起名”Bark推送”,设为默认通知;
- 把 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、重启容器后,日志干净了。每个监控项的编辑页右侧都能看到通知绑定情况:

故障演练:故意搞挂一个服务
配完不测等于没配。我建了一个临时的”必挂服务”监控(指向一个根本不存在的地址),等它变红变 DOWN,看手机能不能收到 Bark 推送。
第一次演练正好撞上上面那个大小写坑,推送没发出去;修正后重新演练,日志干净了。随后临时监控从数据库里清理掉,正式监控项恢复 10 个。
当天 16:02,手机真的收到了推送(标题类似 “UptimeKuma Monitor Down”)——端到端告警链路正式跑通。从那以后,半夜服务挂了,手机会第一时间响。
下一篇
下一篇《多 VPS 统一监控(五):Portainer(一)初始化与多机接管》讲容器统一管理:Portainer CE 的管理员初始化(三翻车一 API 直建)、Agent 怎么装到另外三台机器上、endpoint 怎么注册。