4075 字
20 分钟
Uptime Kuma 内网部署监控完全指南

为什么需要自托管监控#

服务器多了、服务多了之后,“它挂了但你不知道”是运维最大的风险。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 确认。

系统要求#

项目最低要求推荐配置
CPU1 核2 核
内存256 MB512 MB+
磁盘1 GB(SQLite 数据库)10 GB+(含历史数据)
Docker≥ 20.10最新稳定版
系统任何支持 Docker 的 LinuxUbuntu 22.04+ / Debian 12

Uptime Kuma 极为轻量,即使是 512 MB 内存的 VPS 也能流畅运行。如果监控数量超过 500 个或历史数据量大,建议使用 MariaDB/MySQL 替代默认的 SQLite。

Docker Compose 部署#

基础部署#

创建项目目录和 docker-compose.yml

Terminal window
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma
docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:2
container_name: uptime-kuma
restart: unless-stopped
volumes:
- ./data:/app/data
ports:
- "3001:3001"
environment:
- TZ=Asia/Shanghai
Terminal window
docker compose up -d

访问 http://<服务器IP>:3001,首次进入会提示创建管理员账户。

使用 louislam/uptime-kuma:2 标签(而非 latest)跟踪 v2.x 的最新稳定版(当前为 v2.3.2),避免跨大版本升级(如 v2 → v3)的兼容性问题。latest 标签已废弃,v2.0 起必须显式指定版本。

生产环境部署(Nginx 反向代理 + 本地端口绑定)#

生产环境中不应直接暴露 3001 端口。改进后的配置:

docker-compose.yml
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 配置:

/etc/nginx/sites-available/uptime-kuma
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;
}
}

启用站点:

Terminal window
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 的可达性和响应状态码。

配置项示例值说明
URLhttps://blog.example.com监控目标地址
监控间隔60 秒最低可设 20 秒
重试次数3连续失败 N 次后才发告警
接受的状态码200-299可自定义范围
HTTP 方法GET / POSTPOST 可附带 Body
自定义 HeaderAuthorization: Bearer xxxAPI 认证

常用场景:

  • 网站可用性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.5db.example.com
端口3306

常用端口清单:

服务端口场景
SSH22服务器远程连接是否正常
MySQL3306数据库是否可连接
PostgreSQL5432数据库是否可连接
Redis6379缓存服务是否存活
SMTP25 / 587邮件服务端口检测
DNS (TCP)53DNS 服务器 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 脚本末尾添加:

Terminal window
# 备份脚本执行完毕后推送心跳
0 3 * * * /opt/scripts/backup.sh && curl -s "https://status.example.com/api/push/abc123xyz?status=up&msg=Backup+OK"

通知渠道配置#

Uptime Kuma 支持 90+ 种通知渠道。以下为内网常用渠道的配置要点。

Telegram#

  1. @BotFather 发送 /newbot,创建机器人并获取 Bot Token
  2. 给机器人发一条消息,然后访问 https://api.telegram.org/bot<TOKEN>/getUpdates 获取 Chat ID
  3. 在 Uptime Kuma → 设置通知 → Telegram 中填入 Token 和 Chat ID
  4. 点击”测试”确认能收到消息

建议创建一个专门的监控告警群组,将机器人拉入群组,用群组 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 可以创建公开的状态页,供团队成员或用户实时查看服务健康状况。

创建状态页#

  1. 进入 状态页添加状态页
  2. 填写名称(如”我的服务”)和 slug(URL 标识,如 status
  3. 选择公开的监控组
  4. 可选:设置自定义域名、自定义 CSS、页脚文字
  5. 设置为”已发布”

发布后状态页地址为 https://status.example.com/status/<slug>

状态页高级配置#

配置项说明
公共组将监控项按”公共组”组织到状态页上,可设置组名和排序权重
自定义域名绑定独立域名(如 status.example.com),需在 DNS 添加 CNAME 或 A 记录
主题支持亮色 / 暗色 / 自动跟随系统
自定义 CSS完全自定义样式,适配品牌视觉
显示 SSL 证书在状态页上展示每个 HTTPS 监控项的证书到期时间
显示标签在每个监控项旁显示标签颜色徽章(非分组方式)
可折叠分组状态页的公共组支持折叠/展开,监控项多时可提高可读性
页脚文字自定义版权声明或联系信息

维护窗口#

计划维护期间(如服务器升级、数据库迁移)暂停监控告警,避免误报。

维护策略#

策略说明
手动手动开启/关闭,适合临时维护
单次指定起止时间,一次性执行
重复 — 间隔每 N 天重复一次
重复 — 星期每周特定几天(如每周日凌晨)
重复 — 月每月特定日期
Cron 表达式精确控制,如 0 3 * * 0 表示每周日凌晨 3 点

创建维护窗口#

  1. 进入 维护计划维护
  2. 填写标题和描述
  3. 选择受影响的监控项
  4. 选择要展示维护信息的状态页
  5. 选择维护策略并设置时间
  6. 保存

维护窗口生效期间,监控项继续正常检查,但状态显示为”维护中”而非”已离线”,通知不会发送

数据备份#

Uptime Kuma 默认使用 SQLite(kuma.db),数据存储在 /app/data 目录下。备份策略:

方案一:SQLite 在线导出(推荐,无需停服)#

.dump 导出为 SQL 文本,可跨版本恢复,且不锁库:

Terminal window
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 在线热备份#

Terminal window
# .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).db
docker exec uptime-kuma rm /tmp/kuma_backup.db

.backup 保证数据一致性优于 .dump,但执行期间所有写入操作会被阻塞。中小规模数据库(<500 MB)的阻塞时间通常在秒级,可接受。

方案三:停机备份(最安全)#

Terminal window
docker stop uptime-kuma
cp /opt/uptime-kuma/data/kuma.db /backup/uptime-kuma/kuma-$(date +%Y%m%d).db
docker start uptime-kuma

自动化备份脚本#

/opt/scripts/backup-uptime-kuma.sh
#!/bin/bash
BACKUP_DIR="/backup/uptime-kuma"
RETENTION_DAYS=14
mkdir -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 定时执行:

Terminal window
0 4 * * * /opt/scripts/backup-uptime-kuma.sh >> /var/log/uptime-kuma-backup.log 2>&1

数据库文件损坏是 Uptime Kuma 最常见的故障场景之一。以下情况容易导致 SQLite 数据库损坏:非正常关闭容器、使用 NFS/Ceph 等网络存储、Docker Swarm 多副本、磁盘空间满。务必定期备份。

数据恢复#

Terminal window
# 解压备份并恢复
gunzip /backup/uptime-kuma/kuma-20260528-0400.sql.gz
docker stop uptime-kuma
docker cp /backup/uptime-kuma/kuma-20260528-0400.sql uptime-kuma:/tmp/restore.sql
docker 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 全新启动:

  1. 停止现有容器,备份 /app/data 目录
  2. /opt/uptime-kuma/data/ 下创建 db-config.json 或在 Docker Compose 中使用环境变量
  3. 启动后 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

先尝试在线修复:

Terminal window
# 先导出再重建(在线操作,无需停服)
docker exec uptime-kuma sqlite3 /app/data/kuma.db ".dump" | sqlite3 /tmp/kuma_repaired.db
# 替换前先停服
docker stop uptime-kuma
cp /opt/uptime-kuma/data/kuma.db /opt/uptime-kuma/data/kuma.db.bak
docker cp /tmp/kuma_repaired.db uptime-kuma:/app/data/kuma.db
docker start uptime-kuma

.dump 可能无法处理严重损坏。如果以上方法无效,恢复最近一次备份。

Q:磁盘空间满导致 SQLITE_FULL 错误

先清理历史数据腾出空间:

Terminal window
docker exec -it uptime-kuma sqlite3 /app/data/kuma.db "VACUUM"

然后在 Uptime Kuma 设置中缩短历史数据保留天数。

Q:更新 Docker 镜像后数据库丢失

常见原因:

  1. volume 挂载路径使用了相对路径./data:/app/data)。当 docker compose 在不同目录执行时,数据目录位置发生变化
  2. 执行了 docker compose down -v-v 参数会删除所有匿名和具名卷,数据随之销毁
  3. 从 v1 升级到 v2 时未备份 /app/data 目录

排查步骤:

Terminal window
# 查找 kuma.db 文件位置
find / -name "kuma.db" 2>/dev/null
# 检查 Docker volume
docker volume ls | grep uptime

日常更新正确流程:

Terminal window
# 先备份
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 -d

Q:反代后 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 后可以支持多副本。

参考资源#

Uptime Kuma 内网部署监控完全指南
https://blog.syomega.top/posts/uptime-kuma-deployment-guide/
作者
酱w
发布于
2026-05-28
许可协议
CC BY-NC-SA 4.0