用 Uptime Kuma 搭建自建监控

站点挂了往往不是第一时间知道,而是用户来反馈才知道。Uptime Kuma 是一个免费、开源的 uptime 监控工具,支持 HTTP(s)、TCP、Ping、DNS 等协议,自带漂亮的状态页和 90 多种通知渠道。数据存在自己的服务器上,没有按监控项收费的问题,小团队或个人站长用它替代商业监控服务很合适。部署过程也简单:一个 docker-compose 文件加一个反向代理,十分钟内就能把监控跑起来,比起反复比较各家 SaaS 的免费额度,自建一次就一劳永逸。

为什么要自建而不是用商业监控

商业监控服务通常按监控项和通知渠道收费,监控项一多,月费就上去了;免费套餐又往往限制历史保留时长和请求频率。Uptime Kuma 把数据存在你自己的服务器上,不受套餐限制,监控数量、历史数据、通知渠道都没有额外费用。对预算有限的小团队来说,这是很实际的考量。当然自建也有代价:监控服务本身要维护,单点部署时它挂了就没人提醒你——所以生产环境建议再挂一个外部探针兜底。

Docker Compose 部署

# docker-compose.yml
version: '3.8'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:latest
    container_name: uptime-kuma
    ports:
      - "127.0.0.1:3001:3001"
    volumes:
      - ./uptime-kuma-data:/app/data
    restart: unless-stopped

参考:Uptime Kuma 官方仓库 https://github.com/louislam/uptime-kuma

注意这里只把端口绑定到 127.0.0.1,外部无法直接访问,需要配合 Nginx 反向代理加 HTTPS 暴露。

Nginx 反向代理

# /etc/nginx/sites-available/status.example.com
server {
    listen 443 ssl http2;
    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;
    }
}

证书申请与自动续期可以参考Let's Encrypt 配置。

一键部署脚本

#!/bin/bash
# deploy-uptime-kuma.sh

mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma
nano docker-compose.yml   # 粘贴上面的 YAML
docker compose up -d
docker compose ps
echo "访问 http://your-server:3001"
echo "再用 Nginx 反向代理配置 HTTPS"

首次使用

  1. 打开 http://your-server:3001(或你的域名)。
  2. 创建管理员账号。
  3. 点击 Add Monitor,选择监控类型。
  4. 填入网站地址和检查间隔。
  5. 配置通知渠道(Telegram、Email、Slack 等)。

通知配置示例

Telegram:

1. 在 Telegram 里通过 @BotFather 创建机器人
2. 拿到 Bot Token 和 Chat ID
3. Uptime Kuma: Settings → Notifications → Add → Telegram
4. 填入 Token 和 Chat ID → Test 验证

邮件 SMTP:

1. Settings → Notifications → Add → SMTP
2. 填 SMTP 服务器、端口、用户名、密码
3. 建议开启 TLS
4. 发送测试邮件验证

支持的监控类型

类型 用途 典型检查项
HTTP(s) 网页可用性 状态码、关键字、响应时间
TCP 端口连通性 数据库、SSH、Redis 端口
Ping 主机存活 丢包率、延迟
DNS 域名解析 A 记录、解析结果
证书 SSL 证书有效期 到期天数

安全与维护

Uptime Kuma 虽然只是监控工具,但也别裸奔。上线后第一件事是改掉管理员密码,并关闭开放注册;面板入口建议放在独立的子域名下,配合反向代理加 HTTPS。数据目录要纳入备份计划,监控配置、通知设置都在里面。镜像升级时先备份数据再拉新版本,回滚也容易。

公开状态页的打开方式

配置好监控后,可以给每个监控项开启"公开状态页",生成一个只读链接,放在官网页脚或文档站里。这样用户遇到故障时先看状态页,而不是直接找客服。状态页只读,不影响内部管理界面。

常见问题

通知收不到怎么办? 先检查通知配置里的 Token/账号是否正确,用 Test 按钮发一条测试;再确认服务器能访问 Telegram/SMTP 的域名,部分厂商需要额外放行。容器重启后数据还在吗? 只要卷挂载了 ./uptime-kuma-data:/app/data,监控配置和历史记录都在;升级镜像前先备份该目录。能监控内网服务吗? 可以,Uptime Kuma 跑在内网就能监控内网 IP,也可以把它当作探针去测公网服务。和 Grafana/Prometheus 是什么关系? 它是轻量的可用性监控,侧重"挂没挂",而 Prometheus 侧重指标采集与分析,两者可以共存。

进阶:多实例与备份

如果业务面向全球用户,可以在不同地区各部署一个实例,用多个探针交叉验证。升级或迁移前,把整个 uptime-kuma-data 目录打包备份即可;恢复时解压回原路径再启动容器,配置和监控项会原样回来。

最佳实践

  • 间隔与告警疲劳。业务告警建议 1 分钟间隔、连续失败 2-3 次再触发通知,避免网络抖动造成误报。更完整的告警策略见告警疲劳与值班实践。
  • 多个监控点。条件允许时在国内外各放一个实例,交叉验证可以区分"网站挂了"还是"某条线路挂了"。
  • 公开状态页。面向用户的站点可以把状态页设为公开,减少"是不是只有我这里打不开"的客服咨询。
  • 配合合成监控。把 Uptime Kuma 与合成监控结合,覆盖更接近真实用户的场景。

监控体系的整体规划可以参考监控与告警指南,也欢迎浏览监控报警分类。