Uptime Kuma 自托管监控体系搭建指南:HTTP、TCP 与 Push 监控
自托管环境往往同时运行多个服务,不能每次都靠人肉检查「还活着吗」。本文讲 Uptime Kuma 监控体系的搭建——从 v1 升级到 v2、三种监控类型的设计、SSH 探针的 Push 监控,以及 TCP Monitor 的一个前端坑。
为什么选 Uptime Kuma
选型标准很直接:开源、自托管、Docker 部署、支持多种监控类型、有告警通知。Uptime Kuma 完全满足,而且 UI 做得不错。
部署很简单,一个 Docker 容器,数据持久化到命名卷:
services:
uptime-kuma:
image: louislam/uptime-kuma:2
volumes:
- uptime-kuma-data:/app/data
ports:
- "127.0.0.1:3001:3001" # 只监听本地,由 Traefik 反代
注意端口绑定到 127.0.0.1——Uptime Kuma 只通过 Traefik 反代到 status.example.com 访问,受 Authelia 保护,不直接暴露。
从 v1 升级到 v2
升级很简单:镜像标签从 louislam/uptime-kuma:1 改为 louislam/uptime-kuma:2,然后 docker compose up -d。数据卷兼容,配置自动迁移。
但有一个细节:v2 的 API 路径变了,之前用浏览器自动化脚本建的 Monitor 需要确认是否正常工作。升级后逐一检查所有 Monitor 状态,确认无异常。
三种监控类型
1. HTTP(S) 监控:域名可达性
最基础的监控类型——定期 curl 域名,检查返回状态码。
为所有对外域名各建立一条 HTTP 监控即可,下面是几条典型示例:
| 监控项 | 目标 | 检查间隔 | 期望状态码 |
|---|---|---|---|
| 主站 | https://app.example.com |
60s | 200 |
| 业务服务 | https://service.example.com |
60s | 200 |
| 管理面板 | https://panel.example.com |
60s | 200 |
| 监控状态页 | https://status.example.com |
60s | 200 |
注意:Uptime Kuma 监控的是经过 Traefik 反代 + Authelia 认证的完整链路。如果 Authelia 挂了,所有受保护域名的监控都会告警——这正是我们想要的,因为 Authelia 挂了意味着用户无法访问所有管理面板。
对于需要认证的域名,Uptime Kuma 的 HTTP 监控会收到 302 跳转(到 Authelia 登录页),这是正常的。可以把期望状态码设为可接受 200/301/302/303/307/308/401/403/404 中的任何一个——只要不是连接失败(000)或 5xx 服务器错误,都算正常。
2. TCP Port 监控:内网服务可达性
有些服务不对外暴露 HTTP 端口,但需要确认端口在监听:
| 监控项 | 目标 | 说明 |
|---|---|---|
| 内部 API 服务 | host.docker.internal:<自定义端口> |
宿主机/内网上的服务端口 |
| 数据库管理界面 | host.docker.internal:<自定义端口> |
宿主机/内网上的服务端口 |
为什么不能直接用 127.0.0.1?因为 Uptime Kuma 运行在 Docker 容器里,容器内的 127.0.0.1 是容器自己,不是宿主机。要访问宿主机端口,需要用 host.docker.internal(在 compose 中通过 extra_hosts 映射)或 Docker 桥接网络的网关地址(即宿主机在 Docker 网络中的地址)。
3. Push 监控:SSH 探针
这是最特殊的一种——不是 Uptime Kuma 主动去检查,而是外部探针主动推送心跳。
原理:
1. Uptime Kuma 创建一个 Push 类型的 Monitor,生成一个带 token 的 Push URL。
2. 宿主机上的探针脚本每 2 分钟执行一次 SSH 连接测试,成功后向 Push URL 发送 HTTP 请求。
3. Uptime Kuma 记录心跳。如果超过 3 分钟没收到心跳,判定为宕机并告警。
crontab (*/2) → ssh-probe.sh → SSH 连接 probe@localhost
↓ 成功
curl "$PUSH_URL"
↓
Uptime Kuma 记录心跳
这种设计的好处在前面的安全加固一文里讲过——探针验证的是完整 SSH 认证链路。
TCP Monitor 类型选择 Bug
用浏览器自动化脚本批量建 Monitor 时,容易踩到 Uptime Kuma 的一个前端 bug。
现象:点击「Monitor Type」下拉框选择「TCP Port」后,下拉框显示的值没变,提交后 Monitor 的类型字段为空或报 "Unknown Monitor Type"。
根因:Uptime Kuma 前端是 Vue 3 + 自定义表单处理。标准的 DOM click 事件不触发 Vue 的响应式更新——下拉框视觉上选了,但底层数据模型没绑定上。
修复:绕过 UI 层,直接操作底层 <select> 元素:
const select = document.querySelector('select.form-select');
select.value = 'port'; // TCP Port 的内部值
select.dispatchEvent(new Event('change')); // 手动触发 Vue 响应式
区分两类错误:
- 报 "Unknown Monitor Type":内部记录的 type ID 损坏 → 删掉重建。
- 报 "Request timeout":配置正确但服务不可达 → 查网络/服务状态,不用改配置。
可复用经验:自动化操作 Vue/React 等响应式框架的表单时,click 不一定触发数据绑定。直接改 DOM value + dispatchEvent 对应事件更可靠。
告警通知
Uptime Kuma 支持多种通知渠道(邮件、Telegram、Webhook 等)。通常会配置邮件通知,关键服务宕机时发邮件告警。
告警策略:
- HTTP 监控:连续 2 次失败后告警(避免网络抖动误报)。
- TCP 监控:连续 3 次失败后告警。
- Push 监控:超过间隔的 1.5 倍未收到心跳后告警。
监控看板
Uptime Kuma 的状态页面功能可以创建公开的看板,展示所有服务的可用性和历史状态。这对自托管来说很有价值——不用登录管理面板就能看到整体健康状况。
看板地址通过 Traefik 反代到 status.example.com,受 Authelia 保护。如果需要公开状态页(比如给团队成员看),可以创建一个不需要认证的公开状态页,只展示关键服务的可用性百分比,不暴露内部细节。
与 health-check.sh 的关系
Uptime Kuma 和 health-check.sh 是互补的:
| 维度 | Uptime Kuma | health-check.sh |
|---|---|---|
| 运行方式 | Docker 容器,常驻 | Bash 脚本,按需 |
| 检查频率 | 每 60 秒 | 手动或 crontab |
| 历史记录 | 有,带图表 | 无,只看当前 |
| 告警通知 | 有(邮件/Telegram 等) | 无 |
| 检查深度 | HTTP/TCP/Push | 更深(磁盘/内存/SSL/备份/数据库连接) |
Uptime Kuma 负责持续监控 + 告警,health-check.sh 负责深度巡检。日常靠 Uptime Kuma 看板巡视,每周跑一次 health-check.sh 做全面体检。
小结
Uptime Kuma 监控体系的三条经验:
- HTTP 监控覆盖所有域名,验证的是完整链路(DNS → Traefik → Authelia → 后端服务),任何一环断裂都能捕获。
- Push 监控适合无法主动探测的场景(如 SSH 认证链路),探针受限用户 + 心跳推送的设计既安全又可靠。
- 自动化操作响应式框架的表单时,直接改 DOM value + dispatchEvent 比 click 更可靠——这是 Uptime Kuma TCP Monitor 踩坑的核心教训。