Uptime Kuma 实战:自建服务监控与宕机告警

当你的网站或服务在凌晨三点悄悄挂掉,而你是第二天早上被用户电话叫醒才发现的——这种事每个运维都经历过。Uptime Kuma 就是为解决”服务监控”与”宕机告警”这两个痛点而生的开源工具。它用一个漂亮的面板,帮你 7×24 小时盯住所有站点、接口、端口和容器,一旦探测失败立刻通过 Telegram、钉钉、企业微信或 Webhook 推送通知。本文带你用 Docker 从零搭建一套生产可用的自建监控体系。

一、Uptime Kuma 是什么

Uptime Kuma 是一个轻量的自托管(self-hosted)监控面板,常被比作”开源版的 UptimeRobot”。它最大的优势是数据完全掌握在自己手里,不依赖第三方 SaaS,也不会因为免费额度用尽而漏报。单个二进制或一个容器即可运行,资源占用极低,树莓派都能跑。对讲究数据主权和成本的技术团队来说,它是生产环境监控的入门首选。

和动辄需要搭建 Prometheus + Grafana + Alertmanager 全家桶的重量级方案相比,Uptime Kuma 的安装成本几乎为零:一条 docker compose 命令就能跑起来,不需要写任何配置文件,在网页里点几下就完成监控项的增删改。它不追求指标维度上的极致灵活,而是把”这个服务现在到底活着没有”这个最朴素的问题回答得又快又准。当你只需要一个能随时告诉你谁挂了的看门人时,它比重型监控栈更省心。

二、Docker 一键部署

最稳妥的方式是用 docker-compose 把数据和容器分离,方便日后备份与升级。下面这份配置把监控数据持久化到宿主机的 ./uptime-kuma 目录:

version: "3.8"
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1.23.13
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma:/app/data
    # 如需监控宿主机上的其他容器,加入 docker.sock 只读挂载
    # volumes:
    #   - /var/run/docker.sock:/var/run/docker.sock:ro

执行 docker compose up -d 后,访问 http://服务器IP:3001 即可进入初始化界面,创建管理员账号后就能开始添加监控项。如果你还不熟悉 Compose 的用法,可以先复习一下 Docker Compose 一键编排 这篇基础。

三、添加第一个监控项

Uptime Kuma 支持多种探测类型,几乎覆盖日常运维的全部场景。理解每种类型的适用边界,才能把误报和漏报都压到最低。

监控类型适用场景判定成功条件
HTTP(s)网站、API、健康检查端点返回状态码在设定范围(默认 200–299)
TCP数据库、Redis、SSH 等端口端口在超时时间内可建立连接
Ping服务器是否在线ICMP 往返可达
Docker Container监控宿主机上的容器状态容器处于 running 状态
Keyword页面内容校验响应体包含指定关键字

对多数 Web 服务,直接选 HTTP(s) 并填入健康检查 URL 即可。例如监控 API 网关,可以指向 /health 这样的轻量端点,配合”关键字”模式还能进一步确认返回内容符合预期,避免”进程活着但业务已挂”的假阳性。

四、配置宕机告警通知

监控本身不产生价值,告警触达人才产生价值。Uptime Kuma 内置了几十种通知渠道,下面这张表帮你快速选型:

通知渠道适合人群配置难度
Telegram Bot个人/小团队低(一个 Token + Chat ID)
Webhook需要接入自建系统/飞书/钉钉中(需构造 JSON)
Email (SMTP)传统告警收件箱低
企业微信 / 钉钉国内企业团队中(群机器人 Webhook)

如果你已有统一告警中枢,最通用的是 Webhook。Uptime Kuma 会在状态变化时向目标地址 POST 一条 JSON,你只需在接收端解析 msg 和 status 字段即可。一个简单的转发示例:

curl -X POST "https://your-webhook.example.com/alert" \
  -H "Content-Type: application/json" \
  -d '{"title":"{{NAME}} 状态变更","msg":"{{MSG}}","status":"{{STATUS}}"}'

建议同一个监控项至少挂两个不同通道(例如 Telegram + 邮件),防止单一通道故障时告警石沉大海。模板变量 {{NAME}}、{{MSG}}、{{STATUS}} 会在推送时自动替换为真实值。

五、公开状态页(Status Page)

除了自己看,Uptime Kuma 还能一键生成对外公开的状态页,把各服务的可用率、响应耗时曲线展示给客户或用户,提升信任感。在”状态页”菜单里勾选要展示的监控项,设置自定义域名与品牌色,就能得到一个类似 status.github.com 的页面。对 SaaS 产品或对外 API 服务而言,一个诚实的状态页比口头解释更有说服力。

六、用 Nginx 反代 + HTTPS 暴露面板

直接把 3001 端口暴露在公网并不安全。更规范的做法是用 Nginx 反向代理 套一层 HTTPS,并限制访问来源。核心配置如下:

server {
    listen 443 ssl;
    server_name status.yourdomain.com;

    ssl_certificate     /etc/nginx/ssl/status.fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/status.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;
        # WebSocket 支持,Uptime Kuma 实时推送依赖它
    }

    # 面板本身带登录,但前端再加一层 Basic Auth 更稳妥
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/conf.d/status.htpasswd;
}

注意一定要透传 Upgrade 和 Connection 头,否则面板里的实时图表会无法建立 WebSocket 连接,看起来就像”卡住”了一样。

七、数据备份与迁移

Uptime Kuma 的所有配置和监控历史都落在 /app/data 目录(默认是 SQLite 数据库 + 附件)。备份它就能完整迁移。一个最小可用的定时备份脚本:

#!/bin/bash
# backup-uptime-kuma.sh
SRC=/opt/uptime-kuma/uptime-kuma
DST=/backup/uptime-kuma/$(date +%F)
mkdir -p "$DST"
docker compose -f /opt/uptime-kuma/docker-compose.yml exec -T uptime-kuma \
  sqlite3 /app/data/kuma.db ".backup /tmp/kuma.db"
docker cp uptime-kuma:/tmp/kuma.db "$DST/kuma.db"
tar czf "$DST/data.tgz" -C "$SRC" .

配合 GitHub Actions 把备份归档上传到对象存储,就能实现异地容灾,彻底告别”监控数据随服务器一起蒸发”。恢复时只需把 /app/data 目录整体替换并重启容器即可。

八、生产实践清单与常见坑

部署到生产环境前,对照下面这张清单做一次自检,能少踩很多坑:

检查项说明
监控频率默认 60s,核心服务可降到 20s;过频会被目标站点限流
重试次数建议设为 1–2 次再告警,过滤瞬间抖动
证书监控开启 SSL 证书过期提醒,避免 HTTPS 突然失效
面板安全反代 + Basic Auth,并接入 fail2ban 防暴破
自身可用性监控系统的存活探针要独立于被监控对象

另外,监控面板本身也需要被监控——可以把 Uptime Kuma 部署在和被监控服务不同的节点,避免”同归于尽”。如果面板部署在云服务器上,记得按 SSH 连接故障排查 的思路配好密钥登录与防火墙,减少暴露面。

九、小结

Uptime Kuma 用极低的成本,把”被动救火”变成”主动感知”。从 Docker 部署、监控项配置、多渠道告警、状态页公开,到 Nginx 反代与备份迁移,一套流程走下来,你的服务就拥有了一个永不疲倦的守夜人。当告警第一次在故障发生的 30 秒内把你叫醒,而不是被用户叫醒时,你就会明白这套体系的价值。

上一篇 前端内存泄漏排查实战:从现象到根因定位
下一篇 inotify 实战:实时文件监控与自动化响应
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]