n8n 项目部署
【摘要】 一、功能概览类别说明可视化编排拖拽节点构建工作流,支持分支、合并、循环、错误处理触发方式Webhook、定时、手动、应用事件、邮件、聊天等多种触发集成数量内置数百种应用和服务节点,另有通用 HTTP 请求节点对接任意接口代码能力代码节点支持编写 JavaScript,也可使用 Python,复杂逻辑不受限AI 能力提供 AI Agent、对话模型、向量库、记忆等节点,用于搭建 AI 工作流...
一、功能概览
| 类别 | 说明 |
|---|---|
| 可视化编排 | 拖拽节点构建工作流,支持分支、合并、循环、错误处理 |
| 触发方式 | Webhook、定时、手动、应用事件、邮件、聊天等多种触发 |
| 集成数量 | 内置数百种应用和服务节点,另有通用 HTTP 请求节点对接任意接口 |
| 代码能力 | 代码节点支持编写 JavaScript,也可使用 Python,复杂逻辑不受限 |
| AI 能力 | 提供 AI Agent、对话模型、向量库、记忆等节点,用于搭建 AI 工作流 |
| 凭据管理 | 凭据加密存储,可在工作流间复用 |
| 团队协作 | 用户与项目管理、工作流共享、版本历史(部分功能随版本与许可而不同) |
| 扩展性 | 支持社区节点,以及通过队列模式水平扩展 |
二、部署方案选择
| 方案 | 适用场景 | 说明 |
|---|---|---|
| Docker 单容器 + SQLite | 本地试用、个人学习 | 最简单,但不适合正式使用 |
| Docker Compose + PostgreSQL | 个人与小团队生产环境 | 推荐,数据可靠,便于备份与迁移 |
| 队列模式(主进程 + Redis + 工作进程) | 高并发、执行量大、长任务较多 | 需要 PostgreSQL 与 Redis,可水平扩展 |
| npm 安装 | 不使用 Docker 的特殊场景 | 需自行管理 Node.js 版本与进程守护 |
| 官方云服务 | 不想自己运维 | 不属于自托管,本文不涉及 |
建议:一开始就用 PostgreSQL。官方文档指出 SQLite 适合试用,日后切换数据库并不能顺畅带走数据。
三、环境要求
- Linux 服务器(也可在 macOS 或 Windows 的 Docker 环境中试用)
- Docker Engine 与 Docker Compose 插件
- 内存:个人使用 1GB 起步,建议 2GB 以上;工作流多、数据量大时适当增加
- 域名并解析到服务器(接收外部 Webhook 或公网访问时必须)
- 端口:n8n 默认监听 5678,生产环境建议只在本机监听,由反向代理对外提供 443
四、Docker Compose + PostgreSQL 部署(推荐)
4.1 创建目录
mkdir -p ~/n8n && cd ~/n8n
4.2 生成加密密钥
openssl rand -hex 32
把输出保存好,作为 N8N_ENCRYPTION_KEY。
这个密钥极其重要:n8n 用它加密所有已保存的凭据。密钥丢失或更换后,已保存的凭据将全部无法解密。请保存到密码管理器,并与数据库备份分开存放。
4.3 编写 .env
# .env
POSTGRES_USER=n8n
POSTGRES_PASSWORD=请替换为强密码
POSTGRES_DB=n8n
N8N_ENCRYPTION_KEY=填入上一步生成的密钥
N8N_HOST=你的域名
WEBHOOK_URL=https://你的域名/
GENERIC_TIMEZONE=Asia/Shanghai
提醒:
WEBHOOK_URL末尾要带斜杠,且必须是外部实际访问的完整地址。写错的后果是工作流能保存却收不到任何外部回调,而且没有明显报错。.env含有密钥,务必加入.gitignore,不要提交到代码仓库。
4.4 编写 docker-compose.yml
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db-storage:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
ports:
- "127.0.0.1:5678:5678"
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_HOST: ${N8N_HOST}
N8N_PROTOCOL: https
N8N_PORT: 5678
WEBHOOK_URL: ${WEBHOOK_URL}
N8N_PROXY_HOPS: 1
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${GENERIC_TIMEZONE}
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 336
volumes:
- n8n-storage:/home/node/.n8n
volumes:
db-storage:
n8n-storage:
说明:
- 端口只绑定 127.0.0.1,由反向代理接入,避免把 5678 直接暴露到公网。
N8N_PROXY_HOPS: 1表示前面有一层反向代理,使 n8n 正确识别客户端地址和协议。EXECUTIONS_DATA_PRUNE与EXECUTIONS_DATA_MAX_AGE用于自动清理历史执行记录(单位为小时,示例为保留 14 天),防止数据库无限增长。- 镜像地址是镜像仓库路径,不是网页链接。生产环境建议把标签固定为具体版本号,升级时手动修改。
- 如果只是在局域网用 IP 通过 HTTP 访问试用,需要把协议改为 http,并将
N8N_SECURE_COOKIE设为 false,否则登录后会话无法保持。正式环境应使用 HTTPS,并保持安全 Cookie 开启。
4.5 启动
docker compose up -d
docker compose ps
docker compose logs -f n8n
4.6 配置反向代理(Caddy 示例)
在服务器上单独运行 Caddy(或把它加入同一个 Compose),Caddyfile 内容:
你的域名 {
encode zstd gzip
reverse_proxy 127.0.0.1:5678
}
使用 Nginx 时请注意:
- 必须开启 WebSocket 升级支持,否则编辑器的实时执行状态会异常。
- 适当调大请求体大小限制和超时时间,以便接收较大的 Webhook 数据。
4.7 首次初始化
浏览器访问你的域名,首次进入会引导创建所有者账号(邮箱、姓名、强密码)。之后在设置中可邀请其他用户。
五、关键环境变量速查
| 变量 | 作用 | 建议 |
|---|---|---|
| N8N_ENCRYPTION_KEY | 凭据加密密钥 | 必须固定设置并备份,切勿更换 |
| WEBHOOK_URL | 对外生成 Webhook 地址的基础地址 | 使用反向代理时必填,末尾带斜杠 |
| N8N_EDITOR_BASE_URL | 编辑器对外访问地址 | 与对外域名保持一致 |
| N8N_HOST、N8N_PROTOCOL、N8N_PORT | 主机、协议、端口 | 与反向代理对外的访问方式一致 |
| N8N_PROXY_HOPS | 前置代理层数 | 一层反向代理时设为 1 |
| N8N_SECURE_COOKIE | 安全 Cookie | HTTPS 下保持开启 |
| GENERIC_TIMEZONE、TZ | 时区 | 设为本地时区,保证定时触发准时 |
| DB_TYPE 与 DB_POSTGRESDB_* | 数据库连接 | 使用 PostgreSQL |
| EXECUTIONS_DATA_PRUNE、EXECUTIONS_DATA_MAX_AGE | 执行记录清理 | 防止磁盘被执行数据占满 |
| EXECUTIONS_MODE | 执行模式 | 需要扩展时设为 queue |
六、队列模式(可选,用于扩展)
当出现长时间运行的工作流阻塞其他任务、突发 Webhook 请求被丢弃,或单进程处理不过来时,可切换到队列模式。
原理:主进程负责编辑器、接收 Webhook 和调度,实际的工作流执行交给多个工作进程,通过 Redis 队列分发。
要点:
- 必须使用 PostgreSQL,不能使用 SQLite。
- 增加 Redis 服务,并在主进程和工作进程中配置:
EXECUTIONS_MODE=queue
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
- 新增一个或多个工作进程服务,使用同一镜像,启动命令设为
worker:
n8n-worker:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
command: worker
depends_on:
- postgres
- redis
environment:
# 与主进程保持完全一致的数据库、加密密钥与队列配置
EXECUTIONS_MODE: queue
QUEUE_BULL_REDIS_HOST: redis
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
# 其余 DB_* 变量同主进程
volumes:
- n8n-storage:/home/node/.n8n
- 主进程、所有工作进程以及 Webhook 处理进程必须使用相同的
N8N_ENCRYPTION_KEY,否则无法解密凭据。 - 主进程保持单副本;扩容主要靠增加工作进程数量。
- 单主进程的队列模式在自托管下没有许可限制;多主进程等更高级的架构可能涉及企业许可,请查阅官方说明。
七、安全加固
- 保护编辑器:不要把未经保护的 5678 端口暴露到公网,使用 HTTPS 与强密码,启用账号的二步验证(若版本支持),必要时在代理层限制来源 IP。
- 审慎处理 Webhook:Webhook 地址一旦公开就可能被任何人调用,建议给 Webhook 节点配置认证(如请求头令牌或基础认证),并在工作流内校验来源。
- 最小权限凭据:给第三方服务生成专用的、只授予必要权限的密钥,不要使用主账号密钥。
- 谨慎使用高风险节点:执行命令、读写文件等节点能影响服务器本身,团队多人使用时应限制谁能创建和编辑工作流。
- 容器隔离:不要给 n8n 容器挂载不必要的宿主机目录,更不要挂载 Docker 套接字。
- 社区节点风险:社区节点由第三方开发,安装前先审查来源和代码,生产环境谨慎启用。
- 及时升级:关注官方发布说明和安全公告,及时更新。
八、备份与恢复
8.1 必须备份的内容
| 内容 | 说明 |
|---|---|
| PostgreSQL 数据库 | 工作流、凭据(密文)、执行记录、用户等全部业务数据 |
| N8N_ENCRYPTION_KEY | 没有它,数据库里的凭据无法解密 |
| n8n 数据卷 | 包含配置、社区节点等本地数据 |
| .env 与 docker-compose.yml | 部署配置 |
8.2 数据库备份
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > n8n-db-$(date +%F).sql.gz
8.3 工作流与凭据导出(辅助手段)
docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/backup-workflows.json
docker compose exec n8n n8n export:credentials --all --output=/home/node/.n8n/backup-credentials.json
导出的凭据文件仍默认保持加密状态,但同样属于敏感文件,请妥善保管。导出文件可作为额外保险,但不能替代数据库备份。
8.4 恢复与演练
- 部署同版本的 n8n 与 PostgreSQL。
- 导入数据库备份。
- 使用原来的加密密钥启动 n8n。
- 登录检查:凭据能否正常使用、Webhook 地址是否正确生成、定时工作流是否按时触发。
建议定期做一次完整的恢复演练。遵循 3-2-1 原则:3 份副本、2 种介质、1 份异地,备份文件要加密保存。
九、升级与维护
cd ~/n8n
# 升级前先备份数据库
docker compose pull
docker compose up -d
docker image prune
建议:
- 升级前阅读官方发布说明,大版本更新可能带有破坏性变更,应先在测试环境验证。
- 固定镜像版本,不要让 latest 在无意中自动升级。
- 数据库大版本升级需要单独规划迁移。
- 定期检查磁盘占用,确认执行记录清理已生效。
- 监控容器健康状态和日志,为关键工作流配置失败告警。
十、常见问题排查
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| Webhook 地址显示成内网地址或错误端口 | WEBHOOK_URL、N8N_HOST、N8N_PROTOCOL 未正确设置 | 修正后重启,并确认以斜杠结尾 |
| 外部服务调用不通 | 地址写错、代理未转发或防火墙拦截 | 检查域名解析、反向代理与端口 |
| 登录后一直被退回登录页 | 使用 HTTP 访问但启用了安全 Cookie | 改用 HTTPS,或仅在内网测试时关闭安全 Cookie |
| 更换密钥后凭据全部失效 | 加密密钥变化 | 恢复原密钥;没有原密钥则需重新录入凭据 |
| 编辑器实时状态不更新 | 反向代理未支持 WebSocket | 开启 WebSocket 升级 |
| 数据库越来越大 | 执行记录无限累积 | 开启自动清理并缩短保留时间 |
| 定时任务时间不对 | 时区未设置 | 设置时区变量并重启 |
| 队列模式下工作进程空闲或凭据报错 | Redis 配置不一致或密钥不一致 | 核对所有进程的队列与密钥配置 |
| 容器启动后立刻退出 | 数据库未就绪或连接参数错误 | 检查数据库健康状态与密码 |
十一、命令速查
# 启动 / 停止 / 重启
docker compose up -d
docker compose down
docker compose restart n8n
# 日志
docker compose logs -f n8n
# 生成加密密钥
openssl rand -hex 32
# 数据库备份
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > n8n-db-$(date +%F).sql.gz
# 升级
docker compose pull && docker compose up -d
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)