Uptime Kuma 自建监控:宕机秒级推送 Telegram
服务挂了自己最后一个知道?用 Docker 部署 Uptime Kuma 监控面板,盯住博客、SSH、家里所有服务,宕机立即推送 Telegram 告警,附完整 compose 配置。

服务器上的服务多起来之后,一个很现实的问题出现了:服务挂了,你怎么知道? 博客挂了三天没人访问才发现、NAS 掉线一周没备份才察觉——这种事几乎每个自托管玩家都经历过。
解决方案是部署一个监控:Uptime Kuma,自托管界最受欢迎的监控面板,开源免费、界面漂亮、支持几十种告警渠道。这篇用 Docker 部署它,并接上 Telegram 告警——正好当上一篇 Docker 教程的实战复习。
第一步:Docker Compose 部署
在服务器上建目录、写配置:
mkdir -p ~/docker/uptime-kuma && cd ~/docker/uptime-kuma
nano compose.yaml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
ports:
- "3001:3001"
volumes:
- uptime-kuma-data:/app/data
restart: unless-stopped
volumes:
uptime-kuma-data:
启动:
docker compose up -d
docker compose ps # 确认 running
浏览器访问 http://服务器IP:3001,首次打开会引导你创建管理员账号——第一个注册的账号就是管理员,别拖,部署完马上建号。
第二步:添加监控项
Uptime Kuma 支持多种监控类型,常用的三种:
| 类型 | 用途 | 例子 |
|---|---|---|
| HTTP(s) | 网站/API 是否可访问,可检查状态码和响应内容 | 监控我的博客 https://dxj.dpdns.org |
| TCP Port | 某端口是否可连接 | SSH 22 端口、数据库 5432 端口 |
| Ping | 机器是否在线 | 家里另一台设备的内网 IP |
添加一个 HTTP(s) 监控:点左上角「添加监控项」,填名称、URL,心跳间隔默认 60 秒(即每分钟探一次)。保存后立刻能看到延迟曲线和在线率。
几个实用设置:
- 重试次数:设为 2-3 次,避免网络抖动误报。
- 反向代理 + 访问路径:如果你的服务需要先过 Nginx 反代,监控目标直接填域名即可,Kuma 会模拟真实用户访问。
第三步:接 Telegram 告警
监控不推送等于白装。Uptime Kuma 原生支持 Telegram,配置分两步:
1. 创建 Telegram Bot 拿到 Token
在 Telegram 找 @BotFather,发送 /newbot,按提示起名,完成后得到一串 Token(形如 123456:ABC-DEF...)。我博客的新文章 TG 推送管道用的就是同一个 Bot,直接复用即可。
2. 拿到你的 Chat ID
给你刚创建的 Bot 随便发条消息,然后浏览器访问:
https://api.telegram.org/bot<你的Token>/getUpdates
在返回的 JSON 里找到 "chat":{"id":数字},那个数字就是 Chat ID。
3. 在 Uptime Kuma 里配置
设置 → 通知 → 添加通知 → 选 Telegram,填入 Bot Token 和 Chat ID,点「测试」——手机立刻收到一条测试消息,说明链路通了。然后到每个监控项的设置里把通知开关打开(或者建通知时勾选「默认应用于所有现有监控」)。
从此任何服务连续探测失败,几秒内 Telegram 就收到告警;恢复后还会收到一条恢复通知。
第四步:安全收尾
监控面板不该对公网开放——它暴露了你所有服务的拓扑。两个选择:
- 收进 Tailscale 虚拟内网(推荐,见上一篇):
sudo ufw allow in on tailscale0 to any port 3001
然后把 compose 里的端口绑定改到虚拟 IP 或干脆只用 Tailscale 访问。
- 或者用 Nginx 反代 + HTTPS + 强密码,但管理面板暴露公网总归多一分风险,不如虚拟内网干净。
顺手玩一个:公开状态页
Uptime Kuma 还能生成一个公开的状态页(Status Page),像大厂的 status.example.com 那样展示各服务的在线率和故障历史。设置 → 状态页 → 新建,勾选要展示的监控项即可。想给访客看你的博客可用性,可以把状态页用 Nginx 反代挂个子域名,只读页面没有安全风险。
常见坑
| 现象 | 原因与解决 |
|---|---|
| 监控HTTPS网站报证书错误 | 目标站证书过期或自签名;确认证书有效,或在监控项里勾选「忽略 TLS 错误」(不推荐) |
| Telegram 收不到告警 | Token 或 Chat ID 填错;注意 Chat ID 是 getUpdates 里的数字,不是用户名 |
| 误报频繁 | 心跳间隔太短或重试次数为 0,调到 60 秒 + 3 次重试 |
| 容器时区不对 | 挂 -e TZ=Asia/Shanghai 环境变量或挂载 /etc/localtime |
小结
整个体系串起来了:Docker 起服务 → Tailscale 管访问 → Uptime Kuma 盯状态 → Telegram 收告警。这套组合拳打下来,你的自托管基础设施就有了最基本的可观测性,服务挂了你是第一个知道的——而不是最后一个。
接下来两篇换个口味,玩点 2026 年最火的东西:在自己的服务器上部署 OpenClaw,养一个 7×24 小时的私人 AI 助手。
$ giscus --load# 使用 GitHub 账号登录即可发表评论