当前位置: 首页 > news >正文

使用n8n搭建服务器监控系统:从Webhook到Telegram告警的完整实现

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

🎏:你只管努力,剩下的交给时间

🏠 :小破站

使用n8n搭建服务器监控系统:从Webhook到Telegram告警的完整实现

    • 前言
    • 环境准备
    • 核心流程设计
      • 1. 接收服务器监控数据
      • 2. 配置和验证Token
      • 3. 认证分流处理
      • 4. 处理监控数据
      • 5. 检查是否需要告警
      • 6. 发送告警到Telegram
      • 7. 返回成功响应
    • 测试验证
      • 告警效果展示
      • 完整工作流视图
    • 服务器端监控脚本
    • 常见问题
    • 总结
    • 感谢

本文介绍如何使用n8n工作流自动化工具搭建一个完整的服务器监控系统,实现从数据采集、告警判断到Telegram消息推送的全流程自动化,整个方案无需编写复杂代码,配置完成后可实现7x24小时实时监控。

前言

传统的服务器监控方案通常需要部署专门服务武器监控系统(如Prometheus、Zabbix),配置复杂且资源消耗较大。对于中小规模服务器监控需求,使用n8n可以快速搭建一套轻量级的监控告警系统,通过可视化的工作流编排实现数据采集、处理和告警。

适用场景:

  • 中小规模服务器(1-50台)的资源监控
  • 需要快速搭建监控告警系统
  • 希望通过Telegram接收告警通知
  • 对监控系统有定制化需求

环境准备

基础环境:

  • n8n 工作流平台(本文基于最新稳定版)
  • Telegram Bot(用于接收告警消息)
  • 支持HTTPS的域名(用于Webhook接收)

配置信息获取:

  • n8n域名:替换your-n8n-domain.com为你的n8n实际部署域名
  • 认证Token:使用openssl rand -hex 32命令生成强随机字符串
  • Telegram Chat ID:与Bot对话后访问 https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates 获取
  • Telegram User ID:同上述方法获取,在返回的JSON中查找from.id字段

监控数据格式:
系统通过Webhook接收JSON格式的监控数据,包含以下字段:

  • server_name: 服务器名称
  • cpu_usage: CPU使用率(百分比)
  • memory_usage: 内存使用率(百分比)
  • disk_usage: 磁盘使用率(百分比)
  • network_in: 入站流量(字节/秒)
  • network_out: 出站流量(字节/秒)
  • load_average: 系统负载
  • uptime: 运行时间
  • timestamp: 数据采集时间
  • auth_token: 认证令牌

核心流程设计

整个监控系统采用模块化设计,由7个核心节点组成完整的数据处理链路。

1. 接收服务器监控数据

在n8n中创建Webhook节点作为数据接收入口,配置方式如下:

具体操作如下:

1-接受服务器数据

从配置界面可以看到,Webhook节点生成了测试URL和生产URL两个地址。测试URL示例:

https://your-n8n-domain.com/webhook-test/server-monitor

关键配置说明:

  • HTTP方法:POST
  • 路径:server-monitor(可自定义)
  • 认证方式:None(在后续节点中处理Token认证)
  • 响应模式:使用"Respond to Webhook"节点

这种设计将认证逻辑与数据接收分离,方便后续灵活控制认证策略。

2. 配置和验证Token

接收到数据后,需要对请求进行身份验证。使用JavaScript代码节点实现Token验证和配置初始化:

执行以下配置和验证逻辑:

2-配置和验证token

核心代码逻辑如下:

const CONFIG = {// 监控系统认证Token(使用openssl rand -hex 32生成)MONITOR_AUTH_TOKEN: 'YOUR_SECURE_TOKEN_HERE',// Telegram Chat ID(接收通知的Chat)TELEGRAM_CHAT_ID: 'YOUR_TELEGRAM_CHAT_ID',// 允许使用机器人的用户ID列表ALLOWED_USER_IDS: ['YOUR_TELEGRAM_USER_ID'],// 告警阈值配置THRESHOLDS: {cpu: 80,      // CPU使用率阈值(%)memory: 85,   // 内存使用率阈值(%)disk: 90      // 磁盘使用率阈值(%)}
};// 验证Token
const requestToken = $input.item.json.body.auth_token;
const authorized = requestToken === CONFIG.MONITOR_AUTH_TOKEN;// 返回验证结果和配置
return {authorized: authorized,body: $input.item.json.body,config: CONFIG
};

安全说明: 使用openssl rand -hex 32命令生成强随机Token,确保监控数据接口的安全性。在生产环境中,建议定期更换Token。

3. 认证分流处理

验证完成后,使用IF节点根据认证结果进行流程分流:

执行以下命令进行安装/配置:

3-认证判断

从节点配置可以看到,判断条件为:

{{$json.authorized}} === true
  • True分支:认证通过,继续处理监控数据
  • False分支:认证失败,返回错误响应

这种设计可以有效防止未授权的数据推送,保护监控系统安全。

4. 处理监控数据

认证通过后,对监控数据进行解析和告警判断:

执行以下命令进行安装/配置:

4-处理监控数据

核心处理逻辑包含以下几个步骤:

const data = $input.item.json.body;
const config = $input.item.json.config;
const thresholds = config.THRESHOLDS;// 解析监控数据
const serverName = data.server_name || 'Unknown';
const cpu = parseFloat(data.cpu_usage || 0);
const memory = parseFloat(data.memory_usage || 0);
const disk = parseFloat(data.disk_usage || 0);
const networkIn = parseFloat(data.network_in || 0);
const networkOut = parseFloat(data.network_out || 0);
const loadAvg = data.load_average || 'N/A';
const uptime = data.uptime || 'N/A';// 检查告警
let alerts = [];
let status = '正常';
let alertLevel = 'info';if (cpu > thresholds.cpu) {alerts.push(`CPU使用率过高: ${cpu.toFixed(2)}%`);alertLevel = 'warning';status = '警告';
}if (memory > thresholds.memory) {alerts.push(`内存使用率过高: ${memory.toFixed(2)}%`);alertLevel = 'warning';status = '警告';
}if (disk > thresholds.disk) {alerts.push(`磁盘使用率过高: ${disk.toFixed(2)}%`);alertLevel = 'critical';status = '严重';
}// 生成告警消息
const message = `
## 服务器监控报告## 服务器: ${serverName}
## 时间: ${new Date(data.timestamp).toLocaleString('zh-CN')}## 系统资源
————————————
CPU: ${cpu.toFixed(2)}%
内存: ${memory.toFixed(2)}%
磁盘: ${disk.toFixed(2)}%
负载: ${loadAvg}
运行: ${uptime}## 网络流量
————————————
入站: ${(networkIn / 1024).toFixed(2)} KB/s
出站: ${(networkOut / 1024).toFixed(2)} KB/s## 状态: ${status}${alerts.join('\n')}
`;return {message: message,hasAlert: alerts.length > 0,alertLevel: alertLevel,serverName: serverName,chatId: config.TELEGRAM_CHAT_ID,timestamp: new Date().toISOString(),metrics: {cpu: cpu,memory: memory,disk: disk,networkIn: networkIn,networkOut: networkOut,loadAvg: loadAvg,uptime: uptime}
};

这段代码实现了三个核心功能:数据解析、阈值检查和消息格式化。告警级别分为info(正常)、warning(警告)、critical(严重)三个等级。

5. 检查是否需要告警

处理完数据后,判断是否需要发送告警通知:

执行以下命令进行安装/配置:

5-检查是否预警

判断条件为:

{{$json.hasAlert}} === true

只有当存在告警时(CPU、内存或磁盘超过阈值)才会触发Telegram消息发送,避免频繁推送正常状态消息。

6. 发送告警到Telegram

当检测到告警时,通过Telegram Bot发送通知消息:

执行以下命令进行安装/配置:

6-发送到tg

从配置可以看到,Telegram节点的关键设置:

  • Resource: Message
  • Operation: Send Message
  • Chat ID: {{$json.chatId}}(从配置中读取)
  • Text: {{$json.message}}(格式化的监控消息)
  • Parse Mode: Markdown (Legacy)

使用Markdown格式可以让消息展示更清晰,支持加粗、标题等格式化效果。

7. 返回成功响应

无论是否发送告警,都需要给监控客户端返回响应:

执行以下命令进行安装/配置:

7-返回成功响应

使用"Respond to Webhook"节点返回HTTP 200状态码,告知客户端数据已成功接收。配置项:

  • Respond With: First Incoming Item
  • Response Code: 200

这样可以确保监控脚本能够正确判断数据是否提交成功。

测试验证

配置完成后,使用curl命令测试整个流程:

执行以下命令进行安装/配置:

8-curl测试

测试命令示例:

curl -X POST https://your-n8n-domain.com/webhook/server-monitor \
-H "Content-Type: application/json" \
-d '{"auth_token": "YOUR_SECURE_TOKEN_HERE","server_name": "test-server","cpu_usage": 85.5,"memory_usage": 70.3,"disk_usage": 50.9,"network_in": 1024000,"network_out": 512000,"load_average": "1.5","uptime": "5 days","timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
}'

从返回结果可以看到,n8n成功处理了请求并发送了Telegram消息,返回JSON包含了完整的消息发送结果。

告警效果展示

具体操作如下:

9-tg返回

Telegram Bot成功收到告警消息,显示内容包括:

  • 服务器名称和监控时间
  • 系统资源使用情况(CPU、内存、磁盘、负载、运行时间)
  • 网络流量数据(入站/出站)
  • 告警状态和具体告警项

消息格式清晰,关键信息一目了然。

完整工作流视图

执行以下命令进行安装/配置:

10-流程界面

从n8n编辑器界面可以看到完整的监控工作流,包含主流程和扩展功能:

主流程:

  1. 接收服务器数据
  2. 配置和验证Token
  3. 认证分流
  4. 处理监控数据
  5. 检查是否需要告警
  6. 发送告警到Telegram
  7. 返回成功响应

扩展功能:

  • 每日汇总(定时生成和发送监控摘要)
  • Telegram命令触发器(支持通过Telegram控制)

整个工作流采用可视化配置,所有节点通过连线表示数据流向,维护和调试都非常直观。

服务器端监控脚本

在被监控的服务器上,需要部署数据采集脚本,定期收集系统指标并推送到n8n:

#!/bin/bash# n8n Webhook地址
WEBHOOK_URL="https://your-n8n-domain.com/webhook/server-monitor"# 认证Token(与n8n中配置保持一致)
AUTH_TOKEN="YOUR_SECURE_TOKEN_HERE"# 服务器名称
SERVER_NAME=$(hostname)# 采集系统指标
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
MEMORY_USAGE=$(free | grep Mem | awk '{printf("%.2f", ($3/$2) * 100.0)}')
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
NETWORK_IN=$(cat /sys/class/net/eth0/statistics/rx_bytes)
NETWORK_OUT=$(cat /sys/class/net/eth0/statistics/tx_bytes)
LOAD_AVERAGE=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | xargs)
UPTIME=$(uptime -p | sed 's/up //')
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)# 发送数据到n8n
curl -X POST "$WEBHOOK_URL" \-H "Content-Type: application/json" \-d "{\"auth_token\": \"$AUTH_TOKEN\",\"server_name\": \"$SERVER_NAME\",\"cpu_usage\": $CPU_USAGE,\"memory_usage\": $MEMORY_USAGE,\"disk_usage\": $DISK_USAGE,\"network_in\": $NETWORK_IN,\"network_out\": $NETWORK_OUT,\"load_average\": \"$LOAD_AVERAGE\",\"uptime\": \"$UPTIME\",\"timestamp\": \"$TIMESTAMP\"}"

部署方式:

  1. 将脚本保存为/usr/local/bin/server-monitor.sh

  2. 添加执行权限:chmod +x /usr/local/bin/server-monitor.sh

  3. 配置crontab定时执行(每5分钟):

    */5 * * * * /usr/local/bin/server-monitor.sh >> /var/log/server-monitor.log 2>&1
    

常见问题

Q: 如何修改告警阈值?

A: 在"配置和验证Token"节点的JavaScript代码中修改THRESHOLDS对象,保存后即可生效,无需重启n8n。

Q: 如何支持多台服务器监控?

A: 在每台服务器上部署监控脚本,设置不同的SERVER_NAME,所有服务器向同一个Webhook地址推送数据。系统会根据server_name字段区分不同服务器。

Q: 如何避免告警消息过多?

A: 可以在"检查是否需要告警"节点前增加一个节点,记录上次告警时间,实现告警频率限制(如同一告警30分钟内只发送一次)。

Q: 如何查看历史监控数据?

A: n8n的"Executions"标签页会记录所有工作流执行历史,可以查看每次监控数据的详细内容。如需长期存储,可以添加数据库节点将数据写入MySQL或PostgreSQL。

总结

使用n8n搭建服务器监控系统的优势在于配置简单、可视化程度高、易于扩展。整个方案不需要部署复杂的监控组件,通过Webhook和工作流编排就能实现完整的监控告警功能。从实际使用效果来看,这套方案完全满足中小规模服务器监控需求,响应及时且维护成本低。后续可以根据业务需要,扩展更多功能,比如添加数据库存储、生成图表报表、集成钉钉或企业微信等其他通知渠道。

感谢

感谢你读到这里,说明你已经成功地忍受了我的文字考验!🎉
希望这篇文章没有让你想砸电脑,也没有让你打瞌睡。
如果有一点点收获,那我就心满意足了。

未来的路还长,愿你
遇见难题不慌张,遇见bug不抓狂,遇见好内容常回访
记得给自己多一点耐心,多一点幽默感,毕竟生活已经够严肃了。

如果你有想法、吐槽或者想一起讨论的,欢迎留言,咱们一起玩转技术,笑对人生!😄

祝你代码无bug,生活多彩,心情常青!🚀
在这里插入图片描述

http://www.dtcms.com/a/589664.html

相关文章:

  • 如何在Dev-C++中启用调试模式?
  • 高校两学一做网站建设装修公司网站建设设计作品
  • Linux复习:操作系统管理本质:“先描述,再组织”,贯穿软硬件的核心思想
  • 简历电商网站开发经验介绍互联网网站类型
  • C#项目 无法附加到进程。已附加了一个调试器。
  • K8s Overlay 网络:核心原理、主流方案与实践指南
  • 莆田市网站建设网站建设英文版
  • ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
  • 怎么自己做礼品网站一份电子商务网站建设规划书
  • InnoDB 与 MyISAM 的底层区别与选择策略
  • 【开发者导航】免费开源且可本地生成的 AI 绘画工具:Stable Diffusion
  • 深入浅出 RocksDB_键值存储引擎实战解析
  • 在线制作图网站wordpress 2万条就卡
  • 行为型设计模式3
  • 设计网站推荐大汕头网站建设推荐
  • 成都网站建设哪家好文章可以用腾讯企业邮箱域名做网站
  • 文登做网站网站图片等比缩小
  • 网站开发算前端吗seo优化百度技术排名教程
  • 64.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--预算报表
  • 永久免费白嫖多个域名,一键托管Cloudflare,免费申请SSL加密证书,轻松建站、搭建线路伪装
  • RT thread 的看门狗框架分析
  • 分销商城网站开发证书兼职的人才网站
  • 11.9 脚本网页 消消乐
  • Spring AI Alibaba 1.x 源码分析-架构设计
  • 有哪些做海岛的网站上海网站建设排名公司哪家好
  • 太原市建设局网站网站建设经验典型
  • AIGC(生成式AI)试用 40 -- 程序(Python + OCR)-2
  • 3.Python基础:函数
  • 中山市西区建设局网站wordpress 获取导航
  • RHCSA笔记1