n8n 单机模式(Single / Regular Mode)完全指南:单进程架构、SQLite 选型与 Caddy 自动 HTTPS 部署
n8n 单机模式Single / Regular Mode完全指南单进程架构、SQLite 选型与 Caddy 自动 HTTPS 部署【免费下载链接】n8n-mcpA MCP for Claude Desktop / Claude Code / Windsurf / Cursor to build n8n workflows for you项目地址: https://gitcode.com/GitHub_Trending/n8/n8n-mcp导读单机模式Single / Regular Mode是自托管 n8n 最简洁的部署形态一个 n8n 进程同时承载编辑器 UI、REST API、触发器/定时器并在进程内执行工作流配合 Caddy 反向代理自动签发 HTTPS 证书用最少的组件把 n8n 跑起来。本文以仓库中 n8n-self-hosting 技能包的 SINGLE_MODE.md 为主线结合同目录下的 SKILL.md、SECURITY.md、DAY2.md 以及 assets 目录 中的真实模板文件为你讲透单机模式的适用边界、SQLite 与 Postgres 的取舍、SQLite→Postgres 迁移路径、资源规划与上线验证方法。读完你可以直接用仓库模板在自己的 Linux 服务器上部署一个 TLS 加密的单实例 n8n并知道何时该升级到队列模式。单机模式的架构与你得到什么SINGLE_MODE.md 明确指出单机模式下只有一个 n8n 进程处理一切编辑器 UI、REST API、触发器/定时器并且工作流在进程内执行executes workflows in-process。这是最容易运行、也最容易推理reason about的形态对应的模板是assets/docker-compose.single.yml。该模式下的服务组成非常简单只有两个容器caddy—— 公共反向代理负责 80/443 端口的自动 HTTPSLets Encrypt/ZeroSSLn8n—— 单进程本体数据存放在n8n_data卷中对应容器内/home/node/.n8n。默认数据库是SQLite数据库文件就住在n8n_data卷里不需要单独的数据库容器。这一点与队列模式形成鲜明对比——队列模式必须引入 Redis消息队列和 Postgres共享数据库服务数量从 2 个变成 5 个。从模板文件 docker-compose.single.yml 可以看到两个值得注意的细节n8n 服务故意不映射任何ports:注释里明确写着NOTE: intentionally NO ports mapping——n8n 只在私有网络n8n_net上运行只能通过 Caddy 访问宿主机的 5678 端口不会被暴露。这是本技能包的安全底线之一只有 Caddy80/443面向公网n8n5678、Postgres5432、Redis6379一律留在 Docker 私有网络中。卷名被固定name:显式指定n8n_data、caddy_data、caddy_config三个卷的名字与项目目录无关这样 DAY2.md 中的备份/恢复命令可以稳定引用这些确切的名字不会因为 compose 项目目录变化而找不到卷。Caddy 的配置 Caddyfile 同样贯彻域名无关原则站点地址由{$N8N_SUBDOMAIN}.{$N8N_DOMAIN}从 Caddy 服务环境变量填充而这些环境变量由 compose 从.env注入因此 Caddyfile 本身不包含任何域名或客户端特定信息可以安全提交到版本库。Caddyfile 中还包含两个对 n8n 至关重要的配置reverse_proxy n8n:5678块内的flush_interval -1立即流式输出响应保证编辑器实时推送通道SSE / websockets不被缓冲基础安全响应头Strict-Transport-SecurityHSTS一年 includeSubDomains、X-Content-Type-Options: nosniff、X-Frame-Options: SAMEORIGIN、Referrer-Policy: strict-origin-when-cross-origin。单机模式是不是正确的选择SINGLE_MODE.md 给出了非常明确的适用判定标准适合的场景单一用户或小团队、执行量轻到中等、重视运维与备份的简单性——整个实例只有一个卷需要备份the whole instance is one volume to back up。需要升级换队列模式的信号执行executions开始排队互相阻塞长耗时/重负载的执行把 UI 卡住需要跨 CPU 核心或跨机器水平扩展。一旦出现这些迹象就应该转向 QUEUE_MODE.md 描述的队列模式。SKILL.md 中的Rule 0给出了更务实的决策建议不确定时先从单机模式开始——它是最简单的正确方案覆盖大多数需求但如果用户已经预见到真实的大流量直接上队列模式可以避免日后换 compose 文件加 SQLite→Postgres 迁移的麻烦。单机模式下的 SQLite 与 Postgres 选型SINGLE_MODE.md 强调了一个容易踩坑的事实SQLite 和 Postgres 是仅有的两个受支持数据库——MySQL/MariaDB 支持已经不存在且 Postgres 只支持actively maintained versions活跃维护版本。两者的定位对比SQLite默认模板采用零额外组件备份 快照n8n_data卷即可。适合绝大多数单实例安装。Postgres可选升级在写入压力下更稳健是预期要扩容时的标准选择。如果你知道很快会转队列模式现在就上 Postgres 可以避免日后一次 SQLite→Postgres 迁移。使用 Postgres 的方式在 compose 中追加一个postgres:16服务可参考队列模板中的 service init-data.sh healthcheck 写法然后在 n8n 服务上设置以下环境变量DB_TYPEpostgresdb DB_POSTGRESDB_HOSTpostgres DB_POSTGRESDB_DATABASE数据库名 DB_POSTGRESDB_USER用户名 DB_POSTGRESDB_PASSWORD密码其余配置保持不变。注意队列模式的 init-data.sh 负责创建 n8n 连接时使用的非 root 数据库用户与 Postgres 超级用户分离——如果单机模式要接 Postgres同样应该遵循这一安全实践而不是直接让 n8n 用超级用户连接。SQLite → Postgres 迁移官方支持的正确路径SINGLE_MODE.md 明确提醒没有就地切换in-place switch的机制。受支持的路径是导出工作流与凭据 → 起 Postgres → 让 n8n 指向全新数据库 → 重新导入。关键点在于CLI 命令要在容器内以node用户身份执行docker compose exec -u node n8n n8n export:workflow --backup --output/home/node/.n8n/backup/ docker compose exec -u node n8n n8n export:credentials --all --output/home/node/.n8n/creds.json # 在让 n8n 指向 Postgres 之后 docker compose exec -u node n8n n8n import:workflow --separate --input/home/node/.n8n/backup/ docker compose exec -u node n8n n8n import:credentials --input/home/node/.n8n/creds.json迁移中最容易翻车的是凭据解密凭据导出默认是加密的它们只有在相同的N8N_ENCRYPTION_KEY下才能重新导入因此迁移全程必须保持该 key 不变--decrypted参数虽然存在但会把明文密钥写入磁盘——除非确实需要否则避免使用万一用了事后要彻底销毁该文件迁移需要规划一个短暂维护窗口maintenance window。这一点与 SECURITY.md 的核心警告完全呼应丢失或更改密钥所有已保存的凭据都将变得不可解密Lose it or change it and all saved credentials become undecryptable。SECURITY.md 还补充了一个极易被忽视的陷阱如果你在没设 key 的情况下启动过一次 n8nn8n 会自动生成一个密钥写入n8n_data卷~/.n8n/config之后再补上一个不同的 key 反而会破坏解密。因此正确顺序是首次启动前就在.env里显式设置N8N_ENCRYPTION_KEY。资源规划一个小盒子就够SINGLE_MODE.md 的资源建议非常接地气轻量使用下约 1–2 GB RAM 即可流畅运行单个实例重度 Code 节点或二进制数据处理需要更多内存余量设置N8N_DEFAULT_BINARY_DATA_MODEfilesystem模板默认值让大文件落到磁盘而不是驻留内存/数据库。模板 docker-compose.single.yml 正是这么做的它把二进制数据模式显式设为filesystem避免大 payload 撑爆 SQLite 或内存。DAY2.md 在例行检查中也再次强调单机模式下确认N8N_DEFAULT_BINARY_DATA_MODEfilesystem这样运行数据不会让 SQLite 无限膨胀而在队列模式下二进制数据刻意放在 Postgres 中靠执行数据清理来约束体积。上线后的验证清单SINGLE_MODE.md 提供了一组从内到外、层层递进的验证命令docker compose ps # caddy n8n 均为 Up docker compose exec n8n wget -qO- http://localhost:5678/healthz # 内部验证 n8n 进程本身存活 docker compose logs caddy | grep -i certificate obtained # 证书已签发首次启动约 1–2 分钟 curl -fsS --retry 5 --retry-delay 10 https://fqdn/healthz # 公网验证重试以覆盖 ACME 延迟这里有一个非常实用的排障心智模型首次启动时 TLS 失败通常意味着证书还没签发完而不是 n8n 挂了。ACME 挑战需要先解析 DNS、打通 80/443 端口整个过程可能耗时 1–2 分钟在此期间公网https://请求会报 TLS 错误——这是证书仍在签发中的信号不是服务故障。所以先用docker compose exec n8n wget -qO- http://localhost:5678/healthz从内部把n8n 是否存活和TLS 是否就绪两个问题分开验证。SKILL.md 第 7 步在此基础上补充了两个细节/healthz只能证明进程可达/healthz/readiness还能确认数据库已连接并完成迁移——排查启动循环boot loop时用它打开https://fqdn后应立即创建 owner 账号谁先完成注册表单谁就拥有这个实例Whoever completes that signup form first claims the instance。一个暴露的、未被认领的实例是一场竞速因此在分享 URL 之前就要注册并开启 2FA。结合模板深入理解单机模式的完整配置为了让上面散落的要点形成一个可落地的整体下面把 docker-compose.single.yml 中的关键环境变量分组解读这些就是单机模式的生产级默认值公网 URL / 反向代理组N8N_HOST${SUBDOMAIN}.${DOMAIN_NAME}、N8N_PROTOCOLhttps、N8N_EDITOR_BASE_URLhttps://${SUBDOMAIN}.${DOMAIN_NAME}/、WEBHOOK_URLhttps://${SUBDOMAIN}.${DOMAIN_NAME}/这一组变量保证 n8n 对外生成的 webhook 与 OAuth 回调 URL 都是公网 HTTPS 地址。SECURITY.md 警告这些没配好的话n8n 会发出去http://localhost:5678/...这种无法访问的链接。N8N_PROXY_HOPS1告诉 n8n 信任一层反向代理Caddy注入的X-Forwarded-*头配合 Caddyfile 中的header_up指令完成链路。加密与安全默认值N8N_ENCRYPTION_KEY${N8N_ENCRYPTION_KEY}显式从.env注入绝不依赖自动生成。N8N_SECURE_COOKIEtrue登录 cookie 仅走 HTTPS。N8N_DIAGNOSTICS_ENABLEDfalse、N8N_PERSONALIZATION_ENABLEDfalse、N8N_HIRING_BANNER_ENABLEDfalse关闭遥测与个性化。N8N_BLOCK_ENV_ACCESS_IN_NODEtrueCode 节点/表达式无法读取process.env容器内的敏感环境变量。N8N_RUNNERS_ENABLEDtrue把 Code 节点执行移入任务运行器n8n ≥ 2.0 中恒为开启此项为空操作若需真正隔离用N8N_RUNNERS_MODEexternal外置 sidecar 运行器。数据保留与磁盘控制EXECUTIONS_DATA_PRUNEtrue、EXECUTIONS_DATA_MAX_AGE336小时、EXECUTIONS_DATA_PRUNE_MAX_COUNT50000裁剪执行数据限制磁盘/DB 增长以及含 PII 的运行数据保留时长。DAY2.md 说明官方默认值分别为 336 小时 / 10000 条模板显式写出来是为了不依赖隐式默认。N8N_DEFAULT_BINARY_DATA_MODEfilesystem二进制数据落盘。可选开关模板中已注释N8N_PUBLIC_API_DISABLEDtrue不需要公共 REST API 时可打开SECURITY.md 建议配对N8N_PUBLIC_API_SWAGGERUI_DISABLEDtrue一并关闭 API 沙盒页面。对应地.env.single.example 给出了需要在服务器上填写的全部变量DATA_FOLDER绝对路径必须与运行docker compose的目录一致、DOMAIN_NAME/SUBDOMAIN、SSL_EMAIL、GENERIC_TIMEZONEIANA 时区供 Schedule/Cron 节点使用、N8N_IMAGE_TAG建议固定版本而非盲目跟随:latest、以及必须用openssl rand -base64 32现场生成的N8N_ENCRYPTION_KEY占位符REPLACE_WITH_openssl_rand_base64_32。与部署流程的衔接单机模式在技能包中的位置SINGLE_MODE.md 是 n8n-self-hosting 技能包的模式深度文件之一。整体部署编排在 SKILL.md 中顺序为先选模式Rule 0必须问用户而不是猜测→ 密钥卫生Rule 1→ 收集输入 → 预检 → 装 Docker → 放置项目文件 → 填 .env 并生成密钥 → 防火墙 → 启动 → 验证 → 交接。单机模式对应其中的具体动作模板文件是 docker-compose.single.yml部署时改名为docker-compose.yml配套 .env.single.example 复制为.env预检环节SKILL.md 第 1 步特别强调DNS 的 A 记录必须已指向服务器且 80/443 端口从公网可达——这是 Caddy 拿不到证书的头号原因也是单机模式看起来坏了最常见的根因检查时不能只看宿主机防火墙还要看云厂商安全组启动前必须执行grep REPLACE_WITH_ .env确认没有遗漏占位符——残留的占位符会变成字面密码导致 Postgres/n8n 连接失败.env权限收紧为chmod 600并把加密密钥抄送到盒子之外的安全位置。上线后的日常运维更新镜像、备份、恢复不在本文展开由 DAY2.md 专门覆盖其备份金律与本文高度相关密钥与数据要一起备份才有效——没有密钥的数据库备份是不可解密的单机模式下备份 快照n8n_data卷 离线保存.env。总结单机模式是自托管 n8n 的起点与默认答案一个进程、SQLite、一个可备份的卷、Caddy 自动 TLS构成了一套运维负担极低的完整实例。它的核心决策点有三模式选择看负载与扩展预期数据库选型看增长预期迁移走导出-重指向-导入的官方路径并全程锁定加密密钥。当你发现执行开始排队、长任务阻塞 UI、或需要跨机扩展时再按 QUEUE_MODE.md 升级到队列模式也不迟——而那时你已经拥有了一套可靠的单机基线。【免费下载链接】n8n-mcpA MCP for Claude Desktop / Claude Code / Windsurf / Cursor to build n8n workflows for you项目地址: https://gitcode.com/GitHub_Trending/n8/n8n-mcp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考