为什么需要自托管监控
服务器多了、服务多了之后,“它挂了但你不知道”是运维最大的风险。Uptime Kuma 解决的核心问题:
- 主动探测:定时检查 HTTP/TCP/DNS/Docker 等服务是否正常
- 即时告警:服务异常时通过 Telegram、企业微信、邮件等渠道推送通知
- 状态可见:提供公开状态页,让团队或用户随时查看服务健康状况
- 完全自控:数据在自己服务器上,不依赖第三方 SaaS
Uptime Kuma 是 louislam 开发的开源自托管监控工具(MIT 协议),被称为 Uptime Robot 的开源替代品。自 2021 年发布以来社区极为活跃,目前已支持 90+ 种通知渠道和 10+ 种监控类型。
Uptime Kuma 是什么
Uptime Kuma 是一个基于 Node.js 的自托管监控平台,核心功能包括:
| 功能 | 说明 |
|---|---|
| 多种监控类型 | HTTP(s)、TCP、Ping、DNS、Docker、Push、Steam 等 |
| 通知渠道 | 90+ 种:Telegram、Discord、邮件、企业微信、飞书、钉钉等 |
| 状态页 | 可公开分享的服务状态页面,自定义域名和 CSS |
| 维护窗口 | 定时维护时不发送告警,支持 Cron 表达式 |
| 证书监控 | 自动追踪 TLS/SSL 证书到期时间 |
| 2FA 安全 | 支持 TOTP 双因素认证 |
| 多语言 | 内置中文等多语言界面 |
| 低资源占用 | 典型内存占用 ~100–200 MB |
最新稳定版为 v2.3.2(2026 年 5 月),新增特性请查阅 GitHub Releases 确认。
系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 1 核 | 2 核 |
| 内存 | 256 MB | 512 MB+ |
| 磁盘 | 1 GB(SQLite 数据库) | 10 GB+(含历史数据) |
| Docker | ≥ 20.10 | 最新稳定版 |
| 系统 | 任何支持 Docker 的 Linux | Ubuntu 22.04+ / Debian 12 |
Uptime Kuma 极为轻量,即使是 512 MB 内存的 VPS 也能流畅运行。如果监控数量超过 500 个或历史数据量大,建议使用 MariaDB/MySQL 替代默认的 SQLite。
Docker Compose 部署
基础部署
创建项目目录和 docker-compose.yml:
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kumaservices: uptime-kuma: image: louislam/uptime-kuma:2 container_name: uptime-kuma restart: unless-stopped volumes: - ./data:/app/data ports: - "3001:3001" environment: - TZ=Asia/Shanghaidocker compose up -d访问 http://<服务器IP>:3001,首次进入会提示创建管理员账户。
使用
louislam/uptime-kuma:2标签(而非latest)跟踪 v2.x 的最新稳定版(当前为 v2.3.2),避免跨大版本升级(如 v2 → v3)的兼容性问题。latest标签已废弃,v2.0 起必须显式指定版本。
生产环境部署(Nginx 反向代理 + 本地端口绑定)
生产环境中不应直接暴露 3001 端口。改进后的配置:
services: uptime-kuma: image: louislam/uptime-kuma:2 container_name: uptime-kuma restart: unless-stopped volumes: - /opt/uptime-kuma/data:/app/data ports: - "127.0.0.1:3001:3001" # 仅监听本地,通过 Nginx 反代访问 environment: - TZ=Asia/Shanghai deploy: resources: limits: memory: 512m cpus: "1.0"
127.0.0.1:3001:3001确保端口仅绑定本地回环地址,即使服务器防火墙规则有疏漏,外部也无法直接访问 Uptime Kuma。Docker 默认会绕过 iptables 规则,直接暴露到公网——绑在 localhost 可避免此问题。
Nginx 反向代理配置
Uptime Kuma 必须支持 WebSocket,否则实时数据不更新。完整 Nginx 配置:
server { listen 443 ssl; server_name status.example.com;
ssl_certificate /etc/ssl/certs/status.example.com.pem; ssl_certificate_key /etc/ssl/private/status.example.com.key;
location / { proxy_pass http://127.0.0.1:3001; proxy_http_version 1.1;
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;
# WebSocket 支持(必须) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
# 超时设置(长连接) proxy_read_timeout 86400s; proxy_send_timeout 86400s; }}启用站点:
ln -s /etc/nginx/sites-available/uptime-kuma /etc/nginx/sites-enabled/nginx -t && systemctl reload nginx最后,在 Uptime Kuma 的 设置 → 反向代理 中将”信任代理”设为”是”,使其正确读取 X-Forwarded-* 头。
WebSocket 源验证
自 v1.23.9 起,Uptime Kuma 增加了 WebSocket Origin 检查(修复 CVE-2023-49805),防止跨站点 WebSocket 连接攻击。反代环境下必须正确转发 Host 头(上文 Nginx 配置已包含),否则 WebSocket 连接会被拒绝。
如需调整源验证行为,可设置环境变量:
environment: - UPTIME_KUMA_WS_ORIGIN_CHECK=cors-like # 默认值,强制源验证 # UPTIME_KUMA_WS_ORIGIN_CHECK=bypass # 禁用源验证(不推荐,除非调试反代问题)
bypass模式会禁用源检查保护,仅在排查 WebSocket 连通性问题时临时使用,排查完毕后应立即恢复为cors-like。如果你使用 Nginx Proxy Manager,勾选”WebSockets Support”并确保proxy_set_header Host $host已自动包含。
开启 Ping 监控支持(ICMP)
如果需要在 Docker 容器中使用 Ping 监控,需添加 NET_RAW 能力:
services: uptime-kuma: # ... cap_add: - NET_RAW监控类型与配置
Uptime Kuma 支持 10+ 种监控类型,覆盖绝大多数内网监控场景。以下逐一说明配置要点。
HTTP(s) 监控
最常用的监控类型,检查网站或 API 的可达性和响应状态码。
| 配置项 | 示例值 | 说明 |
|---|---|---|
| URL | https://blog.example.com | 监控目标地址 |
| 监控间隔 | 60 秒 | 最低可设 20 秒 |
| 重试次数 | 3 | 连续失败 N 次后才发告警 |
| 接受的状态码 | 200-299 | 可自定义范围 |
| HTTP 方法 | GET / POST | POST 可附带 Body |
| 自定义 Header | Authorization: Bearer xxx | API 认证 |
常用场景:
- 网站可用性:
GET https://example.com,期望200-299 - API 健康检查:
GET https://api.example.com/health,期望200 - 关键字检查(HTTP Keyword 类型):验证页面是否包含特定文字,用于检测页面是否被篡改或被错误页面替换
- JSON 查询(HTTP JSON Query 类型):对 JSON API 响应做字段级验证,如检查
{"status": "ok"}
TCP 端口监控
检查 TCP 端口是否开放,适用于数据库、SSH、SMTP 等非 HTTP 服务。
| 配置项 | 示例值 |
|---|---|
| 主机名 | 10.0.0.5 或 db.example.com |
| 端口 | 3306 |
常用端口清单:
| 服务 | 端口 | 场景 |
|---|---|---|
| SSH | 22 | 服务器远程连接是否正常 |
| MySQL | 3306 | 数据库是否可连接 |
| PostgreSQL | 5432 | 数据库是否可连接 |
| Redis | 6379 | 缓存服务是否存活 |
| SMTP | 25 / 587 | 邮件服务端口检测 |
| DNS (TCP) | 53 | DNS 服务器 TCP 查询 |
Ping 监控
通过 ICMP 检测网络延迟和丢包率,适合监控路由器、交换机、内网设备的基础网络连通性。
| 配置项 | 示例值 |
|---|---|
| 主机名 | 192.168.1.1(网关) |
| 监控间隔 | 30 秒 |
Docker 部署需要
cap_add: [NET_RAW],非 Docker 部署需要setcap cap_net_raw=+ep。如果无法获取 ICMP 权限,可用 TCP 监控端口 22 作为替代方案。
DNS 记录监控
验证 DNS 记录是否存在且值正确。
| 配置项 | 示例值 |
|---|---|
| 主机名 | example.com |
| DNS 解析服务器 | 1.1.1.1(Cloudflare) |
| 记录类型 | A / AAAA / CNAME / MX / TXT / NS |
| 期望值(可选) | 192.168.1.1 |
典型场景:
- 监控
MX记录确保邮件服务正常 - 监控
A记录检查域名解析是否正确(可设期望值做对比) - 使用内网 DNS 服务器(如
10.0.0.1)解析内网域名
Docker 容器监控
直接检查 Docker 容器运行状态。
volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # 只读挂载配置时填写容器名称或 ID,Uptime Kuma 会调用 Docker API 检查容器状态(running / stopped / unhealthy)。
安全提醒:挂载 Docker socket 意味着容器获得了控制宿主机 Docker 的能力。生产环境建议使用 docker-socket-proxy 做中间代理,限制 Uptime Kuma 只能调用
/containers/*/json等只读端点。
Push 心跳监控
被动型监控——你的定时任务或脚本主动向 Uptime Kuma 推送心跳,如果在指定时间窗口内未收到推送,则触发告警。适合 Cron 任务、备份脚本等没有常驻端口可监控的场景。
创建 Push 监控后,Uptime Kuma 生成一个推送 URL:
https://status.example.com/api/push/abc123xyz?status=up&msg=OK&ping=在 Cron 脚本末尾添加:
# 备份脚本执行完毕后推送心跳0 3 * * * /opt/scripts/backup.sh && curl -s "https://status.example.com/api/push/abc123xyz?status=up&msg=Backup+OK"通知渠道配置
Uptime Kuma 支持 90+ 种通知渠道。以下为内网常用渠道的配置要点。
Telegram
- 向 @BotFather 发送
/newbot,创建机器人并获取 Bot Token - 给机器人发一条消息,然后访问
https://api.telegram.org/bot<TOKEN>/getUpdates获取 Chat ID - 在 Uptime Kuma → 设置通知 → Telegram 中填入 Token 和 Chat ID
- 点击”测试”确认能收到消息
建议创建一个专门的监控告警群组,将机器人拉入群组,用群组 Chat ID 接收通知。这样团队成员都能看到告警信息。
企业微信
在企业微信中创建群机器人,获取 Webhook URL,直接在 Uptime Kuma 中选择”企业微信”通知类型填入即可。
飞书 / 钉钉
飞书和钉钉的配置方式与企业微信类似——在对应平台创建群机器人,复制 Webhook URL,在 Uptime Kuma 中选择对应通知类型即可。
邮件(SMTP)
| 配置项 | 示例值 |
|---|---|
| SMTP 服务器 | smtp.gmail.com |
| 端口 | 587(STARTTLS)或 465(SSL) |
| 发件人 | alerts@example.com |
| 收件人 | admin@example.com |
使用 Gmail 需要开启”应用专用密码”(App Password);使用自建邮箱(如 Poste.io)注意检查 SMTP 端口是否开放。
通知绑定到监控项
创建通知后,进入每个监控项 → 编辑 → 通知,勾选该监控项需要触发的通知渠道。同一个通知可绑定多个监控项,一个监控项也可绑定多个通知渠道。
告警降噪建议
- 设置合理的重试次数(建议 3 次),避免网络抖动导致误报
- 利用维护窗口功能(见下文),在计划维护期间暂停告警
- 关键服务使用即时通知(Telegram),非关键服务可仅用邮件
- 不同监控项使用不同通知渠道,按严重程度分组
状态页
Uptime Kuma 可以创建公开的状态页,供团队成员或用户实时查看服务健康状况。
创建状态页
- 进入 状态页 → 添加状态页
- 填写名称(如”我的服务”)和 slug(URL 标识,如
status) - 选择公开的监控组
- 可选:设置自定义域名、自定义 CSS、页脚文字
- 设置为”已发布”
发布后状态页地址为 https://status.example.com/status/<slug>。
状态页高级配置
| 配置项 | 说明 |
|---|---|
| 公共组 | 将监控项按”公共组”组织到状态页上,可设置组名和排序权重 |
| 自定义域名 | 绑定独立域名(如 status.example.com),需在 DNS 添加 CNAME 或 A 记录 |
| 主题 | 支持亮色 / 暗色 / 自动跟随系统 |
| 自定义 CSS | 完全自定义样式,适配品牌视觉 |
| 显示 SSL 证书 | 在状态页上展示每个 HTTPS 监控项的证书到期时间 |
| 显示标签 | 在每个监控项旁显示标签颜色徽章(非分组方式) |
| 可折叠分组 | 状态页的公共组支持折叠/展开,监控项多时可提高可读性 |
| 页脚文字 | 自定义版权声明或联系信息 |
维护窗口
计划维护期间(如服务器升级、数据库迁移)暂停监控告警,避免误报。
维护策略
| 策略 | 说明 |
|---|---|
| 手动 | 手动开启/关闭,适合临时维护 |
| 单次 | 指定起止时间,一次性执行 |
| 重复 — 间隔 | 每 N 天重复一次 |
| 重复 — 星期 | 每周特定几天(如每周日凌晨) |
| 重复 — 月 | 每月特定日期 |
| Cron 表达式 | 精确控制,如 0 3 * * 0 表示每周日凌晨 3 点 |
创建维护窗口
- 进入 维护 → 计划维护
- 填写标题和描述
- 选择受影响的监控项
- 选择要展示维护信息的状态页
- 选择维护策略并设置时间
- 保存
维护窗口生效期间,监控项继续正常检查,但状态显示为”维护中”而非”已离线”,通知不会发送。
数据备份
Uptime Kuma 默认使用 SQLite(kuma.db),数据存储在 /app/data 目录下。备份策略:
方案一:SQLite 在线导出(推荐,无需停服)
.dump 导出为 SQL 文本,可跨版本恢复,且不锁库:
docker exec uptime-kuma sqlite3 /app/data/kuma.db ".dump" | gzip > \ /backup/uptime-kuma/kuma-$(date +%Y%m%d-%H%M).sql.gz
.dump在数据库写入频繁时可能产生不一致快照(SQLite 不隔离长查询)。数据量极大(>1 GB)或写入密集场景下,建议选择方案三(停机备份)。
方案二:SQLite .backup 在线热备份
# .backup 使用在线备份 API,保证原子性,但执行期间持有读锁(阻塞写入)docker exec uptime-kuma sqlite3 /app/data/kuma.db ".backup /tmp/kuma_backup.db"docker cp uptime-kuma:/tmp/kuma_backup.db /backup/uptime-kuma/kuma-$(date +%Y%m%d).dbdocker exec uptime-kuma rm /tmp/kuma_backup.db
.backup保证数据一致性优于.dump,但执行期间所有写入操作会被阻塞。中小规模数据库(<500 MB)的阻塞时间通常在秒级,可接受。
方案三:停机备份(最安全)
docker stop uptime-kumacp /opt/uptime-kuma/data/kuma.db /backup/uptime-kuma/kuma-$(date +%Y%m%d).dbdocker start uptime-kuma自动化备份脚本
#!/bin/bashBACKUP_DIR="/backup/uptime-kuma"RETENTION_DAYS=14mkdir -p "$BACKUP_DIR"
docker exec uptime-kuma sqlite3 /app/data/kuma.db ".dump" | gzip > \ "$BACKUP_DIR/kuma-$(date +%Y%m%d-%H%M).sql.gz"
# 清理旧备份find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup completed: $(date)"加入 Cron 定时执行:
0 4 * * * /opt/scripts/backup-uptime-kuma.sh >> /var/log/uptime-kuma-backup.log 2>&1数据库文件损坏是 Uptime Kuma 最常见的故障场景之一。以下情况容易导致 SQLite 数据库损坏:非正常关闭容器、使用 NFS/Ceph 等网络存储、Docker Swarm 多副本、磁盘空间满。务必定期备份。
数据恢复
# 解压备份并恢复gunzip /backup/uptime-kuma/kuma-20260528-0400.sql.gzdocker stop uptime-kumadocker cp /backup/uptime-kuma/kuma-20260528-0400.sql uptime-kuma:/tmp/restore.sqldocker exec uptime-kuma sh -c "cat /tmp/restore.sql | sqlite3 /app/data/kuma.db"docker start uptime-kuma进阶:从 SQLite 迁移到 MariaDB
当监控数量超过 500 个或数据库超过 1 GB 时,建议切换到 MariaDB/MySQL。
注意:v2.0 起已移除 JSON 导入/导出功能。迁移需要使用
sqlite3-to-mysql等第三方工具将 SQLite 数据转换到 MariaDB。如果数据量不大(<100 个监控项),重新创建更为简单。
全新 MariaDB 部署(推荐)
如果接受重新设置监控项,直接配置 MariaDB 全新启动:
- 停止现有容器,备份
/app/data目录 - 在
/opt/uptime-kuma/data/下创建db-config.json或在 Docker Compose 中使用环境变量 - 启动后 Uptime Kuma 自动连接 MariaDB,重新创建监控项即可
services: uptime-kuma: image: louislam/uptime-kuma:2 restart: unless-stopped volumes: - /opt/uptime-kuma/data:/app/data ports: - "127.0.0.1:3001:3001" environment: - TZ=Asia/Shanghai - UPTIME_KUMA_DB_TYPE=mariadb - UPTIME_KUMA_DB_HOSTNAME=mariadb - UPTIME_KUMA_DB_PORT=3306 - UPTIME_KUMA_DB_NAME=uptime_kuma - UPTIME_KUMA_DB_USERNAME=kuma - UPTIME_KUMA_DB_PASSWORD=<your-password> depends_on: mariadb: condition: service_healthy
mariadb: image: mariadb:11 restart: unless-stopped volumes: - /opt/uptime-kuma/mariadb:/var/lib/mysql environment: - MARIADB_ROOT_PASSWORD=<root-password> - MARIADB_DATABASE=uptime_kuma - MARIADB_USER=kuma - MARIADB_PASSWORD=<your-password> healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5环境变量名支持连字符格式(如
UPTIME-KUMA-DB-TYPE),功能等价。所有密码占位符(<your-password>、<root-password>)需替换为实际值。
常见问题
Q:访问 Nginx 反代后页面加载异常,或实时数据不更新
这是 WebSocket 未正确转发的典型症状。确认 Nginx 配置中包含以下两行:
proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";并在 Uptime Kuma 设置中开启”信任代理”。
Q:Docker 部署后 Ping 监控不工作
Docker 容器默认没有 ICMP 权限。在 docker-compose.yml 中添加:
cap_add: - NET_RAW或者在 docker run 时添加 --cap-add=NET_RAW。
Q:数据库文件损坏(database disk image is malformed)
先尝试在线修复:
# 先导出再重建(在线操作,无需停服)docker exec uptime-kuma sqlite3 /app/data/kuma.db ".dump" | sqlite3 /tmp/kuma_repaired.db# 替换前先停服docker stop uptime-kumacp /opt/uptime-kuma/data/kuma.db /opt/uptime-kuma/data/kuma.db.bakdocker cp /tmp/kuma_repaired.db uptime-kuma:/app/data/kuma.dbdocker start uptime-kuma.dump 可能无法处理严重损坏。如果以上方法无效,恢复最近一次备份。
Q:磁盘空间满导致 SQLITE_FULL 错误
先清理历史数据腾出空间:
docker exec -it uptime-kuma sqlite3 /app/data/kuma.db "VACUUM"然后在 Uptime Kuma 设置中缩短历史数据保留天数。
Q:更新 Docker 镜像后数据库丢失
常见原因:
- volume 挂载路径使用了相对路径(
./data:/app/data)。当docker compose在不同目录执行时,数据目录位置发生变化 - 执行了
docker compose down -v—-v参数会删除所有匿名和具名卷,数据随之销毁 - 从 v1 升级到 v2 时未备份
/app/data目录
排查步骤:
# 查找 kuma.db 文件位置find / -name "kuma.db" 2>/dev/null# 检查 Docker volumedocker volume ls | grep uptime日常更新正确流程:
# 先备份docker exec uptime-kuma sqlite3 /app/data/kuma.db ".dump" | gzip > /backup/kuma-$(date +%Y%m%d).sql.gz# 再更新(注意不要加 -v)docker compose pull && docker compose up -dQ:反代后 WebSocket 连接失败,控制台报 origin 相关错误
自 v1.23.9 起,Uptime Kuma 验证 WebSocket 的 Origin 头(CVE-2023-49805 修复)。反代环境需确保 Nginx 正确转发 Host 头:
proxy_set_header Host $host;并在 Uptime Kuma 设置中开启”信任代理”。若仍无法解决,可临时设置 UPTIME_KUMA_WS_ORIGIN_CHECK=bypass 排查,但排查后务必恢复为 cors-like。
Q:能否通过子路径(subfolder)访问 Uptime Kuma
不支持。Uptime Kuma 不原生支持 https://example.com/kuma 这种子路径部署。需使用独立子域名(如 status.example.com)。社区有通过自定义 entrypoint 脚本实现子路径的方案,但维护成本高,不建议在生产环境使用。
Q:Docker Swarm / Kubernetes 多副本部署
SQLite 不支持并发写入,因此多副本部署不可行。迁移到 MariaDB/MySQL 后可以支持多副本。