☰
自托管监控实战:本地部署Uptime Kuma与告警配置
2026/10/3 1:38:15 网站建设 项目流程

最近在本地服务器上折腾了一套Uptime Kuma网站监控服务,这东西解决了我一个特别头疼的问题:以前好几个站点、服务挂了我都不知道,往往是用户来问了才发现,非常被动。现在用Uptime Kuma把线上和本地的关键服务全部盯起来,一有异常告警就推送到手机,基本实现了“服务挂了比自己看到还快”的效果。

这篇文章我打算把整个搭建过程、配置细节和踩过的坑完整记录下来。不管你是个人站主、自托管爱好者,还是给公司内部做服务巡检的IT人员,这套方案都值得参考。我会从产品定位讲到环境准备,再到监控项配置、告警通知和常见故障排查,尽可能做到照着操作就能跑起来。

1. 为什么建议把网站监控放在本地服务器里

1.1 Uptime Kuma到底是干什么的

Uptime Kuma是一个开源的监控工具,界面长得很像Uptime Robot,但数据完全掌握在自己手里。它能做的事包括HTTP/HTTPS检查、TCP端口检测、Ping、DNS解析、关键字匹配、证书到期提醒,甚至还能对Docker容器、游戏服务器做针对性探测。

我选择它的核心原因很简单:

  • 免费开源,无节点数和监控项数量限制
  • 自带Web界面,配置直观,不写代码也能用
  • 支持Telegram、钉钉、飞书、邮件、Webhook等几十种通知渠道
  • 内置状态页(Status Page),可以直接对外展示服务运行情况
  • 轻量,Docker部署下占用资源很小,普通家用NAS、小主机都带得动

1.2 本地部署和云上监控服务的区别

很多人会问:既然有现成的在线监控服务,为什么还要在本地服务器上自己搭一套?我实际对比过,两者的差异还是很明显的。

用在线SaaS服务,确实省事,注册账号就能用,但有几个痛点。首先是数据隐私,监控记录会全部存在第三方平台,包括服务器IP、探测频率、响应时间这类信息;其次免费额度通常有限制,监控项多了就要付费;另外有些在线服务在国内访问并不稳定,告警可能延迟,甚至根本没收到。

本地部署这套方案就完全规避了这些问题。监控数据和探测记录都在自己的服务器里存储,没有隐私顾虑;监控数量随便加;主动权在自己手里,想加什么脚本、什么检查逻辑都行。当然,也有代价——你得自己维护探针服务本身,做好备份,监控的可用性取决于运行环境。

这里要特别说一点:如果你监控的是线上生产环境,我建议一定要把本地服务器(探针端)和业务服务器的网络链路做冗余。比如业务服务器在A机房,探针跑在公司内部网络,那么这条内网链路断了,探针自然也会误报。考虑到这点,我后来加了外部Ping作为辅助判断,两套信号交叉验证,减少误报。

1.3 什么人适合这么干

我总结下来,以下这些场景直接从Uptime Kuma获益最多:

  • 个人站长:手上几个网站、API服务需要7x24盯着,一旦宕机能第一时间知道
  • 自托管玩家:家里有NAS或小主机,跑了Nextcloud、导航页、RSS服务等,想统一监控
  • 小微企业IT:公司内部有OA、ERP、图床等系统,需要定期确认服务可用
  • 开发测试团队:用GItLab、Jenkins等服务,希望随时知道构建机状态、仓库服务是否正常

2. 准备阶段:硬件、系统与方案选型

2.1 硬件门槛到底有多低

先聊大家最关心的资源占用。Uptime Kuma本身是Node.js应用,实时监控任务靠后台Worker跑,整体内存占用很小。我在一台2核2G的云服务器上同时监控30多个服务,内存占用在800MB以内;如果只监控几个Web站点,512MB内存的小主机也完全能跑。

本地服务器可以是虚拟机、旧笔记本、树莓派,也可以是NAS里的Docker。核心要求只有一个:保持常开且网络稳定。我之前看到有人拿自己的主力电脑跑,电脑一关机监控就全断了,这就没意义了,监控工具自己先不可用,比不监控更尴尬。

2.2 三种部署方式怎么选

Uptime Kuma支持多运行方式,我梳理了一下:

方式难度适用场景优点缺点
Docker Compose低绝大多数人推荐环境隔离、升级回滚方便需要Docker基础
npm直接运行中想省掉容器层的用户资源占用更小Node版本依赖自己维护
二进制安装包中低Windows环境比较友好不用装Node环境更新流程较繁琐

我个人推荐Docker Compose,理由很实际:升级Uptime Kuma时只需改镜像版本号后重新up,数据卷不会动,坏了也能秒回滚。npm方式虽然省资源,但Node版本变动容易引发依赖问题,后期维护成本更高。

2.3 目录结构规划

在正式动手前,先想清楚数据目录放哪儿。我习惯把自托管应用统一放在一个目录下,方便管理备份。以下是我的目录结构示例:

/opt/uptime-kuma/ ├── docker-compose.yml └── data/ # 挂载给容器,存放SQLite数据库、配置和上传文件

如果你是用NAS,建议把data目录放在存储池里,这样即使容器重建、系统重装,监控配置和记录都能完整保留。

3. 本地服务器上手把手搭建Uptime Kuma

3.1 安装Docker环境

如果你的服务器还没装Docker,先按下面步骤装好。以下命令适用Debian/Ubuntu系列系统,其他发行版可以自行查找对应安装方法。

# 更新索引并安装依赖 sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥和仓库 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

装完验证一下:

sudo docker --version sudo docker compose version

如果你的机器已经装有Docker但版本较老,建议升级再继续。我用过较老版本跑Uptime Kuma,遇到过容器莫名退出的情况,升级Docker后彻底消失。

3.2 编写Docker Compose配置

在目录里新建docker-compose.yml,内容如下:

version: '3.8' services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma restart: always ports: - "3001:3001" volumes: - ./data:/app/data environment: - TZ=Asia/Shanghai

这段配置有几个细节值得留意:

  • 镜像标签用:1,代表跟踪1.x大版本,自动获取最新的1.x稳定版
  • 端口映射3001:3001是Uptime Kuma默认Web端口,如果本地服务器上已有服务占用3001,可以改成3002:3001
  • TZ=Asia/Shanghai设置时区,否则日志和监控记录显示UTC时间,排查问题时会很混乱
  • restart: always保证宿主机重启后容器自动拉起

启动容器:

cd /opt/uptime-kuma sudo docker compose up -d

第一次启动会拉取镜像,耐心等一会儿。完成后执行docker ps确认容器状态是Up。

3.3 访问并完成初始化

打开浏览器访问http://你的服务器IP:3001,第一次进入会让你创建管理员账号。这里提醒一句:密码一定要用密码管理器生成并保存好,后续找回密码比一般Web应用麻烦不少。

登录以后会看到默认的“首页”状态页和一个示例监控项。这些都可以删掉,后面按自己的实际服务来建。

3.4 配置域名访问和HTTPS

如果只用IP加端口访问,其实已经能用了。但想要长期稳定使用,建议用一个子域名加HTTPS来访问管理界面。我在本地的nginx服务器里加了这样一段反向代理配置:

server { listen 443 ssl http2; server_name status.example.com; ssl_certificate /etc/nginx/ssl/example.com.pem; ssl_certificate_key /etc/nginx/ssl/example.com.key; location / { proxy_pass http://127.0.0.1:3001; 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_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 60s; proxy_read_timeout 60s; } }

注意proxy_set_header Connection "upgrade"这行不能省。Uptime Kuma界面会实时更新监控状态,底层用了WebSocket,缺少这行配置的话页面会一直转圈,监控状态不自动刷新。为了这个配置我折腾了半小时,后来发现就是少了这行。

3.5 基础设置里这个选项必须动

进入“设置”,把语言切换为中文,界面会友好很多。再检查一下“监控类型”里是否配置了正确的轮询间隔默认值,后面创建监控项时可以单独覆盖。

备份设置也建议在初始化阶段就配好。Uptime Kuma提供了一键备份功能,可以生成JSON备份文件,也可以把备份文件发送到外部存储。我自己是设置每周自动备份,备份文件同步到另一台NAS和网盘,防止服务器磁盘挂掉之后所有监控配置付之东流。

4. 监控配置:从一次HTTP检查到完整告警链路

4.1 创建第一个监控项

点击“添加监控项”,选择“HTTP(S)”类型,这是监控网站最基础也最重要的方式。

表单里有几个关键字段:

  • 名称:建议用域名加功能来命名,比如“官网首页”、“API健康检查”
  • 网址:填写实际要监控的URL
  • 监控间隔:默认60秒,个人网站可以放宽到120秒或者300秒,减少无意义请求
  • 超时设置:默认会比较短,我通常调到30秒,避免弱网环境误报
  • 重试次数:填2或3,连续失败这么多次才触发告警
  • 状态码预期:填200,也可以填202、301等
  • 关键字检查:如果页面里有一段固定文字,可以填进去做内容校验

“重试次数”这个是重点。我刚开始没注意,设成了1次,结果某天服务被防火墙临时拦截了一下,20秒后又恢复了,但告警已经发出去了,半夜被短信吵醒。设置重试2次之后,单次网络抖动不会立刻告警,误报率明显下降。

4.2 设置告警通知

没有告警通知的监控意义减半。Uptime Kuma对通知渠道的支持相当全面,我目前用的是Telegram和邮件。这里贴一个Telegram的配置思路作为示范。

先在Uptime Kuma“设置”里找到“通知”,点“设置通知”,类型选Telegram,填入Bot Token和Chat ID。然后点击“发送测试消息”,如果配置成功,几秒内会收到一条测试消息。

各通知渠道的适用场景和建议:

通知渠道优点适用场景注意事项
邮件/SMTP通用可靠正式告警、日报注意邮箱发送频率限制
Telegram Bot实时性高、免费个人/团队日常告警需要科学网络,国内可能不稳
钉钉/飞书Webhook国内速度快国内团队协作在群组中添加Webhook机器人
Webhook自定义灵活对接自建通知系统按需开发,自由度最高
Discord适合海外团队与海外群组联动同样需考虑网络因素

4.3 使用状态页对外展示

如果希望让用户、同事也能直接看到系统是否正常运行,而不需要登录Uptime Kuma后台,可以设置“状态页”。

状态页可以设置分组,比如“核心服务”、“辅助服务”,然后勾选对应监控项。还支持自定义域名访问。我在公司内网就建了一个状态页,开发同事自查服务状态直接在网页上看,不需要再问运维,省了不少沟通成本。

4.4 高级HTTP检查技巧

除了最基础的GET请求,Uptime Kuma的HTTP(s)监控还支持自定义请求头、POST数据、Basic Auth,这些在监控内部API时会用到。

举一个实际例子:我监控的后端接口要求POST请求才返回正常,如果直接用GET去探测,服务明明活着也会返回405错误码。正确的做法是在监控项里选“HTTP(S)”后,把请求方法改成POST,并填写对应的请求体和请求头。

另外还有“关键字检查”功能,需要勾选“关键字”选项。比如我监控一个文件上传接口,正常响应里会包含"status":"success",如果后端逻辑出错但返回还是200,关键字检查能帮我发现这类半故障状态。未来像这类页面渲染异常、接口静默报错的情况,监控工具的响应时间曲线也会暴露问题。

5. 进阶玩法:除了监控网页还能干很多事

5.1 证书到期监控,不怕SSL证书过期

SSL证书过期是特别常见的故障原因,早年我吃过不少亏。Uptime Kuma内置了“证书到期”监控类型,只需要填域名和端口,它会自动检测证书剩余天数。

设置告警阈值也简单,在监控项编辑里,把“证书剩余天数不超过(天)”设成30,意思是还剩30天时触发告警。这样证书快到期前就收到提醒,通常留在续期上提前处理,再也不会出现证书过期网站打不开的情况。

5.2 用Ping和TCP检查本地的自托管服务

对于内网服务,比如NAS、路由器管理页面、GitLab容器,不一定需要HTTP检查,Ping或TCP端口检查就够了。

  • Ping监控:适合判定主机是否在线,但对防火墙策略比较敏感,某些服务器禁Ping的话会上报失败
  • 端口监听检查:适合检查特定端口是否开放。比如监控sshd的22端口,或者数据库的3306端口

这两种监控在创建时选对类型就行,配置很简单,却能在HTTP层还没暴露问题时提前发现网络或主机的异常。

5.3 API对接Prometheus类的监控平台

Uptime Kuma自带了一些API接口,可以输出拿到监控状态。比如/api/status-page/your-slug可以获取状态页的JSON数据,方便对接自己做的看板。

如果要更细粒度的监控指标,Uptime Kuma的数据库是SQLite,表结构相对清晰,我写过几个Python脚本去读SQLite数据,再把数据吐给Prometheus exporter,这种方式适合对监控数据二次加工的场景。不过,这种玩法的合理性要看你是否真的需要。大多数场景直接用自带功能就好,避免过度设计。

5.4 数据备份和迁移

前面提到过备份,这里把完整流程说清楚。Uptime Kuma的数据都存在data目录下的SQLite数据库文件kuma.db。备份数据最简单的方式就是压缩这个目录。

我自己的备份脚本大致逻辑是:

#!/bin/bash BACKUP_DIR=/backup/uptime-kuma mkdir -p $BACKUP_DIR cd /opt/uptime-kuma sqlite3 data/kuma.db ".backup '$BACKUP_DIR/kuma-$(date +%F).db'" tar czf $BACKUP_DIR/upload-$(date +%F).tar.gz data/upload/ find $BACKUP_DIR -mtime +30 -delete

这段脚本会先通过SQLite的backup命令做一致性备份,避免直接复制db文件导致数据不一致;然后打包上传文件,最后清理30天前的旧备份。

迁移也不难:新服务器上装好Uptime Kuma,把备份的db文件放到data目录里,启动容器就能看到原有监控项和记录,完全无缝。

6. 实操中常见问题与排查实录

6.1 容器起不来或反复重启

如果执行docker logs uptime-kuma后发现端口被占、数据库权限报错,通常出在以下几个方面:

  • 端口冲突:宿主机上3001已被其他程序占用,改映射端口即可
  • data目录权限:chmod -R 777 data有时能解决权限问题,但更推荐用chown调整属主,因为直接777在安全加固时是个隐患
  • 磁盘空间不足:df -h确认空间剩余,磁盘满了容器也会起不来

6.2 Telegram通知收不到

这个问题几乎所有人都遇到过。首先确认Bot Token和Chat ID是否填对,Telegram的Chat ID不是用户名,需要找BotFather或GetUpdates接口获取。其次是网络问题,Telegram在国内不稳定,建议尝试用Webhook方式对接企业微信、钉钉这类国内服务。

也提醒一句:如果你的服务器本身也在“有针对性地访问Telegram”,那这个问题不算网络问题。但不管什么情况,Uptime Kuma的告警链路不能依赖你的网络环境,否则它自己也不可靠。

6.3 告警风暴问题

监控项一多,某个基础网络抖动可能会导致几十个监控项同时触发告警,通知轰炸非常吓人。

解决办法有几个:

  • 每个监控项单独设重试次数,至少2次
  • 通知里设置“启动通知间隔”,晴天时不会频繁重复提醒
  • 把不关键的监控项单独分组,用低优先级的通知渠道
  • 对共享网络,做一个“上游连通性”监控项,只要这个监控项失败,就自动抑制其他相关监控项的告警

6.4 SQLite数据库损坏

Uptime Kuma用的是SQLite,非正常断电、磁盘故障等极端情况下,数据库可能损坏,表现是页面打开白屏或监控项加载不出。处理方式是先停容器,然后备份损坏的db文件,再用SQLite自带的恢复命令尝试修:

sudo docker stop uptime-kuma cd /opt/uptime-kuma/data cp kuma.db kuma.db.bak sqlite3 kuma.db ".recover" | sqlite3 recover_kuma.db mv recover_kuma.db kuma.db sudo docker start uptime-kuma

这个方案不敢保证100%找回数据,所以前面说的定期备份很重要。SQLite文件被破坏的情况下,最后能救命的往往只有备份。

6.5 管理员密码忘了怎么办

Uptime Kuma目前没有图形化的“忘记密码”功能。如果你能通过命令修改数据库,可以重置密码,但操作起来比较复杂,还要处理哈希。我的经验是:与其折腾重置,不如直接恢复备份。所以日常备份越勤快,这类问题处理越轻松。

6.6 为什么我的监控显示总是红色但网站能打开

这类问题九成出在URL本身。网站能通过浏览器打开,浏览器会在URL后自动补全协议。如果你在浏览器里输入example.com没问题,但在Uptime Kuma里填URL时没写http://或https://,就会出现连接失败。

另一个常见原因是服务器返回的状态码不是200,比如302重定向。此时需要看期望的状态码,或干脆选“任何状态码都成功”再配合关键字检查。

最后分享一点个人经验

整个Uptime Kuma搭建过程并不复杂,真正花时间的是理解自己的服务依赖和故障模式。我刚开始用的时候,把能监控的都监控上了,结果告警一天几十条,慢慢的大家都把通知屏蔽了,等于白搭。后来我学会做减法:核心业务用高频监控加重试,边缘服务低频轮询;重要告警和一般告警分开渠道;状态页只放真正需要给人看的内容。

这套方案已经在我的本地服务器上稳定跑了几个月,期间帮我发现了至少三次证书过期隐患、一次后端服务内存溢出导致的半宕机,还有一次数据库连接池被打满的隐形故障。很多故障都不是“完全打不开”,而是响应变慢、局部报错,Uptime Kuma的响应时间和关键字检查恰恰能捕捉到这些细节。如果你的服务器还在“裸奔”,真的建议花半小时装一个,你会感谢当时的自己。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询