Linux 服务器

Uptime Kuma 搭建网站与服务器监控:Docker 安装、Nginx HTTPS 反向代理与 Telegram 告警

7 个步骤 8 分钟阅读 23 次阅读 0
本文目录

从客户口中才得知网站已经宕机一小时,是最糟糕的故障发现方式。Uptime Kuma 是一款免费、可自建的监控工具,可以每隔几秒到几分钟检查一次网站、端口、Ping 和 DNS,在 SSL 证书到期前提醒你,发布状态页,并通过 Telegram、邮件等数十种渠道发送告警。本文介绍如何用 Docker 安装 Uptime Kuma、通过 Nginx 配置 HTTPS 访问,以及设置 Telegram 通知。

监控程序要部署在与被监控服务器不同的服务器上,最好位于不同地区。如果监控程序和被监控的机器或网络一起宕机,就不会有任何人收到通知。在另一个 IMIDC 机房部署一台小型 VPS(例如用香港监控东京)就足够了。

步骤 1:安装 Docker

按照 Docker 安装教程安装 Docker 和 Docker Compose。Uptime Kuma 的资源占用很低:1 核 CPU、512 MB 至 1 GB 内存就足以运行几百个监控项。

步骤 2:启动 Uptime Kuma

Web 界面监听 3001 端口。将其绑定到 127.0.0.1,可以在前面配置好 Nginx 和 HTTPS 之前,不让它暴露在公网上。

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

docker ps --filter name=uptime-kuma
curl -I http://127.0.0.1:3001

:1 标签对应长期维护的稳定版本线。升级到新的大版本前,请先查看项目在 GitHub 上的发布说明,因为大版本升级可能会迁移数据库。

步骤 3:通过 Nginx 发布为 HTTPS 访问

将 status.example.com 这样的子域名解析到监控服务器,申请证书(参见使用 Certbot 或 acme.sh 申请免费 SSL 证书),然后反向代理到容器。Uptime Kuma 使用 WebSocket,因此必须设置 Upgrade 相关请求头。

server {
    listen 443 ssl;
    http2 on;
    server_name status.example.com;

    ssl_certificate     /etc/letsencrypt/live/status.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/status.example.com/privkey.pem;

    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;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}
nginx -t && systemctl reload nginx

打开 https://status.example.com 并立即创建管理员账号;第一个访问初始化页面的人会成为管理员。

步骤 4:添加监控项

  • HTTP(s):检查 URL 及其状态码。使用 HTTP(s) - Keyword 还能确认页面中包含指定关键词,从而发现那些仍然返回 200 状态码的错误页面。
  • TCP 端口(TCP Port):检查服务能否正常建立连接,例如 22 端口的 SSH、3389 端口的 RDP 或 3306 端口的 MySQL。
  • Ping:基本的连通性检查。部分网络会丢弃 ICMP 包,因此重要服务器建议优先使用 TCP 检查。
  • DNS:确认某条记录仍然解析为预期的值。

检查间隔设为 60 秒、重试 2 到 3 次是比较均衡的设置:真正的故障几分钟内就会报告,偶尔丢一个包也不会把你半夜吵醒。在 HTTP 监控项中开启 Certificate Expiry Notification,即可在 SSL 证书到期前收到提醒。

步骤 5:发送告警到 Telegram

先创建一个机器人(bot),并获取接收告警的聊天 ID(chat ID)。

# 1. In Telegram, talk to @BotFather, send /newbot and copy the token
# 2. Send any message to your new bot (or add it to a group and post there)
# 3. Read the chat ID from the bot's updates
curl -s "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates" | grep -o '"chat":{"id":-\?[0-9]*'

在 Uptime Kuma 中打开 Settings → Notifications → Setup Notification,选择 Telegram,粘贴机器人 token 和 chat ID,点击 Test 进行测试,然后勾选 Default enabled 和 Apply on all existing monitors。群组的 chat ID 以负号开头。

步骤 6:创建状态页

在 Status Pages 中可以发布一个公开页面,展示所选监控项的状态,方便客户和你自己的团队查看。状态页可以使用独立域名,计划维护期间还可以发布维护公告。

步骤 7:备份与更新

# Back up the data volume (monitors, history, settings)
docker run --rm -v uptime-kuma:/data -v "$PWD":/backup alpine \
  tar czf /backup/uptime-kuma-$(date +%F).tgz -C /data .

# Update to the latest release of the same major version
docker pull louislam/uptime-kuma:1
docker rm -f uptime-kuma
docker run -d --name uptime-kuma --restart=always \
  -p 127.0.0.1:3001:3001 -v uptime-kuma:/app/data louislam/uptime-kuma:1

常见问题

经常因为短暂抖动收到告警,但其实并没有宕机?

将重试次数调到 3 次,重试间隔设为 30 到 60 秒。这样只有连续多次检查失败后,监控项才会被标记为宕机。

Ping 一直失败,但网站可以正常访问?

服务器或其防火墙丢弃了 ICMP 包。请改用 TCP 端口或 HTTP 监控。

能否监控网站在中国大陆的访问情况?

Uptime Kuma 测量的是从它所在位置访问的情况。如需了解中国大陆用户的访问体验,可以在回国线路优质的服务器(例如香港 CN2 GIA 服务器)上再运行一个实例,或者使用网络测试工具从多个地点进行测试。

如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上服务器 IP、系统版本、执行过的命令和完整报错信息,方便工程师快速定位。

这篇文章有帮助吗?

相关教程