用 Docker 搭一套自己的监控告警:Uptime Kuma 部署与 Telegram 通知配置

为什么要自建监控

站点挂了你往往是最后一个知道的人——通常是访客先告诉你。免费拨测服务一般 5 分钟一次、监控项有限、告警渠道也受限。在自有服务器上跑一个 Uptime Kuma:HTTP/TCP/Ping/关键词/证书到期都能监控,间隔自己定,告警推到 Telegram、邮件、企业微信、钉钉、Bark 等渠道(官方 README 标称支持 90+ 通知服务),数据留在自己手里。

适用场景:WordPress 站点、VPS 上的面板与服务、群晖/NAS 上的自建应用、家宽小主机。

前置条件

  • 一台能跑 Docker 的机器:VPS(Debian/Ubuntu/CentOS)、群晖、软路由都行,已装 Docker 与 Compose v2。
  • 想从外网访问面板的话,准备一个子域名,例如 status.example.com。Uptime Kuma 不支持子目录(官方 Wiki 明确说明),别打算放在 example.com/kuma 下。
  • 一个能收消息的 Telegram 账号,或一个 SMTP 邮箱(QQ 邮箱开授权码也可)。
  • 资源占用很小,1 核 512M 足够。

步骤

1. 部署容器

新建目录,写一个 compose 文件:

services:
  uptime-kuma:
    image: louislam/uptime-kuma:2
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "127.0.0.1:3001:3001"
    volumes:
      - ./data:/app/data
    environment:
      - TZ=Asia/Shanghai
docker compose up -d
docker compose ps

这里的端口故意写成 127.0.0.1:3001:3001,只监听本机,之后靠反向代理对外;如果只在局域网用、不打算对公网开放,改成 "3001:3001" 即可。官方仓库的 compose.yaml 用的就是 louislam/uptime-kuma:2restart: unless-stopped、挂载 ./data:/app/data。截至写这篇文章时,:2 对应的最新版本是 2.5.5(Docker Hub 该 tag 的推送时间为 2026-09-16),要固定版本就把 image 写成 louislam/uptime-kuma:2.5.5

不用 compose 也可以:

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

2. 初始化

浏览器打开 http://127.0.0.1:3001(远程机器换成服务器 IP),首次进入会让你创建管理员账号。建完请在设置里开启两步验证(2FA)——这东西一旦暴露在公网,等于把探测全家服务的钥匙挂在门上。

3. 添加监控项

点「添加监控」,常用的四类:

  • HTTP(s):填站点地址,检查间隔 60 秒、超时 10 秒、重试 1 次比较稳;顺手勾上证书到期提醒,HTTPS 站点的证书还剩多少天一目了然。
  • HTTP(s) 关键词:URL 再加一段页面必然出现的文字(比如站点标题)。状态码 200 但页面是空白或报错页时,只有关键词能发现。
  • TCP 端口:填 你的IP:22你的IP:3306,用来盯 SSH、数据库、Redis 这类不返回 HTTP 的服务。
  • 推送(Push):给服务器上的备份脚本、定时任务当心跳。脚本跑完 curl 一下监控项给出的推送地址,超时没收到就告警——比「备份脚本静默失败」靠谱得多。

4. 配置告警

Telegram:找 @BotFather 发 /newbot 建机器人拿 Token;再给这个机器人发一条任意消息,然后访问 https://api.telegram.org/bot<你的Token>/getUpdates 取出 chat.id。回到 Kuma:设置 → 通知 → 新增 → Telegram,填 Token 与 Chat ID,点测试。能收到就通了。通知设置里勾上「默认启用」,新建监控会自动带上它。

邮件:设置 → 通知 → 新增 → Email (SMTP),主机填你的 SMTP 服务器,端口 465(TLS)或 587(STARTTLS),填用户名、密码和收发件地址,同样先点测试。

企业微信机器人、钉钉 Webhook、Bark 是同一套流程,填 Webhook 地址即可。

5. 反向代理(需外网访问才做)

Nginx 配置,关键是 WebSocket 那两个头:

server {
    listen 443 ssl;
    server_name status.example.com;
    # ssl_certificate / ssl_certificate_key 与 HTTP 跳转按你现有配置补全

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Uptime Kuma 是 WebSocket 架构,少了 Upgrade / Connection 头会出现「页面打得开但一直转圈」。完全跑在代理后面时,去 设置 → 反向代理 → HTTP 头 里把「信任代理(Trust Proxy)」打开,日志里才能看到真实访客 IP。用群晖内置反向代理,在规则里勾上「WebSockets」;套 Cloudflare,记得在 Network 里开启 WebSockets。

验证

curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:3001
docker compose ps
docker compose logs --tail=50 uptime-kuma

第一条返回 200 说明面板活着,后两条用来看容器状态和日志。最实在的验证是「用一次假故障测整条告警链路」:加一个必然失败的监控,比如 URL 填 http://127.0.0.1:9/,间隔 20 秒、重试 0 次,等几分钟看手机有没有响。收到了,说明从探测到推送整条路是通的。

常见坑与回滚

  • 数据目录别放 NFS:官方明确不支持网络文件系统,会导致数据库异常。映射到本机磁盘或 Docker 卷。
  • 监控自己挂了没人知道:这是自建监控的死穴。建议另外找一个外部免费拨测,只监控 Kuma 面板地址或它的推送地址,作为兜底。
  • 间隔太短会误报:20 秒间隔配 5 秒超时,线路抖一下能炸出一串告警。公网站点用 60 秒加 1 次重试更实用。官方 README 标称最小间隔 20 秒,具体以你的版本为准。
  • 升级docker compose pull && docker compose up -d
  • 回滚:把 compose 里的 image 改成具体版本号(如 louislam/uptime-kuma:2.5.5)后重新 docker compose up -d。数据都在 ./data,升级前先 tar czf kuma-$(date +%F).tar.gz data 备份,回滚时连数据一起换回去。
  • 磁盘:心跳历史会持续增长,跑久了留意 ./data 体积,面板里可以调整历史保留策略。

先把站盯起来,别的优化以后再说。宕机时早三分钟知道,可能就少几个关掉页面再也不回来的访客。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容