尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

n8n 如何用外部 Task Runners 旁路容器隔离执行 Code 节点用户代码

n8n 如何用外部 Task Runners 旁路容器隔离执行 Code 节点用户代码 n8n 如何用外部 Task Runners 旁路容器隔离执行 Code 节点用户代码【免费下载链接】n8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400 integrations.项目地址: https://gitcode.com/GitHub_Trending/n8/n8nn8n 的 Code 节点允许工作流执行用户提供的 JavaScript 和 Python 代码。默认情况下这些代码运行在 n8n 自己的进程里而自托管用户往往希望把这段代码挪出去放进一个独立的 sidecar 容器中执行与主实例隔离。这篇文章说明如何用 n8n 的 Task Runners 外部模式external mode完成这件事主实例里的 Task Broker 负责派发任务单独的 runners 容器负责跑用户代码。内容基于仓库中的 runners 镜像说明、安装用 compose 定义、get-n8n 安装脚本 和 runner 配置定义。先弄清模式internal 是默认值external 才走独立进程n8n 通过环境变量N8N_RUNNERS_MODE决定用户代码在哪执行可选internal或external默认是internal用户代码作为 n8n 的子进程运行见 runners.config.tsconst runnerModeSchema z.enum([internal, external]); Env(N8N_RUNNERS_MODE, runnerModeSchema) mode: TaskRunnerMode internal;切到external后执行链路变成两段n8n 容器内部起一个Task Broker监听 runner 连接默认端口5679默认绑定127.0.0.1runners 容器内的task runner launcher通过N8N_RUNNERS_TASK_BROKER_URI连回 Broker用N8N_RUNNERS_AUTH_TOKEN作为共享密钥完成认证。因为 Broker 默认只绑回环地址而 runner 是另一个容器所以外部模式必须把绑定地址改为0.0.0.0否则连接根本进不来——这正是安装脚本里同时设置这两个变量的原因。主路径get-n8n Compose 安装中启用 runners sidecarget-n8n.sh 安装脚本会往安装目录的.env写入如下配置脚本第 269 行起有注释说明这是为了把 Code 节点用户代码放到独立的 runners 服务中执行N8N_RUNNERS_MODEexternal N8N_RUNNERS_BROKER_LISTEN_ADDRESS0.0.0.0 N8N_RUNNERS_AUTH_TOKEN安装时生成的随机值N8N_RUNNERS_AUTH_TOKEN由脚本自动生成不要改成空值——它是 runner 向 Broker 认证的共享密钥。同一安装目录下的 get-n8n-compose.yml 已经定义好了runners服务安装时下载的那份归你维护、脚本不会重写它runners: image: ghcr.io/n8n-io/runners:${N8N_VERSION} depends_on: - n8n environment: N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN} N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679 # Idle runners exit and are relaunched on demand (per the task-runners docs) N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT: 15 # Runs user code from Code nodes. Never publish this containers ports.几个要点${N8N_VERSION}由安装时的.env解析runners 镜像版本与 n8n 主镜像保持一致N8N_RUNNERS_TASK_BROKER_URI指向 compose 服务名n8n:5679runner 容器通过 Compose 默认网络按服务名访问 Broker不需要也不应该发布端口N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT: 15表示空闲 15 秒的 runner 会退出有任务时再按需拉起——所以后续看到该容器周期性重启是正常现象不是故障compose 注释明确5678 是唯一应对互联网开放的端口runners 容器的端口绝不能发布到宿主机。如果你的.env和 compose 文件已具备以上配置直接重启 compose 服务栈即可让 runners 生效缺少任一项时按上面的值补齐。可选分支不用官方镜像自己构建 runners 容器如果你需要定制依赖比如给 Python runner 加包README 给出了本地测试的完整做法基于仓库内的 Dockerfile 构建n8nio/runners镜像# 1) 生产构建 n8nrunner 镜像会引用构建产物 pnpm run build:n8n # 2) 构建 runners 镜像 docker buildx build \ -f docker/images/runners/Dockerfile \ -t n8nio/runners \ . # 3) 宿主机上以 external 模式启动 n8n并开启 Broker 调试日志 N8N_RUNNERS_MODEexternal \ N8N_RUNNERS_AUTH_TOKENtest \ N8N_LOG_LEVELdebug \ pnpm start # 4) 启动 runners 容器连回宿主机的 Broker docker run --rm -it \ -e N8N_RUNNERS_AUTH_TOKENtest \ -e N8N_RUNNERS_LAUNCHER_LOG_LEVELdebug \ -e N8N_RUNNERS_TASK_BROKER_URIhttp://host.docker.internal:5679 \ -p 5680:5680 \ n8nio/runners这是官方 README 标注的 Testing locally 流程适合在宿主机直接跑 n8n 的开发环境生产部署仍以主路径的 compose 方式为准。注意两处 token 必须与 n8n 侧的N8N_RUNNERS_AUTH_TOKEN一致README 示例里的test仅用于本地。关键配置速查以下默认值来自 runners.config.ts都是影响外部模式行为、值得了解的项环境变量默认值用途据源文件注释N8N_RUNNERS_MODEinternalinternal为 n8n 子进程external为独立进程N8N_RUNNERS_BROKER_PORT5679Broker 监听 runner 连接的端口N8N_RUNNERS_BROKER_LISTEN_ADDRESS127.0.0.1Broker 绑定地址sidecar 部署必须改0.0.0.0N8N_RUNNERS_AUTH_TOKEN空runner 与 Broker 认证的共享密钥N8N_RUNNERS_MAX_CONCURRENCY10单个 runner 并发执行的任务数上限N8N_RUNNERS_TASK_TIMEOUT300秒单任务最长执行时间超时中止任务源码注释注明 n8n v3 会降到60N8N_RUNNERS_TASK_REQUEST_TIMEOUT60秒无可用 runner 时任务等待超时时间防止工作流无限挂起N8N_RUNNERS_TASK_ACCEPT_TIMEOUT2秒Broker 等 runner 确认任务的时限响应慢的基础设施可调大N8N_RUNNERS_HEARTBEAT_INTERVAL30秒runner 心跳间隔丢失心跳会中止任务N8N_RUNNERS_INSECURE_MODEfalse关闭 runner 安全机制源文件标注不建议生产使用容器侧还有两个与隔离相关的细节N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT空闲退出时间compose 主路径设为15秒在 launcher 侧生效镜像内 n8n-task-runners.json 对每个 runner 定义了allowed-env白名单只有列在其中的环境变量才能透传进用户代码的执行环境其余宿主环境一律不可见。容器里到底跑什么Dockerfile 是多阶段构建最终镜像包含三样东西JavaScript runnerNode 26.7.0、Python runnerPython 3.13用 uv 建 venv 安装依赖以及 task-runner-launcher 1.4.7 作为入口。运行时以非 root 用户runneruid 1000启动 launcherCMD [javascript, python]同时拉起两类 runner。启动参数本身就体现了隔离意图JavaScript 带--disallow-code-generation-from-strings禁止字符串动态生成代码Python 带-I -B -X disable_remote_debug隔离解释器、禁远程调试。各组件的端口launcher 暴露5680JavaScript 与 Python runner 的健康检查端口分别为5681、5682见 n8n-task-runners.json这些端口都只应存在于容器网络内部。如何验证链路通了排错看哪几处仓库文档给出的验证手段主要是双端调试日志与两类超时行为按这个顺序核对开日志。Broker 侧n8n设N8N_LOG_LEVELdebuglauncher 侧设N8N_RUNNERS_LAUNCHER_LOG_LEVELdebug这是 README 本地测试流程明确使用的两个开关连接建立、任务派发、失败原因都会在调试日志里体现。确认 runner 在线的判据来自超时语义。配置定义写明N8N_RUNNERS_TASK_REQUEST_TIMEOUT默认 60 秒的作用就是无可用 runner 时防止工作流无限挂起。所以外部模式配好后跑一个含 Code 节点的流程任务能正常执行并返回数据说明 runner 已接入 Broker如果 Code 节点迟迟不执行、最终在约 60 秒后超时则指向 runner 未连上 Broker——回到第 1 步查N8N_RUNNERS_BROKER_LISTEN_ADDRESS是否为0.0.0.0、N8N_RUNNERS_TASK_BROKER_URI是否可达、两侧N8N_RUNNERS_AUTH_TOKEN是否一致。运行中任务被中止时检查心跳链路心跳间隔默认 30 秒丢失心跳会中止当前任务internal 模式还会重启 runner见 runners.config.ts。容器状态方面runners容器周期性退出重启是N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT造成的正常空闲回收不要据此判断故障。边界与限制N8N_RUNNERS_INSECURE_MODE会关闭 runner 的全部安全机制源文件注释明确不建议生产使用仅用于兼容依赖不安全 JS 特性的模块N8N_RUNNERS_TASK_TIMEOUT当前默认 300 秒源码注释注明 n8n v3 会将其降至 60 秒升级前长任务代码需要留意给 runner 加额外依赖需要基于 Dockerfile 构建自定义镜像README 指引到官方文档的 Adding extra dependencies 一节另有 distroless 变体 Dockerfile.distroless 可用runners 容器的任何端口都不要发布到宿主机Broker 端口 5679 同样只在容器网络内可达。【免费下载链接】n8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400 integrations.项目地址: https://gitcode.com/GitHub_Trending/n8/n8n创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表