
本文介绍如何使用n8n工作流自动化工具搭建一个完整的服务器监控系统,实现从数据采集、告警判断到Telegram消息推送的全流程自动化,整个方案无需编写复杂代码,配置完成后可实现7x24小时实时监控。
传统的服务器监控方案通常需要部署专门服务武器监控系统(如Prometheus、Zabbix),配置复杂且资源消耗较大。对于中小规模服务器监控需求,使用n8n可以快速搭建一套轻量级的监控告警系统,通过可视化的工作流编排实现数据采集、处理和告警。
适用场景:
基础环境:
配置信息获取:
your-n8n-domain.com为你的n8n实际部署域名openssl rand -hex 32命令生成强随机字符串https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates 获取from.id字段监控数据格式:
系统通过Webhook接收JSON格式的监控数据,包含以下字段:
server_name: 服务器名称cpu_usage: CPU使用率(百分比)memory_usage: 内存使用率(百分比)disk_usage: 磁盘使用率(百分比)network_in: 入站流量(字节/秒)network_out: 出站流量(字节/秒)load_average: 系统负载uptime: 运行时间timestamp: 数据采集时间auth_token: 认证令牌整个监控系统采用模块化设计,由7个核心节点组成完整的数据处理链路。
在n8n中创建Webhook节点作为数据接收入口,配置方式如下:
具体操作如下:

从配置界面可以看到,Webhook节点生成了测试URL和生产URL两个地址。测试URL示例:
https://your-n8n-domain.com/webhook-test/server-monitor关键配置说明:
server-monitor(可自定义)这种设计将认证逻辑与数据接收分离,方便后续灵活控制认证策略。
接收到数据后,需要对请求进行身份验证。使用JavaScript代码节点实现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。
验证完成后,使用IF节点根据认证结果进行流程分流:
执行以下命令进行安装/配置:

从节点配置可以看到,判断条件为:
{{$json.authorized}} === true这种设计可以有效防止未授权的数据推送,保护监控系统安全。
认证通过后,对监控数据进行解析和告警判断:
执行以下命令进行安装/配置:

核心处理逻辑包含以下几个步骤:
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(严重)三个等级。
处理完数据后,判断是否需要发送告警通知:
执行以下命令进行安装/配置:

判断条件为:
{{$json.hasAlert}} === true只有当存在告警时(CPU、内存或磁盘超过阈值)才会触发Telegram消息发送,避免频繁推送正常状态消息。
当检测到告警时,通过Telegram Bot发送通知消息:
执行以下命令进行安装/配置:

从配置可以看到,Telegram节点的关键设置:
{{$json.chatId}}(从配置中读取){{$json.message}}(格式化的监控消息)使用Markdown格式可以让消息展示更清晰,支持加粗、标题等格式化效果。
无论是否发送告警,都需要给监控客户端返回响应:
执行以下命令进行安装/配置:

使用"Respond to Webhook"节点返回HTTP 200状态码,告知客户端数据已成功接收。配置项:
这样可以确保监控脚本能够正确判断数据是否提交成功。
配置完成后,使用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包含了完整的消息发送结果。
具体操作如下:

Telegram Bot成功收到告警消息,显示内容包括:
消息格式清晰,关键信息一目了然。
执行以下命令进行安装/配置:

从n8n编辑器界面可以看到完整的监控工作流,包含主流程和扩展功能:
主流程:
扩展功能:
整个工作流采用可视化配置,所有节点通过连线表示数据流向,维护和调试都非常直观。
在被监控的服务器上,需要部署数据采集脚本,定期收集系统指标并推送到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\"
}"部署方式:
/usr/local/bin/server-monitor.shchmod +x /usr/local/bin/server-monitor.sh */5 * * * * /usr/local/bin/server-monitor.sh >> /var/log/server-monitor.log 2>&1Q: 如何修改告警阈值?
A: 在"配置和验证Token"节点的JavaScript代码中修改THRESHOLDS对象,保存后即可生效,无需重启n8n。
Q: 如何支持多台服务器监控?
A: 在每台服务器上部署监控脚本,设置不同的SERVER_NAME,所有服务器向同一个Webhook地址推送数据。系统会根据server_name字段区分不同服务器。
Q: 如何避免告警消息过多?
A: 可以在"检查是否需要告警"节点前增加一个节点,记录上次告警时间,实现告警频率限制(如同一告警30分钟内只发送一次)。
Q: 如何查看历史监控数据?
A: n8n的"Executions"标签页会记录所有工作流执行历史,可以查看每次监控数据的详细内容。如需长期存储,可以添加数据库节点将数据写入MySQL或PostgreSQL。
使用n8n搭建服务器监控系统的优势在于配置简单、可视化程度高、易于扩展。整个方案不需要部署复杂的监控组件,通过Webhook和工作流编排就能实现完整的监控告警功能。从实际使用效果来看,这套方案完全满足中小规模服务器监控需求,响应及时且维护成本低。后续可以根据业务需要,扩展更多功能,比如添加数据库存储、生成图表报表、集成钉钉或企业微信等其他通知渠道。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。