$ cat post.md

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 助手。