$catMANUAL||~27 min

n8n 自托管部署与 AI 工作流实战:折腾两天,我终于搞明白了这个自动化神器

advertisement

n8n 自托管部署与 AI 工作流实战:折腾两天,我终于搞明白了这个自动化神器

建站两个月了,之前写过 Dify本地部署与使用全攻略:从零构建企业级AI工作流,当时觉得 Dify 挺好用的。但最近有朋友问我:"有没有那种可以拖拖拽拽就把各种 API 串起来的工具?"我第一反应就是 n8n。

说实话,n8n 这东西我早就听说过,但一直没认真搞过。上周末终于花了两天时间从零部署到做了一堆工作流,踩了不少坑,也确实被惊艳到了。这篇文章就记录一下整个过程,从部署到实际使用,把该踩的坑都给你趟一遍。

n8n 是什么?跟 Dify 有啥区别?

先说清楚 n8n 是干嘛的。一句话概括:n8n 是一个开源的工作流自动化平台,用拖拽的方式把各种服务、API、数据库串成自动化流程。

你可能会问,这不就是 Zapier 或者 Make 吗?对,概念上差不多,但 n8n 有几个关键区别:

  • 可以自托管:数据在你自己服务器上,不用担心隐私问题
  • Fair-code 许可:核心代码开源,可以免费用,企业版才收费
  • 原生 AI 能力:内置了 AI Agent 节点,可以直接调用大模型
  • 400+ 集成:从 GitHub、Slack 到数据库、HTTP 请求,啥都有
  • 可以写代码:复杂逻辑用 JavaScript/Python 节点搞定

跟 Dify 的区别呢?Dify 更侧重于 AI 应用的构建(聊天机器人、RAG、知识库),而 n8n 更侧重于通用自动化——它可以把 AI 当成工作流中的一个环节,但不是全部。两者可以搭配用,不冲突。

说白了,如果你的需求是"我有一堆 API 要串起来,中间偶尔调用一下大模型",n8n 更合适。如果你的需求是"我要做一个 AI 聊天应用",Dify 更合适。

自托管部署:Docker 一把梭

部署 n8n 最简单的方式就是 Docker。我试过两种方式:直接 docker rundocker-compose,推荐后者,方便管理。

方式一:docker run(快速试玩)

bash
1
docker run -it --rm \
2
  - -name n8n \
3
  - p 5678:5678 \
4
  - v n8n_data:/home/node/.n8n \
5
  docker.n8n.io/n8nio/n8n

跑起来之后访问 http://localhost:5678,注册个账号就能用了。但这种方式有几个问题:

  • 没有持久化(--rm 删了容器数据就没了,去掉 --rm 但还是不方便)
  • 没有 HTTPS
  • 没有 PostgreSQL(默认用 SQLite,生产环境不够用)

所以如果是认真用,还是上 docker-compose。

方式二:docker-compose(推荐)

创建一个 docker-compose.yml

yaml
1
version: '3.8'
2
 
3
services:
4
  n8n:
5
    image: docker.n8n.io/n8nio/n8n
6
    restart: always
7
    ports:
8
      - "5678:5678"
9
    environment:
10
      - N8N_HOST=your-domain.com
11
      - N8N_PORT=5678
12
      - N8N_PROTOCOL=https
13
      - NODE_ENV=production
14
      - WEBHOOK_URL=https://your-domain.com/
15
      - DB_TYPE=postgresdb
16
      - DB_POSTGRESDB_HOST=postgres
17
      - DB_POSTGRESDB_PORT=5432
18
      - DB_POSTGRESDB_DATABASE=n8n
19
      - DB_POSTGRESDB_USER=n8n
20
      - DB_POSTGRESDB_PASSWORD=your_secure_password
21
      - N8N_ENCRYPTION_KEY=your_random_encryption_key
22
    volumes:
23
      - n8n_data:/home/node/.n8n
24
    depends_on:
25
      postgres:
26
        condition: service_healthy
27
 
28
  postgres:
29
    image: postgres:15
30
    restart: always
31
    environment:
32
      POSTGRES_USER: n8n
33
      POSTGRES_PASSWORD: your_secure_password
34
      POSTGRES_DB: n8n
35
    volumes:
36
      - postgres_data:/var/lib/postgresql/data
37
    healthcheck:
38
      test: ["CMD-SHELL", "pg_isready -U n8n"]
39
      interval: 10s
40
      timeout: 5s
41
      retries: 5
42
 
43
volumes:
44
  n8n_data:
45
  postgres_data:

然后 docker-compose up -d,搞定。

这里有几个坑我得提醒你:

坑1:N8N_ENCRYPTION_KEY 必须设置

n8n 用这个 key 来加密你保存的凭据(API Key 什么的)。如果不设,每次重启容器,之前保存的凭据就解密不了了,工作流全废。生成一个随机字符串:

bash
1
openssl rand -hex 32

把这个值填到 N8N_ENCRYPTION_KEY 里。

坑2:WEBHOOK_URL 必须设置

如果你用了 Webhook 触发器(比如 GitHub webhook、Slack 事件回调),这个 URL 必须是外部能访问到的地址。不设的话,n8n 生成的 webhook URL 是 http://localhost:5678/...,外部服务根本调不到。

坑3:HTTPS 得自己搞

n8n 不自带 HTTPS,你得在前面放个 Nginx 反向代理或者 Caddy。我用的是 Nginx:

nginx
1
server {
2
    listen 443 ssl;
3
    server_name your-domain.com;
4
 
5
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
6
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
7
 
8
    location / {
9
        proxy_pass http://localhost:5678;
10
        proxy_set_header Host $host;
11
        proxy_set_header X-Real-IP $remote_addr;
12
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
13
        proxy_set_header X-Forwarded-Proto $scheme;
14
 
15
        # WebSocket 支持(n8n 需要)
16
        proxy_http_version 1.1;
17
        proxy_set_header Upgrade $http_upgrade;
18
        proxy_set_header Connection "upgrade";
19
    }
20
}

注意那个 WebSocket 的配置,不加的话 n8n 的前端会一直连不上,页面卡在 loading。

部署完验证一下

跑起来之后访问你的域名,应该能看到 n8n 的注册页面。注册完进到主界面,点左边的 "Credentials" 看看能不能正常添加凭据,再点 "Workflows" 创建一个简单的工作流测试一下。

我第一次部署的时候,注册页面死活打不开,看了半天日志发现是 PostgreSQL 没起来——healthcheck 配错了,pg_isready 命令写成了 pg_ready,少了个 is。低级错误,但排查了半小时。

第一个工作流:定时抓取 RSS 并用 AI 总结

光部署没用,得搞点实际的东西。我做的第一个完整工作流是:每天早上自动抓取几个技术博客的 RSS,用大模型生成摘要,然后发到我的邮箱。

这个工作流的节点链路是这样的:

  1. Schedule Trigger:每天早上 8 点触发
  2. RSS Feed Read:抓取多个 RSS 源
  3. Split In Items:把多篇文章拆成单条处理
  4. HTTP Request:调用 OpenAI API 生成摘要
  5. Gmail:把摘要发到邮箱

配置 Schedule Trigger

双击 Schedule Trigger 节点,设置触发规则。我设的是每天早上 8 点:

  • Trigger Interval: Days
  • Hour: 8
  • Minute: 0

配置 RSS Feed Read

添加一个 RSS Feed Read 节点,填入 RSS URL。比如我订阅了 Hacker News 的 RSS:

code
1
https://hnrss.org/frontpage?count=10

如果你想抓多个 RSS 源,可以加多个 RSS 节点,然后用 Merge 节点合并。

配置 OpenAI 调用

这里我踩了个大坑。n8n 有内置的 OpenAI 节点,但我发现用 HTTP Request 节点更灵活:

  • Method: POST
  • URL: https://api.openai.com/v1/chat/completions
  • Authentication: Predefined Credential → OpenAI API
  • Body (JSON):
json
1
{
2
  "model": "gpt-4o-mini",
3
  "messages": [
4
    {
5
      "role": "system",
6
      "content": "你是一个技术文章摘要助手,请用中文简要总结以下文章的核心内容,控制在3句话以内。"
7
    },
8
    {
9
      "role": "user",
10
      "content": "标题:{{ $json.title }}\n内容:{{ $json.content }}"
11
    }
12
  ],
13
  "max_tokens": 300
14
}

那个 {{ $json.title }} 是 n8n 的表达式语法,会自动取上一个节点输出的 JSON 字段。

坑4:n8n 的表达式编辑器有时候抽风

你在 UI 里点 "Expression" 模式然后拖字段过来,有时候拖过来的路径不对。建议先在前面的节点跑一次,看看输出的 JSON 结构,然后手动写表达式。

坑5:大模型节点超时

如果你用的是自部署的大模型(比如本地的 Ollama,还没部署的话可以参考这篇 零基础上手:Llama 3 与 Qwen 等主流大模型本地一键部署实战指南),响应可能很慢。n8n 默认的 HTTP Request 超时是 300 秒,但如果你的模型特别慢,可以在节点设置里调大。我有一次跑 Llama 3 70B 的时候,一个请求跑了快 5 分钟,直接超时了。后来换成了 GPT-4o-mini,速度快多了。

配置 Gmail 发送

最后加一个 Gmail 节点,配置 OAuth2 凭据(这个有点麻烦,需要去 Google Cloud Console 创建 OAuth 应用),然后设置收件人和邮件内容。

邮件内容可以用 HTML 模板:

html
1
<h2>📰 今日技术摘要</h2>
2
{{ $json.choices[0].message.content }}
3
<p style="color: #999; font-size: 12px;">由 n8n + OpenAI 自动生成</p>

调试技巧

n8n 有个特别好用的功能:Pin Data。你可以在任何节点上右键,把它的输出数据 "pin" 住,这样下次运行的时候这个节点就直接用 pinned 的数据,不用真的去调 API。调试的时候特别方便,省得每次都真的去请求 OpenAI 花钱。

还有就是 Execute Node 功能——你可以只执行单个节点,不用跑整个工作流。先跑前面的节点拿到数据,pin 住,然后单独调试后面的节点。

进阶玩法:构建 AI Agent 工作流

n8n 从 1.x 版本开始内置了 AI Agent 节点,这个才是真正的杀手功能。你可以构建一个完整的 AI Agent,它能使用工具、访问数据库、调用 API,就像一个自动化的"数字员工"(如果你对智能体的构建感兴趣,也可以看看这篇 Hermes Agent 全面指南:从入门到精通的开源 AI 智能体)。

构建一个能查数据库的 AI Agent

我做了一个工作流,让 AI Agent 可以查询我的 PostgreSQL 数据库,回答关于业务数据的问题。

节点链路:

  1. Chat Trigger:用户发消息触发
  2. AI Agent:核心 Agent 节点
  3. OpenAI Chat Model:大模型(给 Agent 用的)
  4. Postgres Tool:Agent 可以使用的工具

配置 AI Agent 节点:

  • Agent Type: Tools Agent
  • System Message:
code
1
你是一个数据分析助手。你可以查询数据库来回答用户的问题。
2
查询数据库时,请先查看有哪些表,然后写 SQL 查询。
3
回答时请用简洁的中文,并给出关键数据。

然后连接 Postgres Tool 节点作为 Agent 的工具。Agent 会自动决定什么时候需要查数据库、写什么 SQL。

这个真的有点惊艳到我了。 我问它"上个月新增了多少用户?",它自己写了个 SELECT COUNT(*) FROM users WHERE created_at >= ... 的查询,然后把结果整理成人话回复给我。

坑6:Agent 节点的 token 消耗很大

因为 Agent 可能会多轮调用大模型(思考 → 决定用工具 → 看结果 → 再思考),token 消耗比普通调用多很多。我一个复杂查询花了大概 3000-5000 tokens。如果用 GPT-4o,一次查询就几毛钱。建议用便宜的模型(GPT-4o-mini、Claude Haiku)做 Agent,复杂的推理任务再切贵的模型。

坑7:Agent 可能写出危险的 SQL

Agent 写 SQL 的时候可能会写出 DELETEDROP 语句(虽然概率很低)。建议给数据库用户设置只读权限,或者在 Postgres Tool 的配置里限制只能执行 SELECT。

构建一个多工具 Agent

更酷的是,你可以给 Agent 连接多个工具:

  • HTTP Request Tool:让 Agent 调用任意 API
  • Calculator Tool:让 Agent 能做数学计算
  • Code Tool:让 Agent 能执行代码
  • Vector Store Tool:让 Agent 能搜索知识库

我做了一个"全能助手"工作流,连了搜索引擎 API、天气 API、和一个本地知识库。问它"今天北京天气怎么样?帮我查一下明天的会议安排",它会分步调用天气 API 和查知识库,然后把结果汇总给我。

这种多工具 Agent 的配置关键是 System Message 要写好。你得告诉 Agent:

  • 你是谁,你的职责是什么
  • 你有哪些工具,每个工具什么时候用
  • 回复的格式要求
  • 什么情况下不要用工具(避免不必要的 API 调用)

System Message 写得好不好,直接决定了 Agent 的表现。我前几次试的时候 Agent 经常乱用工具,后来在 System Message 里加了 "只有当用户明确要求查询外部信息时才使用搜索引擎工具",就好多了。

n8n vs Dify:到底选哪个?

之前写过 Dify 的教程,现在又写了 n8n,肯定有人会问:这俩到底选哪个?

我的看法是:看你的需求。

选 n8n 的场景:

  • 你需要连接各种外部服务(API、数据库、SaaS 工具)
  • 你的核心需求是自动化,AI 只是其中一个环节
  • 你需要复杂的条件分支、循环、错误处理
  • 你是开发者,喜欢灵活控制每个细节
  • 你需要定时任务、Webhook 触发等非对话式场景

选 Dify 的场景:

  • 你要做一个 AI 聊天应用(客服、助手)
  • 你需要 RAG(知识库问答)
  • 你不太想写代码,想纯可视化搭建
  • 你的用户是普通用户,需要一个聊天界面
  • 你更关注 prompt 工程和模型调优

两者搭配用:

其实最理想的状态是两者搭配。比如用 n8n 做数据采集和预处理,把结果推给 Dify 做 AI 应用。或者用 Dify 的 API 作为 n8n 工作流中的一个节点。

我目前的用法是:n8n 负责各种自动化(RSS 抓取、CI/CD 通知、数据同步),Dify 负责 AI 聊天应用。各司其职,挺好。

高级配置与优化

环境变量配置

n8n 有很多环境变量可以调,这里列几个常用的:

bash
1
# 执行超时(秒),默认 300
2
EXECUTIONS_TIMEOUT=600
3
 
4
# 最大执行超时
5
EXECUTIONS_TIMEOUT_MAX=3600
6
 
7
# 保留多少天的执行记录
8
EXECUTIONS_DATA_PRUNE=true
9
EXECUTIONS_DATA_MAX_AGE=30
10
 
11
# 并发执行数
12
EXECUTIONS_PROCESS=main
13
EXECUTIONS_MODE=regular
14
 
15
# 前端 URL(用于生成正确的链接)
16
N8N_EDITOR_BASE_URL=https://your-domain.com
17
 
18
# 允许社区节点(第三方插件)
19
N8N_COMMUNITY_PACKAGES_ENABLED=true

社区节点

n8n 有个社区节点(Community Nodes)功能,可以安装第三方开发的节点。在 Settings → Community Nodes 里搜索安装。

我装了几个比较有用的:

  • n8n-nodes-pdf:解析 PDF 文件
  • n8n-nodes-telegram:Telegram Bot 集成(比内置的更强)
  • n8n-nodes-wechat:微信相关节点

安装社区节点的方式:

bash
1
# 在 n8n 容器里执行
2
docker exec -it n8n n8n community-node install n8n-nodes-pdf

或者直接在 n8n 的 UI 里安装,更方便。

性能优化

如果你的工作流很多、执行很频繁,需要注意性能:

1. 数据库用 PostgreSQL

前面说了,别用 SQLite。PostgreSQL 在并发场景下表现好得多。我一开始用 SQLite 跑了几天,发现执行记录查询越来越慢,换了 PostgreSQL 之后就好了。

2. 定期清理执行记录

n8n 会保存每次执行的完整数据,时间长了数据库会很大。建议设置 EXECUTIONS_DATA_PRUNE=trueEXECUTIONS_DATA_MAX_AGE=30,自动清理 30 天前的记录。

3. 用 Sub-Workflow 拆分复杂逻辑

如果一个工作流太复杂(几十个节点),执行会很慢。可以把它拆成多个 Sub-Workflow,主工作流用 "Execute Workflow" 节点调用子工作流。这样每个子工作流可以独立调试,也更容易维护。

4. 限制并发

如果你同时触发了太多工作流,服务器可能扛不住。可以在环境变量里设置最大并发数,或者在工作流设置里限制同时执行数。

常见问题 FAQ

Q: n8n 免费吗?

核心功能免费,可以自托管。企业功能(LDAP、SSO、多环境)需要付费。对于个人和小团队来说,免费版完全够用。

Q: n8n 支持哪些大模型?

通过内置节点支持:OpenAI、Anthropic、Google Gemini、Azure OpenAI、Ollama。通过 HTTP Request 节点可以调用任何兼容 OpenAI 格式的 API(比如 vLLM、LiteLLM)。

Q: 工作流数据安全吗?

自托管的话,数据全在你自己的服务器上。n8n 的 Fair-code 许可允许商业使用,但不允许作为 SaaS 服务转售。如果你处理敏感数据,建议:

  • 设置 N8N_ENCRYPTION_KEY(加密凭据)
  • 用 HTTPS
  • 数据库设强密码
  • 定期备份

Q: 可以用 n8n 做 CI/CD 吗?

可以,但不推荐。n8n 更适合"当 X 发生时做 Y"这种事件驱动的自动化。CI/CD 还是用 GitHub Actions、GitLab CI 这些专用工具更合适。不过你可以用 n8n 来增强 CI/CD,比如当 CI 失败时自动发通知到 Slack。

Q: 手机上能用吗?

n8n 的 Web 界面在手机上体验不太好,毕竟主要是给桌面端设计的。但你可以在手机上查看执行记录、启停工作流。如果需要手机端操作,可以考虑用 n8n 的 API 搭建一个简单的移动端界面。

Q: 社区活跃吗?

相当活跃。n8n 的 GitHub 有 60K+ stars,社区论坛也有很多高质量的讨论。遇到问题基本都能搜到解决方案。官方的文档也写得不错,比我见过的很多开源项目都详细。

我的使用心得

用了两周 n8n 之后,总结几点感受:

好的方面:

  • 拖拽式界面确实方便,复杂的工作流也能直观地看到数据流向
  • AI Agent 功能很惊艳,能做的事情比想象的多
  • 社区生态好,遇到问题基本都有人踩过坑
  • 自托管意味着数据在自己手里,这点很重要

不好的方面:

  • 学习曲线比想象的陡,很多概念(Credential、Expression、Pin Data)需要时间理解
  • 有些节点的文档不够详细,得自己试
  • 大型工作流的调试还是有点痛苦
  • 移动端体验差

总体来说,n8n 值得一试。 如果你有一些重复性的工作想自动化,或者想给自己的应用加上自动化能力,n8n 是个很好的选择。它不像 Dify 那样专注于 AI,但胜在通用性强——基本上只要是有 API 的东西,都能串起来。

后面我打算再折腾一下 n8n 的 Webhook 集成,搞一个 GitHub PR 自动审查的工作流。到时候再写一篇记录。有啥问题评论区聊。

参考链接

  • n8n 官网:https://n8n.io
  • n8n GitHub:https://github.com/n8n-io/n8n
  • n8n 文档:https://docs.n8n.io
  • n8n 社区论坛:https://community.n8n.io
  • Docker 部署文档:https://docs.n8n.io/hosting/installation/docker/

advertisement

n8n 自托管部署与 AI 工作流实战:折腾两天,我终于搞明白了这个自动化神器 — AI Hub