Uptime Kuma:网站挂了第一时间知道,而不是等用户投诉
朋友的独立博客挂了四个多小时,他是在读者群里被人问「你站点今天是不是打不开」才知道的。那四个小时他在开会,手机一声没响。事后他去查商业监控的价格,按站点数收费,站点一多就不太划算。而这需求本身朴素得过分:定时访问一下你的站,返回值不对就喊你一声。
Uptime Kuma 就是干这个的。一条命令起服务,界面点几下,告警能落到手机上,状态页能直接给用户看。
它能监控什么
不是只能看网页能不能开。它的监控类型基本覆盖了个人站长会关心的所有层面:
| 项目 | 内容 |
|---|---|
| HTTP 状态码 | 看返回值是否在允许范围内,可自定义接受的状态码 |
| 关键词检测 | 页面里必须出现某段文字才算正常,专治「返回 200 但内容是报错页」 |
| TCP 端口 | 连一下看通不通,适合数据库、SSH、自建服务 |
| Ping | 主机层面是否可达,判断是网站挂了还是机器挂了 |
| DNS 解析 | 指定记录类型,检查解析出来的值对不对 |
| 证书到期 | 记录证书剩余天数,到期前按设定天数提醒 |
| 通知渠道 | 邮件、Telegram、企业微信、钉钉、飞书、自定义 webhook 等几十种 |
| 状态页 | 生成一个可公开的页面,展示各监控项的当前状态与历史可用率 |
监控项多了以后可以分组、打标签,一个状态页可以只挂其中一组。历史数据会保留下来,回头能看出某个服务是「偶发抖动」还是「每天凌晨都抖一次」。
用 Docker 起一个
docker run
mkdir -p /opt/uptime-kuma
docker run -d \
--name uptime-kuma \
--restart unless-stopped \
-p 3001:3001 \
-v /opt/uptime-kuma:/app/data \
-e TZ=Asia/Shanghai \
louislam/uptime-kuma
只有一个目录要挂,挂到 /app/data,里面是数据库文件和一些缓存。这个卷不挂,容器重建一次你的监控项、通知配置、历史记录就全没了。
compose 写法
services:
uptime-kuma:
image: louislam/uptime-kuma
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./data:/app/data
environment:
TZ: Asia/Shanghai
3001 是网页界面。如果你打算给状态页配域名,让 Nginx 反代到这个端口就行,注意 websocket 要一起转发,反代时把 Upgrade 和 Connection 两个请求头加上,否则界面上的实时状态不会自己刷新。
第一次登录后要做的三件事
建管理员账号
第一次打开 3001 端口,它直接让你设管理员用户名和密码,没有默认账号,也没有「初始密码是 admin」这种后门。这一步别拖。设完之后可以在同一个界面里再建只读账号,给同事或者给自己另一台设备看用。
加第一个监控
- 点左上角的「添加监控」
- 监控类型选 HTTP(s)
- 名称写人话,比如「主站首页」,通知里显示的就是这个名字,写「monitor-1」以后自己都认不出
- URL 填你要监控的完整地址
- 心跳间隔填 60 秒,重试次数 2 到 3 次,超时 30 秒左右
- 「接受的状态码」默认是 200 到 299。如果你的健康检查接口正常时返回 401,把 401 加进去
- 打开关键词检测,填一段只会在正常页面出现的文字
- 保存,等一分钟看状态变绿
心跳间隔别贪快
60 秒对绝大多数站点是合适值。设成 5 秒看起来专业,代价是你的监控机不停发请求,目标站的访问日志里全是你的 IP,云厂商的防护有可能直接把它当扫描封掉。真需要秒级感知之前先问自己:站挂了两分钟,你能做什么?大多数情况答案是什么也做不了,那 60 秒完全够。
重试次数决定误报率。网络抖动、目标站偶发 502,一次失败就报警会很快把你训练到对通知麻木,然后真正出事那天你恰好忽略了它。设两三次重试,连续失败才通知,体验会好很多。
通知:让手机真的响
监控不响等于没监控。入口在「设置 - 通知」,建好一条通知后,回到每个监控项里把它勾上,这一步最容易漏。
邮件
最通用,也最容易卡。要填的是 SMTP 服务器、端口、是否加密、用户名、密码、发件人和收件人。用大厂邮箱时,密码那栏通常要填「授权码」而不是登录密码,很多人死在这一点上。465 端口走 SSL,587 走 STARTTLS,25 基本别用:不少云厂商默认封 25 出站,你在宿主机上手动发信能成功,容器里就是发不出去。
Telegram
需要两项:机器人令牌和会话 ID。国内网络环境下还要考虑监控机能不能连上它的接口,连不上这条通知只会一直报错,界面上是红色的感叹号。Kuma 支持给通知单独配代理,填一下就好。
企业微信、钉钉、飞书
思路一样:群里加一个机器人,把机器人给你的 webhook 地址填进去。三家的消息格式各不相同,内置模板已经处理好了,但如果你选的是「自定义 webhook」,返回 200 也可能根本没推送成功。配完一定点一下「测试」,测试通过才算配好。
自定义 webhook
想接自己的服务、想在通知里加一点加工逻辑时用它。Kuma 会把监控名、状态、消息、时间这些字段 POST 到你配置的地址,请求体格式可选,你的服务端返回 2xx 就算发送成功。可以拿它做一件很实用的事:把告警写进自己的日志系统,顺手触发一个自动重启脚本。
状态页:给用户看的那个页面
这功能比想象中好用。新建一个状态页,起名字,把要展示的监控项勾上,设一个可读的路径,再在 Nginx 里把域名反代到 3001,别人打开那个域名就能看到「各服务当前是否正常」以及过去一段时间的可用率曲线。比在公告里写「已知问题,正在排查」专业得多。
实用建议:把状态页和监控后台分开暴露。后台只给自己看,至少挡一层基础认证;状态页才对外开放。状态页支持自定义样式和图标,稍微改一下不至于一眼就看出来用的是模板。
证书到期提醒
HTTP 监控会顺带记录目标证书的到期时间,并按你设的天数发通知。比较稳的做法是单独建一个监控项,只做证书检查,提前 14 天提醒。
为什么是 14 天?因为续期失败、DNS 验证卡住、自动续期脚本权限坏了,这些都要你抽一个晚上去修,留一周半不至于手忙脚乱。真正出事的场景往往不是证书到期那一刻,而是你三个月没看过它一眼。
几个真会踩到的坑
- 自己监控自己有单点问题。监控服务和被监控站点在同一台机器,机器一断电两个一起死,没人来告诉你。有条件就把监控放到另一台机器,或者另一家服务商最便宜的小机器上。
- 被目标站封 IP。间隔太密、监控项太多、还带着默认的用户代理,被防护系统拉黑很常见。改一下用户代理,降频,该加白名单就加。
- 邮件发不出去。先确认 25 端口有没有被封,再确认密码那栏是不是该填授权码,最后翻一眼垃圾箱。
- 通知延迟。默认有重试,加上系统负载,从真挂到你收到消息过两三分钟是正常的,别把它当 bug 追。
- 数据库长期跑要备份。所有配置和历史都在数据目录里那一个数据库文件,定期打包带走。停容器再复制最稳,热拷贝偶尔会拿到半截文件。
- 返回 200 但内容是错误页。后端进程挂了、数据库连不上,很多站会吐一个 200 的报错页。这种情况只能靠关键词检测,检查页面里有没有本该出现的文字。
适合你,也不适合你
适合:有几个到几十个站点或自建服务要盯;想要一个能公开给用户看的可用率页面;不想按站点数付费;手里有台长期开着的小机器。
不适合:需要全球多节点探测的,你的服务器只有一个位置,它只能告诉你「从我这里能不能访问」;需要浏览器级别的真实用户监控、要抓页面性能指标的;需要电话叫醒和严格服务承诺的,那是商业监控的活。






