搜 索

n8n从入门到放弃:一个开发者的自动化摸鱼指南

  • 35阅读
  • 2026年01月14日
  • 0评论
首页 / 编程 / 正文

为什么我需要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封。人工筛选太浪费时间。

解决方案

flowchart LR A[📧 IMAP 每5分钟检查] --> B[🔀 Filter 过滤垃圾邮件] B --> C[🤖 Claude API 分析重要性+摘要] C --> D{重要程度?} D -->|🔴 紧急| E[📱 Slack私信 立即通知] D -->|🟡 重要| F[📝 汇总列表 稍后处理] D -->|🟢 普通| G[📁 归档 不打扰]

核心配置

1. IMAP节点 - 收取邮件

协议: IMAP
服务器: imap.gmail.com (或你的邮箱)
端口: 993
检查间隔: 5分钟
只获取未读邮件: true

2. 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次。

解决方案

flowchart TB subgraph 告警来源 A1[Grafana Webhook] A2[Sentry Webhook] A3[CloudWatch SNS] A4[自定义脚本] end subgraph n8n处理 B[Webhook接收] --> C[格式标准化] C --> D[去重 相同告警5分钟内只报一次] D --> E[🤖 AI分析 判断严重性+关联性] E --> F{是否需要通知?} end subgraph 通知方式 F -->|是| G[Slack/钉钉 带上下文] F -->|否| H[静默记录 供查询] end A1 --> B A2 --> B A3 --> B A4 --> B

去重逻辑(关键!)

// 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合并了 → 通知

我只想知道:需要我做什么?

解决方案

flowchart LR A[GitHub Webhook] --> B{事件类型} B -->|PR Review 请求| C[🔴 立即通知] B -->|CI 失败| D[🔴 立即通知] B -->|PR 被合并| E[🟢 汇总通知] B -->|评论/点赞| F[📁 静默归档] C --> G[Slack @你] D --> G E --> H[每日汇总]

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辅助日报生成

作为开发者,最烦的事情之一就是写日报/周报。

工作流

flowchart LR A[⏰ 每天下午5:30] --> B[📊 收集数据] B --> C[Git Commits] B --> D[Jira 完成的任务] B --> E[Slack 重要讨论] C --> F[🤖 Claude 生成日报] D --> F E --> F F --> G[📝 发送到你的邮箱 或者Notion]

数据收集

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上@我或者给我发邮件时,我希望能第一时间知道,而不是淹没在其他消息里。

实现

flowchart LR A[Slack Event] --> B{发送者是老板?} B -->|是| C[🔴 高优先级通知 手机推送+声音] B -->|否| D[正常流程]
// 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工作流全景图

这是我目前在用的所有自动化:

flowchart TB subgraph 输入源 E1[📧 Email] E2[💬 Slack] E3[🐙 GitHub] E4[🚨 告警系统] E5[📋 Jira] end subgraph n8n处理中心 N1[邮件分类+摘要] N2[消息过滤+聚合] N3[PR/CI状态追踪] N4[告警去重+分析] N5[任务状态同步] end subgraph AI能力 AI[🤖 Claude API] end subgraph 输出 O1[📱 重要通知 Slack/手机] O2[📊 每日摘要] O3[📁 自动归档] end E1 --> N1 E2 --> N2 E3 --> N3 E4 --> N4 E5 --> N5 N1 <--> AI N2 <--> AI N4 <--> AI N1 --> O1 N1 --> O2 N2 --> O1 N3 --> O1 N4 --> O1 N4 --> O2 N5 --> O3

实用技巧:与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收费的,几个省钱技巧:

  1. 先过滤再调用AI:不是所有数据都需要AI处理
  2. 限制输入长度:邮件正文截取前2000字符就够了
  3. 缓存结果:相同输入不要重复调用
  4. 用小模型处理简单任务:分类任务用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_TIMEZONETZ

坑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篇。如果这篇对你有帮助,说明你还没放弃;如果没帮助,说明你可能需要的是放弃。

评论区
暂无评论
avatar