为什么我需要n8n?
先说结论:我受够了。
受够了每天早上打开电脑,面对:
- 147封未读邮件,其中143封是垃圾
- 5个不同平台的告警通知,3个是同一个问题
- Slack里@我的消息,一半是"在吗"
- Jira上又多了几个莫名其妙的ticket
作为一个支付系统的开发者,我的日常是这样的:
08:30 打开电脑,看邮件
09:00 还在看邮件,试图找到那封重要的
09:30 终于找到了,但已经过期了
10:00 开始处理告警,发现是同一个问题触发了5个告警
10:30 写代码?不存在的,先开个会
...
18:00 今天又没写几行代码直到我发现了n8n——一个可以自己部署、免费使用、随便折腾的自动化工具。
现在我的早晨是这样的:
08:30 打开电脑,看n8n帮我整理好的"今日重要邮件摘要"
08:35 瞄一眼"告警聚合报告",确认没有P0
08:40 开始写代码下面是我的实战配置,拿走不谢。
第一步:本地部署(5分钟搞定)
别跟我扯什么云服务,我就要自己掌控数据。
最简单的部署方式
创建一个 docker-compose.yml:
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=localhost
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- WEBHOOK_URL=http://localhost:5678/
- GENERIC_TIMEZONE=Asia/Dubai
- TZ=Asia/Dubai
# 执行历史保留7天
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:然后:
docker-compose up -d打开 http://localhost:5678,完事。
如果你需要外网访问(接收Webhook)
用Cloudflare Tunnel,免费又安全:
# 安装cloudflared
brew install cloudflared # Mac
# 或者 apt install cloudflared # Linux
# 登录并创建隧道
cloudflared tunnel login
cloudflared tunnel create n8n
cloudflared tunnel route dns n8n n8n.yourdomain.com
# 运行隧道
cloudflared tunnel run --url http://localhost:5678 n8n这样你就有了一个 https://n8n.yourdomain.com 的公网地址,可以接收GitHub Webhook、邮件通知等。
场景一:邮件自动分类+AI摘要
这是我最得意的工作流。
问题
每天100+封邮件,真正重要的可能就5封。人工筛选太浪费时间。
解决方案
核心配置
1. IMAP节点 - 收取邮件
协议: IMAP
服务器: imap.gmail.com (或你的邮箱)
端口: 993
检查间隔: 5分钟
只获取未读邮件: true2. AI分析节点 - 用Claude判断重要性
这里是关键,我用Claude API来分析邮件:
// HTTP Request节点,调用Claude API
// Method: POST
// URL: https://api.anthropic.com/v1/messages
// Headers:
{
"x-api-key": "{{$credentials.claudeApi.apiKey}}",
"anthropic-version": "2023-06-01",
"content-type": "application/json"
}
// Body:
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 500,
"messages": [
{
"role": "user",
"content": "分析这封邮件的重要性。返回JSON格式:{\"level\": \"urgent/important/normal\", \"summary\": \"一句话摘要\", \"action\": \"需要的操作\"}\n\n发件人: {{$json.from}}\n主题: {{$json.subject}}\n内容: {{$json.text.substring(0, 2000)}}"
}
]
}3. 分流处理
根据AI返回的level字段,用Switch节点分流:
urgent→ 立即Slack通知important→ 加入今日待办normal→ 静默归档
实际效果
以前:每天花1小时处理邮件
现在:每天花5分钟看AI整理好的摘要
省下的时间用来写bug...不对,是修bug。
场景二:多平台告警聚合
问题
我的系统告警来自:
- Grafana(监控指标)
- Sentry(错误追踪)
- AWS CloudWatch(云服务)
- 自建的健康检查脚本
每个平台都在喊,同一个问题可能触发5条告警。我的手机一天响200次。
解决方案
去重逻辑(关键!)
// Code节点:告警去重
const alertKey = `${$json.source}_${$json.alertName}_${$json.host}`;
const cacheKey = `alert_${alertKey}`;
// 检查5分钟内是否已经发过
const lastAlert = await this.helpers.cache.get(cacheKey);
const now = Date.now();
if (lastAlert && (now - lastAlert) < 5 * 60 * 1000) {
// 5分钟内已发过,跳过
return [];
}
// 记录本次告警时间
await this.helpers.cache.set(cacheKey, now, 10 * 60 * 1000);
return [{
json: {
...$json,
dedupKey: alertKey,
isNew: true
}
}];AI告警分析
让AI帮你判断告警的真实严重性:
// 发送给Claude的prompt
const prompt = `你是一个DevOps专家。分析这个告警:
告警名称: ${$json.alertName}
来源: ${$json.source}
主机: ${$json.host}
描述: ${$json.description}
指标值: ${$json.value}
请返回JSON:
{
"severity": "P0/P1/P2/P3",
"needsImmediate": true/false,
"possibleCause": "可能原因",
"suggestedAction": "建议操作"
}`;告警消息模板
🚨 **{{$json.severity}} 告警**
**来源**: {{$json.source}}
**主机**: {{$json.host}}
**告警**: {{$json.alertName}}
**AI分析**:
- 可能原因: {{$json.possibleCause}}
- 建议操作: {{$json.suggestedAction}}
{{$json.needsImmediate ? '⚠️ 需要立即处理!' : '📋 可稍后处理'}}场景三:GitHub + CI/CD 通知优化
问题
GitHub通知太多了:
- 有人给你的PR点了个赞 → 通知
- CI跑过了 → 通知
- 有人在PR里回复了"ok" → 通知
- 有人把你的PR合并了 → 通知
我只想知道:需要我做什么?
解决方案
GitHub Webhook过滤逻辑
// 只关心这些事件
const importantEvents = {
'pull_request_review': (data) =>
data.action === 'submitted' &&
data.review.state === 'changes_requested',
'pull_request': (data) =>
data.action === 'review_requested' &&
data.requested_reviewer?.login === 'YOUR_USERNAME',
'check_suite': (data) =>
data.action === 'completed' &&
data.check_suite.conclusion === 'failure',
'issue_comment': (data) =>
data.comment.body.includes('@YOUR_USERNAME')
};
const eventType = $json.headers['x-github-event'];
const shouldNotify = importantEvents[eventType]?.($json.body);
if (!shouldNotify) {
return []; // 不重要的事件,直接丢弃
}
return [{ json: $json.body }];场景四:AI辅助日报生成
作为开发者,最烦的事情之一就是写日报/周报。
工作流
数据收集
Git Commits(今天的):
// 调用GitHub API获取今天的commits
const today = new Date().toISOString().split('T')[0];
const url = `https://api.github.com/repos/${owner}/${repo}/commits?author=${username}&since=${today}T00:00:00Z`;Jira完成的任务:
// Jira JQL查询
const jql = `assignee = currentUser() AND status changed to "Done" after startOfDay()`;AI生成日报
const prompt = `根据以下信息,帮我生成一份简洁的工作日报:
今日Git提交:
${commits.map(c => `- ${c.message}`).join('\n')}
完成的Jira任务:
${jiraTasks.map(t => `- [${t.key}] ${t.summary}`).join('\n')}
要求:
1. 用第一人称
2. 突出完成的成果
3. 提及遇到的问题(如果commit message里有fix/bug相关)
4. 不要废话,控制在200字以内`;输出示例
📝 2024-01-15 工作日报
今日完成:
• 完成了用户认证模块的重构,将登录响应时间从800ms优化到200ms
• 修复了支付回调偶发超时的问题(PAY-1234)
• Review了小王的缓存优化PR,已合并
进行中:
• IBAN迁移方案设计,预计明天完成文档
明日计划:
• 继续IBAN迁移开发
• 参加架构评审会议场景五:我的"老板探测器"
好吧这个有点皮,但确实有用。
需求
当老板在Slack上@我或者给我发邮件时,我希望能第一时间知道,而不是淹没在其他消息里。
实现
// Slack事件过滤
const bossIds = ['U1234567', 'U7654321']; // 老板们的Slack ID
const isBossMessage = bossIds.includes($json.event.user);
if (isBossMessage) {
return [{
json: {
priority: 'CRITICAL',
message: $json.event.text,
channel: $json.event.channel,
alertTitle: '⚠️ 老板找你!'
}
}];
}
return [];然后用Pushover或者Bark发送手机推送,确保你不会错过。
我的n8n工作流全景图
这是我目前在用的所有自动化:
实用技巧:与AI工具的最佳组合
Claude API调用模板
我封装了一个可复用的HTTP Request配置:
// 保存为"Claude分析"模板,随时复用
// URL: https://api.anthropic.com/v1/messages
// Method: POST
// Headers
{
"x-api-key": "{{$credentials.claudeApi.apiKey}}",
"anthropic-version": "2023-06-01",
"content-type": "application/json"
}
// Body模板
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"system": "你是一个专业的{{角色}}。请用简洁的JSON格式回复。",
"messages": [
{
"role": "user",
"content": "{{你的prompt}}"
}
]
}成本控制技巧
AI API是按token收费的,几个省钱技巧:
- 先过滤再调用AI:不是所有数据都需要AI处理
- 限制输入长度:邮件正文截取前2000字符就够了
- 缓存结果:相同输入不要重复调用
- 用小模型处理简单任务:分类任务用Haiku就够了
// 成本优化示例:根据任务复杂度选择模型
const model = taskComplexity === 'simple'
? 'claude-haiku-4-5-20251001' // 便宜
: 'claude-sonnet-4-20250514'; // 贵但强踩坑备忘录
坑1:Webhook收不到请求
症状:GitHub/Slack的Webhook死活收不到
原因:你的n8n在内网,外面访问不到
解决:用Cloudflare Tunnel(前面讲了)或者ngrok
坑2:定时任务不准
症状:设置了每天9点执行,结果凌晨1点执行
原因:时区没设对
解决:确保设置了 GENERIC_TIMEZONE 和 TZ
坑3:工作流莫名其妙停了
症状:工作流显示Active,但就是不执行
原因:容器重启后Webhook地址变了
解决:用固定的 WEBHOOK_URL 环境变量
坑4:AI返回格式不稳定
症状:让AI返回JSON,有时候带`json标记,有时候不带
解决:在prompt里强调,然后后处理时清理
// 清理AI返回的JSON
let response = $json.content[0].text;
response = response.replace(/```json\n?/g, '').replace(/```\n?/g, '');
return JSON.parse(response);总结:值不值得折腾?
投入时间:大概一个周末搭建+调试
收益:
- 每天节省1-2小时处理邮件/告警的时间
- 不再错过重要消息
- 不再被垃圾消息打扰
- 周报/日报自动生成
最大的收获:心智负担减轻了。
以前我需要时刻惦记着:邮件看了吗?告警处理了吗?PR review了吗?
现在我知道:真正重要的事情,n8n会通知我。没通知的,就是不重要的。
这种确定感,比节省的时间更有价值。
最后的最后
有人可能会说:你花这么多时间搞自动化,还不如直接处理那些邮件呢。
我的回答是:
程序员花3小时写脚本来自动化一个10分钟的任务,不是因为效率,是因为那10分钟太TM无聊了。
好了,我要去看看n8n帮我整理的今日摘要了。如果没什么重要的,就继续摸鱼...不对,是继续学习。
祝各位自动化愉快!🎉
本文属于「从入门到放弃」系列第N篇。如果这篇对你有帮助,说明你还没放弃;如果没帮助,说明你可能需要的是放弃。