ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

n8n 部署教程:用 Docker Compose 三步搭建自托管工作流自动化平台

n8n 部署教程:用 Docker Compose 三步搭建自托管工作流自动化平台 1. 为什么选n8n从“写脚本”到“搭积木”的转变我平时的工作离不开自动化以前接到一个“把十几个API串起来定时跑数据”的需求第一反应是写Python脚本。写到最后你会发现真正耗时间的不是业务逻辑而是轮子周边的杂活重试机制要自己写、失败告警要自己写、日志要自己处理、参数改一个就得重新部署。直到有一次被同事按头试了一下n8n我才反应过来——这类活儿本来就该用可视化工作流搞定。n8n是一个开源的工作流自动化工具核心概念是节点Node和执行Execution你把各种服务抽象成一个个节点拖到画布上连起来数据就会沿着连线自动流转。它跟Zapier这类商业产品定位相似但最大的区别是n8n可以完全自托管数据不出自己的服务器而且社区版免费没有按次计费的压力。我之所以在这篇文章里专门讲部署方案是因为很多人在“用n8n”之前先卡在了“装n8n”这一步。官方文档虽然写了三四种安装方式但选项太多反而让新手不知道怎么选。这篇文章我就直接给出我最常用的那套方案不需要折腾Node.js环境不用编译源码只要服务器上有Docker按下面的步骤走5分钟内就能看到一个能正常登录、能创建第一个工作流的n8n后台。2. 部署方案选型为什么我最终锁定了Docker Compose2.1 三种主流部署方式的对比n8n官方提供了几种部署方式npm全局安装、Docker容器、以及n8n Cloud云服务。如果你只是为了在本地电脑上体验一下npm install -g n8n 确实最快但如果你打算把它作为一个长期运行的服务npm方式就有几个绕不开的问题Node.js版本要自己维护、进程守护要自己做、升级时容易碰到依赖冲突。n8n Cloud倒是省心但它是付费服务而且对于习惯把数据握在自己手里的团队来说托管模式不一定符合需求。对比下来Docker方案是自托管场景下投入产出比最高的选择对比项npm安装Docker容器n8n Cloud环境隔离依赖系统Node环境完全隔离无需关心升级回滚手动管理依赖易冲突镜像版本切换平台托管数据持久化默认目录卷挂载平台处理成本服务器费用服务器费用按席位订阅上手门槛需要会配PM2/Linux服务会一条命令即可最低私有化部署支持支持不支持我最终选Docker Compose而不是单条docker run原因只有一个可维护性。docker run一条命令就能起容器但环境变量一多命令会变得特别长而且不好改、不好备份。Compose文件是纯文本放在项目目录里改配置、看版本、迁移服务器都很直观。2.2 单机模式与队列模式的选择逻辑n8n分两种运行模式单机模式默认和队列模式Main Worker。单机模式下工作流调度和执行都在同一个进程里完成配置简单适合个人使用、小团队内部工具以及日均执行量在几千次以内的场景。队列模式则需要额外引入RedisMain节点负责任务调度和Webhook接收Worker节点负责实际执行适合企业级、高并发、需要水平扩展的场景。这篇博文里的3步部署方案基于单机模式。其实很多人一开始就奔着“企业级部署”去上Redis结果配置复杂度上去了收益却感知不到。我个人的建议是先把单机模式跑起来等真的遇到执行瓶颈或者需要独立扩展Worker时再平滑迁移到队列模式。n8n的迁移路径很友好后续我会单独写一篇专门讲队列模式切换的文章。2.3 服务器配置和操作系统前置要求部署n8n不需要太高配置2核4G的云主机就能跑得很舒服最低1核1G也能启动但跑复杂工作流时内存会紧张。操作系统方面Debian/Ubuntu/CentOS都能跑但对小白最友好的还是安装了Docker和Docker Compose插件的Ubuntu 22.04以上版本。安装Docker这一步我不展开讲了不同发行版命令略有差异。你只要确认服务器上执行docker --version和docker compose version有输出这就算准备好了。如果还没装Docker去Docker官网找对应系统的安装步骤用官方源安装不要图省事用网上到处抄的脚本。提示如果你计划把n8n放到生产环境长期使用建议服务器的时区提前设置为Asia/Shanghai避免后面所有任务定时时间差8小时这个坑我踩过。3. 核心参数说明部署前必须理解的几个配置项在做那3步实操之前我先把docker-compose.yml里几个关键参数讲明白。理解这些参数的含义比直接复制粘贴更重要因为你以后一定会根据实际场景去调整它们。3.1 端口映射和N8N_PORTn8n容器默认监听5678端口。在docker-compose.yml里ports: - 5678:5678表示把宿主机的5678端口映射到容器的5678端口。如果你服务器上5678已经被占用了可以改成别的比如8080:5678这样你访问服务器IP的8080端口时实际访问的是容器内的5678端口。端口映射是Docker最基础的机制左边是宿主机端口右边是容器端口这个左右关系别搞反了。3.2 持久化挂载与数据安全容器是“一次性”的容器一删里面所有的数据就没了。所以n8n的数据必须持久化到宿主机。官方推荐的做法是用Docker命名卷n8n_data:/home/node/.n8n。这个卷会由Docker统一管理备份时需要用docker run --rm -v n8n_data:/data -v $(pwd):/backup alpine tar czf /backup/n8n_data.tar.gz -C /data .这样的命令导出。如果你更习惯传统的方式也可以直接绑定宿主机目录/opt/n8n_data:/home/node/.n8n。这样备份时直接打包宿主机目录就行对运维更友好。我个人用后者多一点因为排查问题的时候可以快速看到n8n的配置文件内部长什么样。3.3 加密密钥与安全凭证这是最容易忽略但最重要的参数。n8n会把你在界面里配置的所有Credentials比如数据库密码、API Key加密后存到数据库里加密用的密钥就来自N8N_ENCRYPTION_KEY这个环境变量。如果这个变量值改动了或者容器重建后没有保持同一个值n8n将无法解密之前保存的Credentials所有需要鉴权的节点都会报错。你可以在服务器上执行openssl rand -hex 24生成一个随机字符串把它填到配置里然后把这份配置保存好。我一般会和数据库备份放在一起万一服务器挂了迁移到新机器时用同一个密钥启动旧工作流和凭据全部完好无损。3.4 时区参数与定时任务的关系n8n有定时触发节点Schedule Trigger默认使用UTC时区计算触发时间。如果你不设置时区想设定每天上午9点执行结果会发现它在下午5点才跑因为UTC比北京时间慢8个小时。这个坑特别隐蔽因为界面上的时间显示可能是对的真正触发时却差了一大截。所以完整配置里一定要带GENERIC_TIMEZONEAsia/Shanghai和TZAsia/Shanghai。3.5 语言设置与汉化n8n最新版本已经内置了社区汉化包设置语言环境变量N8N_DEFAULT_LOCALEzh之后界面会切换为中文。不过要提醒一句n8n现在的国际化翻译并不是100%全覆盖部分边缘节点或新功能可能仍显示英文但这完全不影响使用。另外你还可以在用户设置界面手动切换语言不一定非要依赖环境变量。4. 三分钟三步部署实操从零到可用的n8n服务现在进入正题按下面三步操作。4.1 第一步准备目录和docker-compose.yml登录到你的服务器新建一个工作目录比如/opt/n8n。进入这个目录创建一个名为docker-compose.yml的文件把下面这份配置粘贴进去然后根据注释调整你需要改动的地方services: n8n: image: docker.n8n.io/n8nio/n8n:latest container_name: n8n restart: unless-stopped ports: - 5678:5678 environment: - N8N_PORT5678 - N8N_HOST你的IP或域名 - N8N_PROTOCOLhttp - N8N_ENCRYPTION_KEY替换成openssl rand -hex 24生成的值 - N8N_USER_MANAGEMENT_JWT_SECRET替换成另一个随机字符串 - GENERIC_TIMEZONEAsia/Shanghai - TZAsia/Shanghai - N8N_DEFAULT_LOCALEzh volumes: - /opt/n8n_data:/home/node/.n8n这份配置的核心逻辑不复杂用官方镜像起一个名为n8n的容器端口映射到宿主机5678时区设置为北京时间语言设置为中文数据保存在宿主机/opt/n8n_data目录下。N8N_HOST这里有几个不同的用法。如果你是本地测试直接填服务器IP如果你已经把域名解析到这台服务器就填域名后续要做HTTPS的话N8N_PROTOCOL要改成https并且配合反向代理一起使用。这个参数直接影响了n8n生成的Webhook回调地址填错了会导致别人调你的Webhook时访问到错误URL。4.2 第二步启动容器并验证状态配置文件准备好之后在/opt/n8n目录下执行docker compose up -d首次执行会拉取镜像拉取时间取决于服务器带宽一般几百MB的镜像网速正常的话一两分钟就完成了。拉完之后-d参数让容器在后台运行。查看容器启动情况docker compose ps docker compose logs -f看到日志里出现n8n ready on 0.0.0.0:5678这类输出就说明服务已经起来了。接着在浏览器里访问http://你的服务器IP:5678应该能看到n8n的欢迎页面。第一次访问会让你创建管理员账号这个账号用于登录后台和管理权限。创建好账号后你会进入n8n的主界面左侧有节点面板中间是画布右上角有执行按钮。到这里n8n已经能正常使用了。4.3 第三步验证健康状态并设置开机自启n8n提供了一个健康检查端点路径是/healthz。在服务器上执行curl http://localhost:5678/healthz返回ok就表示服务正常。这个端点可以直接挂到监控系统上也可以通过Uptime Kuma这类工具定时探测服务挂了自动告警。关于开机自启docker-compose.yml里已经设置了restart: unless-stopped意思是容器异常退出会自动重启服务器重启后Docker服务会拉起容器。这个参数保证了n8n不是一个“人走了服务就停”的一次性玩具而是一个具备基本自愈能力的常驻服务。整套流程走完你会发现确实只有3步写配置、起容器、开网页。我实测从新建目录到浏览器打开登录页耗时基本在5分钟左右不含镜像拉取时间这也是我说“全网最简单”的底气。5. 部署完必须做的几件事汉化调整、Credentials配置和公网访问容器起来了登录页能打开了这只是万里长征第一步。下面这几个配置属于“部署完成后马上要处理”的事项直接影响后续使用体验。5.1 中文界面进一步确认虽然环境变量里设了N8N_DEFAULT_LOCALEzh但个别情况下首次登录可能还是英文。这通常是因为浏览器缓存了语言偏好或者n8n的用户级设置覆盖了默认值。解决办法是点击右上角头像进入Settings-Personal在Language选项里手动选择Chinese (Simplified)或zh保存后刷新页面即可。这里我想多说一句不要因为界面部分英文就焦虑。n8n的工作流画布核心操作路径经过汉化后已经非常直观了。就算偶尔遇到某个新功能的提示仍是英文结合上下文和节点图标基本能猜出意思。真要较真的话可以到n8n的GitHub仓库看下翻译进度社区一直在持续补充。5.2 Credentials的正确配置姿势n8n工作流里的每个集成节点比如HTTP Request、PostgreSQL、OpenAI、Slack等都需要对应的Credentials才能发起调用。点击左侧的Credentials菜单进入添加凭据会看到一长串服务类型列表。以Http Request节点为例你可以在Credentials里选择Header Auth填上对方API要求的请求头字段名和值。以OpenAI节点为例则需要填OpenAI的API Key。这里最需要注意的是所有Credentials在保存时都会被n8n用N8N_ENCRYPTION_KEY加密后入库所以千万不要在创建完Credentials后再去修改加密密钥否则所有已保存的凭据都会变成不可解密的乱码。如果你要迁移服务器除了备份数据库和卷数据之外务必一并备份docker-compose.yml里那串加密密钥。没有它即使数据迁移成功n8n里的Credentials也会全部失效——这个教训来自我一个朋友他把数据搬了新机器唯独忘了搬密钥结果所有工作流的鉴权配置全部重新填了一遍。5.3 反向代理与HTTPS配置建议直接通过IP和端口访问n8n可以用于测试但生产环境我强烈建议用反向代理套一层HTTPS。原因很简单n8n登录之后有Bearer Token、密码等敏感信息明文HTTP传输完全不安全而且很多平台比如企业微信、钉钉、飞书的机器人Webhook回调地址要求必须是HTTPS公网地址。我用得最顺手的是Caddy因为它自动申请和续期SSL证书配置也极短。在Caddyfile里写n8n.example.com { reverse_proxy 127.0.0.1:5678 }然后执行caddy reloadHTTPS就会自动生效。当然用Nginx也能做只是需要自己管理证书稍微繁琐一点。配置好之后记得把docker-compose.yml里的N8N_HOST改成你的域名N8N_PROTOCOL改成https最后docker compose up -d重建容器让n8n生成正确的Webhook回调地址。5.4 公网安全注意事项这里必须跟你强调一下安全边界。不要把n8n的5678端口直接暴露在公网上哪怕你设置了强密码也不行。n8n的登录认证和授权机制是针对常规使用设计的端口暴露越大被扫描爆破的攻击面就越大。最稳妥的做法是服务器安全组只放行反向代理需要的端口比如80、443n8n容器只允许本机反向代理访问不向外网开放如果团队人数少可以在反向代理层加一层Basic Authn8n生产环境务必开启“用户管理”里的强密码策略和登录失败限制把n8n当内网工具用一切都是可控的一旦暴露到公网安全方案就得当成正经事来对待。6. 常见报错与排查部署后最容易踩的几个坑按上面的步骤操作大概率不会出问题。但如果你的环境略有不同下面几个场景是我实际遇到最多的问题列一个速查表方便你对照解决。现象可能原因解决办法容器一直重启日志提示Permission denied宿主机目录权限不对执行chown -R 1000:1000 /opt/n8n_data后重启容器浏览器无法访问5678端口服务器安全组/防火墙未放行到云控制台放行端口或调整iptables规则定时任务执行时间差了8小时未设置GENERIC_TIMEZONE在环境变量中增加GENERIC_TIMEZONEAsia/Shanghai别人调用Webhook返回404N8N_HOST或N8N_PROTOCOL配置不对修改环境变量并重启容器确保回调地址可公网访问修改N8N_ENCRYPTION_KEY后Credentials全部失效加密密钥不匹配恢复原密钥或陪一次重新配置所有凭据的代价日志报“listening on 0.0.0.0:5678 should bind to 127.0.0.1”容器端口暴露方式不安全改用127.0.0.1:5678:5678后加反向代理工作流执行时内存不足导致崩溃容器内存限制太小在compose里增加mem_limit: 1g或升级服务器配置升级版本后部分节点报错版本之间节点行为有变化升级前先备份/opt/n8n_data目录必要时回滚镜像版本除了表格里的场景还有两个细节值得展开。第一个是从数据库角度说n8n默认使用SQLite存储配置和执行历史数据。单机模式下这完全够用但如果你的工作流执行频率特别高、执行历史攒得特别多SQLite数据库文件会越来越大访问也会变慢。此时可以定期在n8n后台的Settings - Usage里清理执行历史或者干脆把数据库切换成PostgreSQL。切换方式需要在docker-compose里多配置一个PostgreSQL服务然后通过DB_TYPEpostgresdb等环境变量指定连接信息这个改动不复杂数据量上来了自然就知道什么时候该切了。第二个是与AI能力结合的姿势。n8n上有现成的LangChain相关节点可以用来搭建AI Agent工作流。部署这件事本身和AI功能是解耦的你只需要在Credentials里配置好模型提供方的API Key然后在画布上拖入OpenAI或LangChain系列节点输入你的Prompt就能实现一个能自动调用工具、能串联外部数据源的智能体。对于想用n8n结合大模型做自动化尝试的人来说部署方案完全不冲突甚至可以说“先有一台稳定的n8n服务AI玩法才有施展空间”。7. 写到最后的几点实践心得按照这套3步方案部署完n8n之后老实说我自己也经历了从“验证可行性”到“日常依赖”的过程。现在我的服务器上n8n承担着一大堆定时任务和Webhook服务包括自动拉取数据入库、定期给团队发摘要消息、甚至还有几个简单的AI Agent在做信息收集和整理工作。整体跑下来非常稳定Docker容器几个月不重启一次都是常态。如果让我给刚接触n8n的你一条最实用的建议那就是不要一上来就追求“把工作流设计得多么复杂”先把一个最简单的HTTP请求节点跑通把一个定时任务跑通把一个Webhook接入跑通。这三板斧学会了n8n的绝大多数能力你都具备使用基础了。剩下的无非是遇到一个需求去节点库里搜索一个能完成的节点然后连线而已。最后再分享一个我自己的习惯我的docker-compose.yml和/opt/n8n_data目录会定期一起打包备份。备份这件事看似简单但在你真正遇到服务器宕机、数据丢失的时候一个可恢复的备份比任何花哨的功能都值钱。n8n的部署确实简单但数据无价备份要趁早。
返回列表