搞自动化工作流的朋友,这两年应该没少被 n8n 刷屏。这个开源的工作流编排工具,最大的卖点就是可视化拖拽、几百个集成节点随便接,能快速把 AI 能力、内部系统和第三方服务串起来。但真到生产环境,很多人的第一反应是:这东西单机跑跑 demo 还行,真要把业务接进去,扛得住吗?
n8n 从早期版本就开始支持“外部执行器”这种拆分部署模式,简单说就是把“调度和界面”跟“干活的工作流执行”拆成两拨进程。2.9.2 这个版本对 Docker 部署的外部执行器方案做了一些优化,更新频率也一直没停。这篇文章我不讲官网文档里能查到的基础安装,主要分享我在实际部署 n8n 2.9.2 外部执行器时踩过的坑、验证过能稳定跑起来的配置方法,以及从单机模式迁移到外部执行器模式的完整路径。
如果你正在规划 n8n 的企业级部署,或者已经跑起来了但想优化成高可用架构,这篇文章能帮你少走不少弯路。
1. 为什么要把执行器拆出来:单机模式的生产瓶颈
1.1 单容器模式的典型限制
绝大多数人第一次装 n8n,都是 docker run 一把梭,一个容器搞定全部。这种方式开发调试确实舒服,但放到生产环境会碰到几个很现实的问题:
首先是资源争抢的问题。n8n 的主进程既要处理 Webhook 请求、又要维护 SSE 长连接推送实时日志、还要调度定时任务、还得执行工作流代码。这几个任务对 CPU 和内存的需求模型完全不一样,Webhook 喜欢低延迟高并发小请求,而执行代码节点(比如 Python、Code 节点)是典型的 CPU 密集或内存密集操作。挤在同一个进程里,结果就是高峰时谁都跑不快。我实测过一个不算复杂的流程,里面有个 Python 节点要处理一批数据的 JSON 解析和字段映射,单机模式下 Webhook 响应偶尔能飙到 3 秒以上,把执行器拆出来之后基本稳定在 300 毫秒内。
其次是并发能力很难横向扩展。单容器的 n8n,默认执行并发度受 Node.js 单线程事件循环的限制,虽然也可以调 EXECUTIONS_PROCESS 为 own 进程池模式,但终究是单机资源上限。一旦业务量上来,十几个流程同时各跑各的,CPU 直接拉满,所有任务一起变慢。要扩容就得把整个容器一起复制,可主进程和工作执行绑定在一起,扩出来的实例会重复调度定时任务、重复处理 Webhook,引发一堆脏数据问题。
第三是发布和升级的耦合问题。工作流执行逻辑一变(比如改个代码节点),你就得重新部署整个 n8n 实例。假设你有 50 个生产工作流,其中一个改坏了,导致整个服务起不来,剩下 49 个全部停摆,这种风险在生产环境是完全不可接受的。
1.2 外部执行器的架构思路
外部执行器模式的思路很直白:把“n8n 主实例”(也叫 main 进程)和“worker 执行器”(外部执行器)拆成不同的容器,通过 Redis 做任务队列通信。主实例负责启动 Webhook 服务、提供 UI、接收 HTTP 请求和管理流程定义;执行器负责从 Redis 队列里领取具体的执行任务,跑完再把结果写回数据库。二者通过共享数据库(PostgreSQL 或 MySQL)拿到工作流定义和执行结果。
这个架构在分布式系统里很常见,本质就是生产者-消费者模式。n8n 主进程是生产者,把任务丢进 Redis;外部执行器是消费者,干完活把结果存库。好处显而易见:执行器可以随便加副本,横向扩展只需复制容器;Webhook 响应主进程自己处理,不会被执行流程拖慢;升级风险也被隔离了,执行器出了问题,主实例至少还能响应用户请求(虽然不能真正跑通流程,但错误提示清晰可控)。
n8n 官方文档里管这种模式叫 queue mode(队列模式),文档里把外部执行器称为 worker。装了外部执行器之后,主进程里那个默认的执行器就“关闭”了,所有需要执行的工作流任务都交给外部执行器去跑。你在 n8n UI 里能看到工作流的执行状态,但实际跑任务的已经是另一台机器或另一个容器里的进程了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前必读:核心概念与方案选型
2.1 三个关键角色:main、worker 和队列
把 n8n 拆成外部执行器模式,本质上就是你得同时运行两类 n8n 进程,外加一个 Redis:
- Main 进程:负责 UI、Webhook、定时任务调度和 API。它不执行任何工作流的实际逻辑(除了少数特殊情况,比如 workflow 里配置了
runData直接内联执行),只是把执行请求发到队列里。 - Worker 进程:也就是“外部执行器”,从 Redis 中领取任务,执行实际工作流。它可以开 N 个实例,分布在不同的服务器上,只要它们连接同一个 Redis 和同一个数据库。
- Redis:作为任务队列和消息代理,负责在 main 和 worker 之间传递执行任务。n8n 用的是 Bull(基于 Redis 的任务队列库)来管理消息。
数据库也是必不可少的。n8n 默认用 SQLite,但生产环境建议用 PostgreSQL。原因有二:一是主实例和多个执行器要并发访问同一份数据,SQLite 的锁机制在并发写场景下很容易死锁;二是 PostgreSQL 的 JSONB 类型对 n8n 存储工作流定义这类半结构化数据非常友好,查询和备份都更可靠。
2.2 方案对比:docker compose 与独立容器
部署外部执行器,本地开发可以用 docker compose 一键起全套,线上生产我建议把数据库和 Redis 与 n8n 分开部署(至少 Redis 不用跟 n8n 容器绑在一起)。
下面是我在实际项目中一直沿用的 docker-compose 方案,分了两个 service:一个是 n8n 主实例,一个是 n8n worker(外部执行器),外加配套的 PostgreSQL 和 Redis。如果你只是想先跑通流程,可以用 n8n start --tunnel 这种开发模式先顶一下,但生产环境一定要用带数据库的完整方案。
yaml复制version: '3.8'
services:
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8n_password
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'n8n']
interval: 5s
timeout: 5s
retries: 10
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- redis_data:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 5s
retries: 10
n8n:
image: n8nio/n8n:2.9.2
restart: unless-stopped
ports:
- '5678:5678'
environment:
- N8N_HOST=your-domain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- EXECUTIONS_MODE=queue
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_password
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_BULL_REDIS_PORT=6379
- N8N_ENCRYPTION_KEY=your-encryption-key
- GENERIC_TIMEZONE=Asia/Shanghai
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- n8n_data:/home/node/.n8n
worker:
image: n8nio/n8n:2.9.2
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
- EXECUTIONS_MODE=queue
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_password
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_BULL_REDIS_PORT=6379
- N8N_ENCRYPTION_KEY=your-encryption-key
- GENERIC_TIMEZONE=Asia/Shanghai
command: worker
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
postgres_data:
redis_data:
2.3 版本选择:为什么要盯住 2.9.2
我写这篇文章时,n8n 的版本更新很快,2.9.x 是近期相对稳定的一个版本线。选择 2.9.2 主要基于两个原因:一是它修复了之前几个版本里外部执行器模式下 Webhook 响应偶尔丢失的问题,执行器执行完的结果回写更可靠;二是这个版本的官方镜像在 Docker Hub 上的 multi-arch 支持比较完善,ARM64 和 AMD64 都能直接拉取,不会遇到旧版本那种在 ARM 机器上跑不起来、得自己构建镜像的尴尬。
如果你手头已经跑着旧版本,升级前一定要看官方的 breaking changes 说明。n8n 从 1.x 到 2.x 做过一次凭证存储结构调整,外部执行器模式下,新版本的主实例和 worker 之间凭证加密方式是有要求的,主实例和 worker 必须设置相同的 N8N_ENCRYPTION_KEY,否则 worker 在执行需要凭证节点(比如 HTTP Request 里引用 credential)时会报错“unable to decrypt credential”。这是新手最容易踩的坑之一,后面我会专门讲。
3. 实操:Docker Compose 部署 n8n 外部执行器完整流程
3.1 环境准备:检查 Docker 和硬件要求
开始之前,先把环境清点清楚。外部执行器模式比单容器模式更吃资源,因为你要同时跑 PostgreSQL、Redis、n8n 主实例和至少一个 worker。我的建议配置是:
- CPU:4 核起步(2 核跑 main,2 核跑 worker)
- 内存:8 GB 以上(PostgreSQL 占 1~2 GB,Redis 很小 512 MB 以内,n8n 主实例 + worker 各占 1~2 GB)
- 磁盘:20 GB 以上 SSD,日志和工作流数据会慢慢涨
- Docker:20.10.10 以上版本,docker compose v2 语法
先确认 Docker 环境没问题:
bash复制docker --version
docker compose version
如果还没有 Docker,安装过程各平台差异较大,这里不展开。装好后记得把当前用户加进 docker 组(Linux 环境下),避免每次都要 sudo。
3.2 配置编写:关键的八个环境变量
外部执行器模式的环境变量配置,本质上就三块:数据库连接、Redis 连接、执行模式开关。下面是我实际生产环境用的配置模板,逐个解释一下:
执行模式与并发相关:
| 环境变量 | 建议值 | 作用 |
|---|---|---|
EXECUTIONS_MODE |
queue |
核心开关,设为 queue 表示启用外部执行器模式 |
EXECUTIONS_TIMEOUT |
300 |
单个工作流最长执行时间(秒),防止死循环拖死 worker |
EXECUTIONS_TIMEOUT_MAX |
600 |
允许工作流单独设置的最大超时时间 |
EXECUTIONS_DATA_PRUNE |
true |
自动清理历史执行数据,避免数据库膨胀 |
EXECUTIONS_DATA_MAX_AGE |
168 |
保留执行数据的最长小时数,168 = 7 天 |
数据库连接(对应 compose 里的 DB_ 前缀):
n8n 默认用 SQLite,一旦设了 DB_TYPE=postgresdb 就要保证后面四个参数(HOST、PORT、DATABASE、USER、PASSWORD)全部正确。这里有个细节,postgres 的密码不要用特殊字符太多,比如含 @ 或 # 的连接串,在 environment 里解析时偶尔会出问题,建议用纯字母数字加下划线。
Redis 连接(对应 QUEUE_BULL_REDIS_ 前缀):
n8n 的 queue mode 用的是 Bull 这个 Node.js 库,它依赖 Redis。如果 Redis 不用默认的 6379 端口,可以加端口参数;如果 Redis 配了密码,还要加 QUEUE_BULL_REDIS_PASSWORD。我在线上环境还会给 Redis 单独开一个 db index,避免跟其他项目共用 Redis 时数据串掉,比如 QUEUE_BULL_REDIS_DB=1。
加密与安全:
N8N_ENCRYPTION_KEY 必须要设置。这个 key 用来加密数据库里的凭证(credential)信息,主实例和所有外部执行器必须用同一个 key,否则 worker 执行节点时解密不了凭证。生成方法:本地跑一下 openssl rand -hex 24,把输出复制过来。要妥善保存,丢失这个 key 等于丢失所有凭证。
3.3 启动顺序与验证:先基础组件,再 n8n 全家桶
配置写好后,不要急着直接 docker compose up -d 一把梭。我的习惯是分三批启动,便于定位问题:
第一步,先起数据库和 Redis:
bash复制docker compose up -d postgres redis
docker compose ps
等 postgres 显示 healthy、redis 显示 healthy 之后,再继续。我见过很多人图省事直接一键全起,结果 n8n 主实例连接数据库超时,界面一直转圈,排查半天才发现是 postgres 还没准备好。
第二步,起 n8n 主实例:
bash复制docker compose up -d n8n
docker compose logs -f n8n
正常情况下,日志里会出现 Editor is now accessible via: http://localhost:5678/,这就说明主实例启动成功了。这时可以先用浏览器访问一次,但先别急着创建工作流,因为执行器还没起来。
第三步,启动 worker:
bash复制docker compose up -d worker
docker compose logs -f worker
worker 正常启动的标志是日志里出现 Started 或 Worker process 之类的内容,并且持续监听 Redis 队列。如果 Redis 连接失败,worker 会一直重试,日志刷屏“Redis connection failed”。
全部启动后,验证整个链路是否通畅的最好方法是创建一个最简测试工作流:一个 Webhook 节点接一个 Set 节点,手动执行一次。如果工作流能跑通,那说明 main 把任务丢进 Redis、worker 领了任务、执行完回写数据库这条链路是通的。如果卡在“waiting for execution”之类的状态,基本可以确定 Redis 或 DB 连接有问题。
3.4 外部执行器的水平扩展
外部执行器模式最大的优势就是灵活扩缩容。要临时增加处理能力,最简单的方式就是给 worker 服务加多个副本:
bash复制docker compose up -d --scale worker=3
注意,--scale 只能对没有指定固定容器名的 service 使用,worker 这个 service 在我们的 compose 里恰好满足条件。如果是在 K8s 环境,就直接扩容 Deployment 的 replicas 数。
扩容之后,Redis 队列会自动把任务分发到多个 worker 上,天然支持并行处理。不过要留意一点:如果你的不同工作流之间有依赖关系(比如工作流 A 完成后触发工作流 B),这些任务可能会被调度到不同的 worker 上去执行,这时状态的传递就不能依赖 n8n 自带的执行数据,需要把状态放到外部存储(比如 Redis 或数据库里自己维护一个标记字段)。
4. 从单机工作流迁移到外部执行器模式的实操要点
4.1 凭证迁移:最容易踩坑的加密问题
很多人兴冲冲地把单机 n8n 的配置整体搬到 compose 部署上,结果一执行就报“Error decrypting credential”。原因就是凭证的加密 key 不一致。
n8n 的凭证在存储时是用 N8N_ENCRYPTION_KEY 加密的。单机模式如果没设置过这个环境变量,n8n 会生成一个随机的 key 存在 config 文件里;当你切到 compose 部署、设置了新的 N8N_ENCRYPTION_KEY 后,数据库里那些用旧 key 加密的凭证就解不开了。
解决办法有两条路:
- 从干净的数据库开始,在 UI 里重新创建一次所有凭证(数据少的话推荐,省得折腾)
- 沿用旧库,但在 compose 里把
N8N_ENCRYPTION_KEY设置成旧 key。去哪找旧 key?单机模式下直接登录容器环境变量查看:
bash复制docker exec -it <your-old-n8n-container> env | grep N8N_ENCRYPTION_KEY
如果旧 n8n 容器早就删了,也可以在旧的 .n8n/config 文件里找(挂载的目录下),搜一下 encryptionKey 字段。实在找不到,就只能重建凭证了,这是没有办法的办法。
4.2 定时任务:确保不被重复调度
单机模式下,n8n 的定时触发器(Schedule Trigger)是跟着主进程走的。切换到外部执行器模式后,定时触发器仍然在主进程里调度(因为 main 进程负责定时任务的生成),执行器只是负责执行。所以理论上主实例是单数的时候,定时任务不会重复触发。
但这里有一个很多人会掉进去的坑:如果你用 --scale n8n=2 把主实例也扩成了多副本,那定时任务就会在所有主实例副本上都生成一份,最终同一时刻可能被触发两次。单机模式扩容器没这个顾虑,因为每份容器都有完整的定时调度。但在外部执行器模式下,定时调度属于有状态逻辑,必须保证只有一个 main 实例,否则就会重复执行。
如果你确实需要主实例高可用,那得在 main 前面加一层负载均衡,并且用 Redis 或数据库做一个分布式锁机制,确保同一时刻只有一个主实例在真正调度定时任务。这个方案实现起来不复杂,但 n8n 本身不支持,需要自己写一个简单的互斥逻辑(比如每隔几秒尝试往 Redis 写一个带过期时间的 key,写成功的那个实例才继续调度)。
4.3 Webhook 执行结果与前后端分离的细节
外部执行器模式下,Webhook 的执行链路有个特殊点:请求先到 main,main 把任务丢给 worker,worker 执行完把结果写回数据库,main 再把结果返回给请求方。这个过程是异步的,如果你在 Webhook 节点里勾选了“Respond to Webhook”的模式,那执行器执行完工作流后会用回调的方式把数据传回主进程,主进程再响应 HTTP 请求。
这个设计带来一个小坑:如果 worker 执行时间较长,超过了 API 网关或负载均衡的超时时间(比如 Nginx 默认 60 秒),客户端就会收到 504。单机模式下 Webhook 是同步等待的,不太容易出现这个问题;外部执行器模式天然引入了异步网络开销,所以对超时敏感的场景要做三层超时设计:
- 工作流层面:
EXECUTIONS_TIMEOUT设个合理上限 - 网关层面:Nginx / LB 的超时时间放宽到 120 秒以上
- Webhook 节点内部:如果可能,尽量用“respond immediately” + 继续执行的方式,用户请求快速返回,后台工作流慢慢跑
5. 常见问题速查与排障实录
5.1 worker 一直连不上 Redis 怎么办
如果 worker 日志持续出现 Error: connect ECONNREFUSED,先别怀疑代码,大概率是网络或配置问题。按顺序排查:
- 确认 Redis 容器是否在运行:
docker compose ps看 redis 服务状态 - 确认端口映射:如果 Redis 在宿主机上直接装的,compose 里连接地址要用宿主机 IP,而不是
localhost - 确认 Redis 是否设置了密码:有密码的话一定要加
QUEUE_BULL_REDIS_PASSWORD - 确认 Redis 的 db index 一致:worker 和 main 里
QUEUE_BULL_REDIS_DB要一致
我踩过一次很隐蔽的问题:Redis 容器健康检查显示 normal,但实际内存被占满了,只有 INFO 命令能响应,实际写入直接报错。worker 日志显示的是超时而不是拒绝连接。后来用 docker stats 看了眼内存,发现 Redis 快被撑爆了,清理了一波垃圾 key 才恢复。
5.2 工作流执行卡在“waiting”状态不执行
如果 UI 里看到工作流执行记录一直停在 waiting,说明任务已经被 main 发到队列里了,但没有任何 worker 来消费。可能的原因:
- worker 没启动或崩了:
docker compose ps看 worker 状态,docker compose logs worker看日志 - worker 连接的不是同一个 Redis:检查 compose 里两个服务的 Redis 连接参数是否一致
- worker 在执行过程中报错退出了:日志里如果出现 unhandled promise rejection 或 out of memory,多半是 worker 容器的内存限制太小,调大
mem_limit或减少并发度
顺带提一句,n8n 的并发度设置默认值比较保守。如果你觉得 worker 明明有资源但任务处理很慢,可以给 worker 设一个环境变量 N8N_CONCURRENCY_PRODUCTION_LIMIT,默认值是 10,意思是这个 worker 同时最多处理 10 个任务。机器配置够的话调到 50~100 都是可以的,但建议逐步上升,观察 CPU 和内存占用。
5.3 数据持久化与备份策略
外部执行器模式下,数据库是核心资产,必须做好备份。Redis 的数据可以丢(重新执行一轮也不算太糟),但 PostgreSQL 里存了所有工作流定义、凭证和全部执行日志,丢不起。
我建议的备份策略是:每天凌晨用 pg_dump 导一次全量备份,保留最近 7 天;另外打开 PostgreSQL 的 WAL 归档,支持按时间点恢复。具体配置方法不展开了,但强烈建议你把 n8n 部署在后端数据库自动备份的云服务上(RDS 或云数据库),比自己折腾备份省心得多。
凭证备份这块也提醒一下:PostgreSQL 里的数据即使导出,没有 N8N_ENCRYPTION_KEY 也恢复不了凭证。所以数据库备份文件 + 加密 key 必须分开保存,最好存到不同的存储介质上。
5.4 升级 n8n 版本的正确姿势
n8n 迭代很快,升级是迟早的事。对于外部执行器模式,升级原则是:先升 worker,再升 main。因为 worker 负责执行逻辑,新版本执行引擎先验证没问题,再让 main 切换过去,风险更小。
具体操作:
bash复制# 拉新镜像
docker compose pull
# 只重启 worker
docker compose up -d --no-deps worker
# 先跑一轮测试工作流,验证无报错
# 再重启 main
docker compose up -d --no-deps n8n
从 1.x 升到 2.x 需要特别注意,n8n 对工作流定义的结构有过调整,老版本定义的新格式在 2.9.2 中读取有兼容层,但反过来不行——如果你降级回去,有些新字段会被忽略,导致工作流行为变化。所以升级前一定要先备份数据库。
6. 外部执行器模式的高可用与生产化落地
6.1 资源隔离与监控
生产环境里,我不会让 db、redis 和 n8n 三个服务挤在同一台机器上。至少把 PostgreSQL 和 Redis 拆到独立的机器或云服务上。原因很简单:这三个服务的故障域完全不同。数据库挂了对所有流程都是毁灭性的;Redis 挂了虽然流程暂时跑不了但数据库数据还在,恢复起来相对容易;n8n 进程本身挂了只影响入口,数据库和队列还活着,快速拉起来就行。
监控方面,至少要把这三块的指标接进来:
- n8n:
/healthz健康检查端点(配置了N8N_METRICS还能拿到 Prometheus 格式的执行指标) - Redis:内存、连接数、队列长度(Bull 的 Queue 有 key 能看到工作流队列堆积情况)
- PostgreSQL:连接数、慢查询、磁盘空间
6.2 镜像构建与私有化交付
如果你的团队内部有镜像仓库,强烈建议不要直接用 Docker Hub 的 n8nio/n8n 镜像,而是基于它打一层自己的镜像,把凭证加密 key 通过环境变量注入(而不是在 compose 文件里明文写死)。
简单打个自定义镜像的 Dockerfile 示例:
dockerfile复制FROM n8nio/n8n:2.9.2
ENV NODE_ENV=production
ENV EXECUTIONS_MODE=queue
ENV DB_TYPE=postgresdb
ENV N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
然后在部署环境里通过 .env 文件或密钥管理服务把 N8N_ENCRYPTION_KEY 注入进去。这样 compose 文件里就不含任何敏感信息,可以安全地放进 Git 仓库。
6.3 性能调优的几个有效参数
最后分享几个我实测有效的性能调优参数:
N8N_METRICS=true:开启 Prometheus 指标,方便做执行延迟和队列深度监控N8N_PUSH_BACKEND=websocket:UI 实时日志用 WebSocket 推送,比默认的 SSE 更稳,尤其在有反向代理的情况下N8N_HIRING_BANNER_ENABLED=false:去掉 UI 上的招聘小广告,界面干净不少N8N_DEFAULT_BINARY_DATA_MODE=filesystem:把二进制文件数据存到文件系统而不是数据库,减轻数据库压力。等二进制数据量大了以后,这个参数能明显改善数据库性能N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true:在 Linux 容器里强制校验配置文件权限,防止凭证泄露
外部执行器模式的部署真正跑起来之后,你会明显感受到架构拆分带来的好处:Webhook 响应不再被重活拖累,执行器可以自由伸缩,某条工作流写挂了影响范围也控制在一个 worker 里,不用每次都在生产环境提心吊胆地试错。
我在实际部署中体会最深的一点是,外部执行器模式不是一上来就要上的架构,但如果你的业务已经开始依赖 n8n 处理重要流程、需要多人协作开发、或者对执行并发有要求,那趁早拆比晚拆香得多。另外一个额外建议:部署文档一定要记清楚 N8N_ENCRYPTION_KEY 放哪个位置、如何备份,这个 key 丢了比数据库丢失还麻烦。希望这份部署详解能给你节省几个小时的折腾时间。
