n8n 2.x 能装进本机,前提只有两条:Node 到 24,5679 端口空着。从零到能登录编辑器约 4 分钟,安装目录 2.6GB,单实例空载吃 670MB 内存。
它适合想在自己电脑上试工作流自动化、又不想起 Docker 的人。生产环境别照抄这篇,SQLite 单文件和内网 http 都是临时方案。
先看 Node 版本:22 装得上,起不来
n8n 2.47.5 的包元数据里写着 Node 要求 >=24.0.0。这条在安装阶段只出现一次 warn,很容易被忽略。
更误判的是版本查询。用 Node 22.22.2 执行 n8n --version,输出是干净的 2.47.5,看不出任何异常。换成 n8n start 才硬退,退出码 1,全文只有两行:
Your Node.js version 22.22.2 is currently not supported by n8n.
Please use a Node.js version that satisfies the following version range: >=24.0.0
这次失败的副作用很小,工作目录一个文件都没建。看到这两行不用清残留,装好 Node 24 直接重跑就行。
本机没有 Node 24 时,从 npmmirror 取二进制最快:48.8MB 的包实测 2.29 秒下完,解压即用,不碰系统里原有的 Node。把解压目录的 bin 加进 PATH,后面所有命令都走它。
国内镜像装不上:卡在 ETARGET,与网速无关
npmmirror 的 @ai-sdk/openai 最新只到 4.0.115,官方源已经推到 4.0.116,而 n8n 2.47.5 的依赖锁的就是 4.0.116 这个版本号。安装跑到 47 秒时报错:
npm error code ETARGET
npm error notarget No matching version found for @ai-sdk/[email protected].
换个方式请求同一个版本号,就能看清这是同步延迟:镜像上 https://registry.npmmirror.com/@ai-sdk/openai/4.0.116 返 404,官方源同一地址返 200。
处理办法是只给这一步指定官方源,不要动全局 registry,否则后面的项目全走境外:
npm install -g [email protected] --registry=https://registry.npmjs.org
这条路实测 184.8 秒装完 2404 个包,落盘 2.6GB。三种取包方式放在一张表里对比:
| 环节 | 数据源 | 结果 | 实测耗时 |
|---|---|---|---|
| 取 Node 24.9.0 二进制 48.8MB | npmmirror | 成功 | 2.29 秒 |
| 装 n8n 2.47.5 | npmmirror | ETARGET 失败 | 47 秒后中断 |
| 装 n8n 2.47.5 | registry.npmjs.org | 成功 2404 包 2.6GB | 184.8 秒 |
结论很清楚:Node 二进制走镜像,npm 包这一步回到官方源。镜像在包量大的时候反而更容易缺版本。
启动只认两个端口,第二实例必撞 5679
默认端口 5678 是编辑器与接口,5679 是任务代理(Task Broker),后者容易被忽略,因为界面上看不见。改 N8N_PORT 只改前一个,第二个实例照样撞墙:
n8n Task Broker's port 5679 is already in use. Do you have another instance of n8n running already?
这句话出现在进程退出之前,退出码 1。更麻烦的是它排在 342 条数据库迁移之后才打印,第一次装的人很容易以为初始化失败,跑去删目录重来。多实例并行要显式给第二个实例另一个代理端口:
N8N_PORT=5790 N8N_RUNNERS_BROKER_PORT=5690 n8n start
| 端口 | 用途 | 对应变量 |
|---|---|---|
| 5678 | Web 编辑器、REST 接口、webhook | N8N_PORT |
| 5679 | Task Broker,JS 与 Python 任务的调度通道 | N8N_RUNNERS_BROKER_PORT |
启动耗时不长。空库第一次启动要跑 342 条迁移,实测 3.6 秒就到 Editor is now accessible;已有数据库的第二次启动是 2.5 秒。刚装完那一次会把这 2.6GB 包从磁盘读一遍,明显更慢,之后都回到两三秒。
数据目录有个容易搞错的点。N8N_USER_FOLDER 只是父目录,真正的东西落在它下面的 .n8n 里,包括 database.sqlite、config 和 nodes。备份要按整个 .n8n 拿,只拷数据库会丢加密密钥。
http 打不开登录页:Secure Cookie 的连锁反应
这个版本的登录 cookie 默认带 Secure 标记。用 http 访问时浏览器不保存它,于是登录接口返 200,后面每个请求都 401,界面表现是一刷新就弹回登录框,没有任何报错可看。
判断方法不用看浏览器,直接问服务端:
curl -s http://127.0.0.1:5678/rest/settings | python3 -c "import json,sys;print(json.load(sys.stdin)['data']['authCookie'])"
返回 {'secure': True} 就是这种状态,返回 False 就正常。看响应头也直接,Set-Cookie 那一行末尾带 Secure 字样。
本机或内网自用,加一个变量关掉就行,登录后 cookie 的 Secure 标记随之消失:
N8N_SECURE_COOKIE=false n8n start
公网访问不要关,换成 https 反向代理,让 cookie 真的走加密通道。这一点和另一套自托管前端踩过的首启坑很像,Open WebUI 免 Docker 安装那次卡在首启拉模型,本篇卡在登录环节,都属于默认配置假设了理想网络环境。
跑通第一条 webhook:激活要带 versionId
界面上点开关很容易,脚本里激活有两个陷阱。第一个陷阱是 PATCH 工作流带 {"active": true},接口返 200 且带回完整对象,但再查一次 active 仍是 false,字段被静默忽略。正确的入口是单独的动作接口,并且必须带版本号:
POST /rest/workflows/<id>/activate
{"versionId": "<GET /rest/workflows/<id> 拿到的 versionId>"}
第二个陷阱在激活之后。三次实测都是同一个结果:激活返 200 后的 30 毫秒打 webhook 还是 404,等到 150 毫秒就 200。脚本里连续做激活加调用,不加一拍等待就会误判成没激活。
地址也要分清。带 -test 的那条只在点了执行按钮之后才通,生产地址要求工作流处于激活态:
| 地址 | 需要先激活 | 需要先点执行 | 未就绪时返回 |
|---|---|---|---|
/webhook/<path> |
是 | 否 | 404 提示工作流必须激活 |
/webhook-test/<path> |
否 | 是 | 404 提示点执行按钮 |
还有一个默认行为要改。webhook 节点默认只回一句 {"message":"Workflow was started"},调用方拿不到处理结果。把响应模式改成 lastNode,返回的就是最后一个节点的输出,实测拿到 {"got":"second"},链路完全打通。
每次调用都会落一条执行记录,/rest/executions 能看到 mode 是 webhook、状态 success、体积 1608 字节,排查问题时比日志方便。
不打开界面也能跑:CLI 导入与执行
自动化脚本里更省事的做法是彻底绕开界面。导入工作流一句命令,执行另一句:
n8n import:workflow --input=wf.json
n8n execute --id <workflow-id>
退出码这次是可信的。成功返 0,节点报错返 1,并打印 Execution was NOT successful,批处理脚本可以直接用。但 CLI 也要抢 5679,如果本机正跑着一个服务实例,execute 会以同一条 Task Broker 报错退出,同样要给 CLI 单独端口:
N8N_RUNNERS_BROKER_PORT=5691 n8n execute --id <workflow-id>
整个执行 1.1 秒,其中真正跑节点只有 3 毫秒,剩下全是进程启动和加载运行时。拿这个数可以反推:批量跑工作流时,成本在进程启动,不在流程本身。
三个最容易卡住的点,按出现顺序排
第一是 Node 版本。--version 正常输出、start 立刻退 1,两者相差只有一条 warn,装机前先跑一次 node -v 最省时间。
第二是 5679 被占。报错发生在 342 条迁移之后,看着像初始化失败,实际是端口问题。用 lsof -nP -iTCP:5679 -sTCP:LISTEN 看占用者,别急着重装。
顺带一个进程管理的坑:n8n 会把进程名改成 n8n start 与 n8n task-runner,按原始命令行路径去 grep 是找不到的。停止服务请用端口找进程,或者按进程名匹配。
第三是激活后的那一拍。150 毫秒的注册延迟,在脚本里就是一次随机的 404,加个重试最简单。
目录与资源占用:小机器能不能装
安装目录 2.6GB,是 npm 全局包加依赖的总体积。数据目录在空库状态下只有 6.4MB,其中 database.sqlite 2.4MB,写日志用的 WAL 文件 4.2MB,另有 config 一个 56 字节的加密密钥文件。跑起来以后 WAL 会涨,磁盘要留出余量。
内存是更实际的门槛。空载时主进程 546MB,任务代理子进程 122MB,合计约 670MB。1GB 内存的小机器能装能开,跑几条轻量流程没问题,再多的并发就该换机器了。
日志里有一条可以不用理:Python 任务代理在内部模式下起不来,报虚拟环境缺失。这只影响用 Python 写的代码节点,JS 节点照常工作。
另外启动时会提示 N8N_RUNNERS_ENABLED 已不需要设置,内部运行模式也不再推荐。想关掉遥测加 N8N_DIAGNOSTICS_ENABLED=false,本地试装更干净。
最后一句判断:这套东西的价值在流程编排,不在跑模型。如果你只是想让本地大模型有个可编排的执行层,先确认n8n 项目本身的能力边界,再决定要不要为它腾 2.6GB 磁盘。镜像源这类环境问题也别只盯着 npm,之前折腾 uv 国内加速踩过的坑,思路是同一套:小包走镜像,关键依赖回官方源。
FAQ
Node 20 或 22 能跑 n8n 2.x 吗?
不能。2.47.5 的下限是 Node 24.0.0,低于这个版本 n8n start 直接退出,退出码 1。安装阶段不会拦住你,所以别只看装成功了没有。
装完默认用什么数据库,要不要先装 Postgres?
不用,默认就是 SQLite,数据存在 .n8n/database.sqlite 一个文件里,单机自用完全够。多个实例共用一套数据、或者要给团队用,才需要换 Postgres。
同一台电脑上想同时跑两个实例做对比怎么办?
两个变量都要给:N8N_PORT 换 Web 端口,N8N_RUNNERS_BROKER_PORT 换任务代理端口,数据目录也要各给一个 N8N_USER_FOLDER。少给代理端口就会撞 5679 退出。
延伸阅读
- whisper.cpp 中文转写实测:五档模型怎么选2 天前
- NVIDIA Dory 4B 上手:3.7GB GGUF 四档算力跑法5 天前
- uv 国内加速怎么配:装 Python 从 13.8 秒到 0.86 秒1 天前
- Open WebUI 免 Docker 怎么装:首启 4 分 17 秒卡在哪9 小时前
继续读
往下这几篇值得接着看:
- AWS Emulator 开源:438 个 API 模型本地跑与 59.71% 保真度2026-11-13
- Open WebUI 免 Docker 怎么装:首启 4 分 17 秒卡在哪2026-11-12
- MLX 跑 8B 模型实测:比 Ollama 快 17%,长文反而慢2026-11-12
