n8n 项目部署

举报
yd_229065422 发表于 2026/11/11 19:48:04 2026/11/11
【摘要】 一、功能概览类别说明可视化编排拖拽节点构建工作流,支持分支、合并、循环、错误处理触发方式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 队列分发。

要点:

  1. 必须使用 PostgreSQL,不能使用 SQLite。
  2. 增加 Redis 服务,并在主进程和工作进程中配置:
EXECUTIONS_MODE=queue
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
  1. 新增一个或多个工作进程服务,使用同一镜像,启动命令设为 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
  1. 主进程、所有工作进程以及 Webhook 处理进程必须使用相同的 N8N_ENCRYPTION_KEY,否则无法解密凭据。
  2. 主进程保持单副本;扩容主要靠增加工作进程数量。
  3. 单主进程的队列模式在自托管下没有许可限制;多主进程等更高级的架构可能涉及企业许可,请查阅官方说明。

七、安全加固

  1. 保护编辑器:不要把未经保护的 5678 端口暴露到公网,使用 HTTPS 与强密码,启用账号的二步验证(若版本支持),必要时在代理层限制来源 IP。
  2. 审慎处理 Webhook:Webhook 地址一旦公开就可能被任何人调用,建议给 Webhook 节点配置认证(如请求头令牌或基础认证),并在工作流内校验来源。
  3. 最小权限凭据:给第三方服务生成专用的、只授予必要权限的密钥,不要使用主账号密钥。
  4. 谨慎使用高风险节点:执行命令、读写文件等节点能影响服务器本身,团队多人使用时应限制谁能创建和编辑工作流。
  5. 容器隔离:不要给 n8n 容器挂载不必要的宿主机目录,更不要挂载 Docker 套接字。
  6. 社区节点风险:社区节点由第三方开发,安装前先审查来源和代码,生产环境谨慎启用。
  7. 及时升级:关注官方发布说明和安全公告,及时更新。

八、备份与恢复

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 恢复与演练

  1. 部署同版本的 n8n 与 PostgreSQL。
  2. 导入数据库备份。
  3. 使用原来的加密密钥启动 n8n。
  4. 登录检查:凭据能否正常使用、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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。