2026/07/05

Uptime Kuma 2.0:小团队先把可用性监控这层补上

Uptime Kuma 适合做小团队和独立产品的第一层可用性监控:服务探活、证书提醒、Push 心跳、状态页和飞书/企微告警,但它不能替代完整可观测性栈。

Uptime KumaMonitoringDevOpsSelf-hosted

小团队最容易忽视的不是监控工具,而是监控边界。服务挂了、证书过期、接口开始返回错误、定时任务没有跑完,这些问题不一定需要一整套 Prometheus + Grafana + Alertmanager 才能发现。很多时候,需要的是一个足够轻、足够直观、能把告警发到飞书或企业微信里的可用性监控面板。

Uptime Kuma 的价值就在这里。它不是完整可观测性平台,也不应该被包装成万能运维系统。它更像一层“服务是否还能被访问”的前哨:HTTP、TCP、Ping、DNS、WebSocket、Docker 容器、Push 心跳和状态页都能覆盖,部署成本又足够低。对个人开发者、独立产品、小型 SaaS 和内部工具来说,这层前哨很实用。

先把它放在正确的位置

Uptime Kuma 监控的是可用性,不是全链路性能。它能告诉你某个 URL 是否 200、某个端口是否可达、证书还有多久过期、某个 cron 是否按时上报心跳;但它不会替你分析慢查询、调用链瓶颈、资源饱和、业务指标异常。

所以它最适合放在三类位置:第一,公开服务的外部探针;第二,内网服务和自托管工具的健康检查;第三,关键脚本和备份任务的 Push 心跳。把这三类跑起来,小团队的故障发现能力会立刻上一个台阶。

部署要简单,但别裸奔

最小 Docker 命令确实很简单:

docker run -d --restart=always \
  -p 3001:3001 \
  -v uptime-kuma:/app/data \
  --name uptime-kuma \
  louislam/uptime-kuma:2

但生产环境不要只停在这一步。至少要做四件事:数据目录持久化;管理员账号开启 2FA;面板入口放到反向代理后面;告警渠道先用测试监控项跑一遍。Uptime Kuma 是监控入口,一旦被别人登录进去,攻击者不仅能看到你的服务清单,还可能修改通知渠道、屏蔽报警。

如果用 Nginx 或 Caddy 反代,还要确认 WebSocket 代理正常。Uptime Kuma 的实时状态依赖 WebSocket,反代漏掉 Upgrade/Connection 头时,页面可能看起来能打开,但实时更新会异常。

2.0 的关键不是版本号,而是数据库边界

Uptime Kuma 2.x 最值得注意的是外部数据库能力。SQLite 对个人项目很好,简单、少依赖、备份也直观。但监控项变多、采集频率变高、部署进入 Kubernetes 或多节点环境后,SQLite 的文件锁、I/O 抖动和备份方式都会变成运营风险。

这不是说所有人都该立刻迁到 PostgreSQL 或 MySQL。判断标准很朴素:如果只是十几个站点、几十个监控项,SQLite 加定期备份足够;如果已经有几百个监控项、20 秒级频率、需要迁移或高可用,就应该认真评估外部数据库。

告警要少而准

很多团队第一次接监控,最容易把所有服务都设成 20 秒检查、失败一次就通知。结果不是更安全,而是告警噪声迅速淹没人。更稳的做法是分级:核心 API 和支付入口可以高频;后台任务和低风险工具可以 60 秒或更长;第三方服务不要用过短频率,避免被对方限流或拉黑。

通知渠道也要分层。飞书、企业微信、钉钉适合团队值班;Telegram、Bark、邮件适合个人;Webhook 适合接入自己的事故流。关键是每条告警里必须包含服务名、URL、失败原因、时间和恢复状态,否则半夜收到消息也很难判断优先级。

Status Page 是给用户看的,不是给自己看的

Uptime Kuma 的状态页功能很容易被低估。对外服务发生故障时,用户最焦虑的是“不知道你知不知道”。一个简单状态页可以把核心服务、历史事件和恢复状态公开出来,减少重复解释,也让团队对 SLA 更有敬畏。

但状态页不要放太多内部服务。公开页面只展示用户真正关心的入口:主站、API、控制台、文档、登录、支付。内部数据库、Redis、任务队列这些细节不应该暴露给外部。

结论

Uptime Kuma 适合做小团队的第一层可用性监控:轻、自托管、通知渠道多、状态页好用。它不能替代完整可观测性栈,但能把“服务挂了没人知道”这件事先解决。真正成熟的用法不是把它吹成 UptimeRobot 的绝对替代,而是明确边界:用它看服务是否还活着,用日志、指标和 tracing 解释为什么不健康。