1. 先搞清楚n8n到底是什么,以及它解决什么问题
先说结论:n8n是一个可自托管的、基于节点(node)的工作流自动化平台,你可以把它理解成“把自己日常那些重复、机械、跨系统的操作,全部编排成一条自动运行的流水线”。
很多人第一次看到“自动化连接平台”这几个字,第一反应是“这不就是另一个Zapier或者Make吗”。确实,它们做的事情高度相似——把A应用的触发事件,接到B应用的动作上,中间再插入一些逻辑判断、数据处理、人工审批之类的环节。但n8n的核心差异有两点:
一是开源且可自部署。这意味着数据不用经过第三方云平台,你可以把整个工作流引擎跑在自己服务器、NAS甚至一台普通PC上。对于有数据合规要求、或者想把自动化能力和现有业务系统深度打通的团队来说,这是Zapier这类纯SaaS产品给不了的。
二是本地优先(local-first)的执行模型。n8n的工作流跑在你自己控制的基础设施上,触发方式可以是Webhook、定时任务,也可以是手动执行。它不是“把数据上传到别人的平台再执行”,而是“在本地环境里执行逻辑,只对需要交互的外部API做请求”。这个本质区别,决定了它在企业内部的接受度远高于很多云端自动化工具。
我从什么时候开始认真用n8n的?最早是想做一个“监控某个网页内容变化,变化后自动通知我”的小工具。用Zapier当然也能做,但免费额度几分钟就烧完了,而n8n部署在自己机器上,跑多少个workflow只要你机器扛得住就行。后来越用越深,发现它真正厉害的地方不是单个节点,而是节点与节点之间那根连线——你可以把任意两个系统用一根线连起来,线中间想怎么处理数据都行。
这篇文章我不打算写成一个n8n的完整文档,那不现实也没必要。重点放在三块:核心概念拆解、用Docker快速部署的完整过程、以及几个我实际踩坑后的经验总结。如果你正准备把n8n引入自己的工作流或者团队,这篇文章能帮你少走很多弯路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前的核心概念:理解n8n的构建块
在敲任何一条docker命令之前,先把n8n的几个核心概念搞清楚。这些概念不搞明白,后面配工作流的时候会非常痛苦。
2.1 节点(Node)与工作流(Workflow)
n8n里所有操作都围绕“节点”展开。一个节点代表“做一件事情”,比如发送HTTP请求、读取数据库、解析JSON、发送邮件、调用AI模型,这些都是节点。节点之间用连线(connection)串起来,形成一个从左到右的执行流,这就是工作流。
我习惯把n8n的工作流类比成一个工厂流水线:原材料从最左边的触发节点进入,经过传送带到达各个工位(节点),每个工位完成自己的加工,再把半成品传给下一个工位。如果某个工位出了次品(运行时报错),这条流水线可以选择停下来报警,也可以选择把次品扔进废品区(error workflow),不让它影响后续环节。
理解了这个比喻,你就知道为什么n8n的学习曲线比写脚本陡一些:它不是命令式的“先做A再做B”,而是数据流的“A的输出接B的输入”。一开始可能会不习惯,但一旦习惯了,你会发现这种可视化编排方式比写代码维护起来更直观。
2.2 触发节点(Trigger)是整个工作流的起点
任何工作流至少要有一个触发节点,它决定“什么时候开始跑”。n8n里常用的触发节点有这么几类:
- Schedule Trigger(定时触发):按cron表达式周期性执行,比如每天9点跑一次数据同步。
- Webhook Trigger(网络钩子触发):提供一个HTTP接口地址,别人请求这个地址时触发工作流。这是和外部系统集成的关键。
- Manual Trigger(手动触发):在编辑器里点按钮才执行,适合调试。
- EventListener类触发:比如监听某个邮箱、某个消息队列、某个数据库变更,属于进阶玩法。
我第一次上手时就犯过一个错:建了工作流,配置好了一系列节点,保存后却发现它不执行。后来才明白,我压根没放触发节点,工作流不知道什么时候该跑。这就像你给流水线通了电、备好料,但没按启动按钮。
2.3 数据流动与引用语法(基本没绕过去的坎)
n8n里,每个节点执行后都会输出一份JSON数据。这份数据作为下一个节点的输入。怎么引用上一个节点的数据?靠的是它的表达式语法——{{ $json.字段名 }}。
这设计听起来很简单,但实际用起来有几个容易懵的地方:
按执行的层级来说,前面的节点返回值可能是个数组,比如从数据库查到了10条记录,那$json就是这10条记录的数组。如果你在下一个节点的输入框里直接写{{ $json.name }},它会遍历这10条记录,分别取出每条记录的name字段,然后这个节点会执行10次。这在n8n里叫“分批执行(each item independently)”。想取数组的特定一项?要写成{{ $json[0].name }}。想让某个节点只跑一次,而不按数组拆分?需要开启节点的“Execute Once”选项。
我之前帮同事排查过一个工作流,他写了个HTTP Request节点去调内部接口,接口返回了100条数据,结果下游每个节点都执行了100次,把目标系统请求打到限流。原因就是他没意识到$json里是个数组,且默认行为是对每个条目都执行一次。
2.4 Credentials(凭据)管理的坑
n8n里连接第三方服务,比如发邮件、调API、连数据库,都需要配置Credentials——也就是账号密码、API Key、Token之类的敏感信息。
这个模块有两个值得注意的点:
第一,Credentials是加密存储在n8n自己数据库里的,不是你每次去填明文。部署时设置的N8N_ENCRYPTION_KEY就是用来加解密这些凭据的。如果你部署后忘记设置这个Key,n8n默认会生成一个临时Key,但容器一重建,Key变了,所有已保存的Credentials全部无法解密,等于全部作废,得重新配置一遍。这个坑我踩过,印象非常深。
第二,社区里经常搜“n8n credentials”怎么填,本质上是因为不同Node类型对Credential的字段要求不一样。比如SMTP邮件节点,要填服务器地址、端口、账号、密码;OpenAI节点,只需要填一个API Key。别想着背下来,用的时候看对应Node的文档就行。
2.5 两个FAQ级问题:n8n中文、n8n能通过什么邮箱发邮件
先说中文问题。n8n官方是支持界面多语言的,但中文的支持进度在不同版本里不一样。较新版本在“个人设置(Settings)→ 显示语言(Display Language)”里可以直接切换为简体中文。如果你下载的版本里找不到这个选项,大概率是版本太旧,升级到最新版即可。
再说发邮件。n8n本身不是一个邮件服务器,它是一个邮件客户端。你需要在工作流里用“Send Email”这个节点,然后配置SMTP Credentials。也就是说,你只要有任意一个邮箱的SMTP授权,就能让n8n替你发信。常见的搭配是Gmail的SMTP(需要应用专用密码)、QQ邮箱SMTP(需要授权码而
