Loading... # 使用 n8n 替代 uptime-kuma 服务监控方案 # 一、概述 ## 1. 背景 在资源受限的服务器环境中,运行多个 Docker 服务可能会导致内存占用过高。uptime-kuma 是一款流行的网络服务健康检测工具,但其内存占用通常超过 100M。对于只有 2G 内存的小型云服务器来说,这是不小的负担。 ## 2. 解决方案 使用 n8n 工作流自动化平台,结合 Schedule Trigger(定时触发器)、Data Table(数据表)、邮件通知/飞书通知等组件,完全可以实现 uptime-kuma 的核心功能。 ### 核心组件 - Schedule Trigger:定时执行检测任务 - Data Table:存储监控目标数据 - HTTP Request 节点:检测服务可用性 - Code 节点:检测 SSL 证书状态 - 邮件/飞书通知:异常告警 # 二、数据表设计 ## 1. Data Table 结构 n8n 自带的 Data Table 可作为简易数据库使用,无需额外维护 Google Sheets 等外部服务。 ### 字段说明 | 字段名 | 类型 | 说明 | |--------|------|------| | name | string | 服务名称,用于通知时显示 | | url | string | 服务地址 | | checkSSL | boolean | 是否检测 SSL 证书状态 | | normal | boolean | URL 请求是否正常 | | SSLExpired | boolean | SSL 证书是否过期 | # 三、服务可用性检测 ## 1. HTTP 状态检测 使用 HTTP Request 节点请求目标 URL,通过响应状态码判断服务是否正常。 ### 配置要点 - 开启 Response 选项以获取状态码 - 将返回的状态码与预设的 normalCode 进行对比 - 根据对比结果更新 normal 字段 ```mermaid graph LR A[定时触发] --> B[读取数据表] B --> C[HTTP Request] C --> D{状态码检查} D -->|正常| E[更新 normal=true] D -->|异常| F[更新 normal=false] ```  # 四、SSL 证书状态检测 ## 1. 初步方案(已废弃) 最初尝试使用 ssl-checker.io 网站获取证书信息,但该服务稳定性差,经常返回 504 错误。 ## 2. 最终方案 使用 Code 节点调用 Node.js 内置的 tls 模块直接获取证书信息。 ### 代码实现 ```javascript const tls = require('tls'); const domain = $input.first().json.domain; return new Promise((resolve, reject) => { try { const socket = tls.connect(443, domain, { servername: domain, timeout: 5000 }, () => { const cert = socket.getPeerCertificate(); if (!cert || Object.keys(cert).length === 0) { resolve({ json: { error: "未能获取证书信息" } }); return; } const validTo = new Date(cert.valid_to); const now = new Date(); const daysRemaining = Math.floor((validTo - now) / (1000 * 60 * 60 * 24)); resolve({ json: { domain: domain, issuer: cert.issuer.O, valid_from: cert.valid_from, valid_to: cert.valid_to, days_remaining: daysRemaining, is_valid: daysRemaining > 0, status: daysRemaining < 7 ? "警告:即将过期" : "正常" } }); socket.end(); }); socket.on('error', (err) => { resolve({ json: { domain: domain, error: err.message, status: "连接失败" } }); }); socket.on('timeout', () => { socket.destroy(); resolve({ json: { domain: domain, error: "连接超时", status: "超时" } }); }); } catch (error) { resolve({ json: { error: error.message } }); } }); ``` ### 环境配置 n8n 默认不允许 Code 节点导入任何模块,需要设置 Docker 环境变量开启内置模块: ```bash # 启用 tls 模块 NODE_FUNCTION_ALLOW_BUILTIN=tls ``` 设置后重启 Docker 实例即可生效。 ```mermaid graph TB A[定时触发] --> B[读取数据表] B --> C{checkSSL?} C -->|是| D[Code 节点: TLS 证书检测] C -->|否| E[跳过] D --> F{剩余天数 < 7?} F -->|是| G[设置 SSLExpired=true] F -->|否| H[设置 SSLExpired=false] ```  # 五、工作流编排 ## 1. 依次间隔触发 使用 Data Table 的 get rows 功能获取所有数据后,n8n 默认会并发处理所有 item。为避免并发压力,需要实现依次触发的机制。 ### 实现方式 采用 Loop Over Items + Wait 节点的组合: - Loop 节点遍历所有 item - Wait 节点设置延迟时间 - 按 itemIndex 设置递增延迟 ### 注意事项 Wait 节点的多个延迟时间设置会在第一个延迟到达时同时触发所有 item,这与直觉不符,需通过 Loop 方式实现真正的依次触发。 ```mermaid sequenceDiagram participant S as 定时触发器 participant D as Data Table participant L as Loop 节点 participant H as HTTP Request participant C as Code 节点 participant N as 通知节点 S->>D: 获取所有监控项 D->>L: 返回 items 列表 loop 每个 item L->>H: 发送 HTTP 请求 H-->>L: 返回状态码 L->>C: 检查 SSL 证书 C-->>L: 返回证书状态 L->>L: Wait 延迟 end L->>N: 发送异常通知 ```  # 六、通知方案 ## 1. 邮件通知 n8n 内置发送邮件节点,可配置 SMTP 服务器发送告警邮件。 ## 2. 飞书通知(推荐) 使用社区节点 n8n-nodes-feishu-lite,该节点包含上百个飞书开放 API 功能。 ### 配置步骤 1. 在飞书开放平台创建机器人应用 2. 获取 Webhook 地址或 App ID、App Secret 3. 在 n8n 中安装 n8n-nodes-feishu-lite 节点 4. 配置凭证并选择相应的通知类型 ### 优势 - 功能丰富,覆盖飞书 API 的各个方面 - 支持 Webhook 类通知 - 可扩展性强 ## 3. 其他 Webhook 通知 使用 HTTP Request 节点可触发任何基于 Webhook 的推送渠道,如钉钉、企业微信等。 ```mermaid graph TB A[检测完成] --> B{状态检查} B -->|服务异常| C[发送告警通知] B -->|证书即将过期| C B -->|证书已过期| C B -->|一切正常| D[结束] C --> E[邮件/飞书/Webhook] ```  # 七、完整工作流 ## 1. 工作流结构 整个监控工作流包含以下步骤: 1. Schedule Trigger 定时触发 2. Data Table 获取所有监控目标 3. Loop 遍历每个目标 4. HTTP Request 检测服务可用性 5. Code 节点检测 SSL 证书状态 6. 更新 Data Table 状态 7. 根据检测结果发送通知 ```mermaid graph TB subgraph 触发层 A[Schedule Trigger<br/>定时触发] end subgraph 数据层 B[Data Table<br/>监控目标列表] end subgraph 检测层 C[Loop Over Items<br/>遍历目标] D[HTTP Request<br/>服务可用性] E[Code Node<br/>SSL 证书检测] F[Wait<br/>间隔延迟] end subgraph 通知层 G{状态判断} H[邮件通知] I[飞书通知] J[Webhook 通知] end A --> B B --> C C --> D C --> E D --> F E --> F F --> C C --> G G -->|异常| H G -->|异常| I G -->|异常| J ```  # 八、方案优势 ## 1. 资源节约 相比 uptime-kuma 占用 100M+ 内存,n8n 方案无需额外部署服务,内存占用更可控。 ## 2. 功能灵活 - 可自定义检测逻辑 - 支持多种通知渠道 - 可集成到现有工作流中 ## 3. 数据自主 使用 n8n 自带 Data Table,数据完全自主可控,无需依赖外部服务。 ## 4. 扩展性强 基于 n8n 的工作流能力,可轻松扩展更多监控指标和通知方式。 *** ## 参考资料 1. [如何使用n8n替代uptime-kuma](https://mp.weixin.qq.com/s/Maqxm74poeCFVrxWUCOCFQ) 2. [n8n Code 节点模块配置](https://docs.n8n.io/hosting/configuration/configuration-examples/modules-in-code-node/) 3. [n8n Code 节点内置方法和变量](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/) 4. [n8n-nodes-feishu-lite GitHub 仓库](https://github.com/other-blowsnow/n8n-nodes-feishu-lite) 最后修改:2026 年 02 月 13 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏