n8n 自动化实战系列001 — n8n 部署篇

n8n 简介

n8n 是一款灵活且强大的开源自动化平台,允许用户以可视化的方式创建和管理复杂的自动化工作流程。通过连接丰富的第三方应用程序和服务,n8n 能帮助个人与团队高效整合、处理和同步数据,实现多端协作。相比于许多封闭式自动化工具,n8n 支持自托管部署,用户不仅能完全掌控数据安全和隐私,还能根据自身需求进行深度定制,突破平台功能的局限。

n8n 拥有活跃的社区,持续提供丰富的第三方 API 节点和插件,极大扩展了其可用性,特别适合需要对接主流海外服务或自有系统的场景。此外,n8n 支持自定义函数、条件逻辑,以及复杂的分支流程设计,既适合自动化新手快速上手,也能满足高级用户和开发者的个性化需求。

本文将深入讲解 n8n 的自托管部署流程,内容涵盖基础安装、核心功能解析及高级配置技巧,帮助读者系统掌握并高效应用这一自动化神器。在后续系列文章中,木子还将分享《n8n 自动化实战:全球最新 IT 资讯采集与一键发布到 WordPress》《n8n 自动化实战:全球最新 IT 资讯采集与自动推送至微信公众号》等实用案例,带领大家快速上手 n8n 的操作界面与工作流设计。更多高阶玩法与应用技巧,敬请关注,让我们一起逐步解锁自动化的无限可能。

n8n 部署方式

n8n 提供两种版本供用户选择:

  • 云服务版:由官方提供的在线云端服务,用户只需在官网注册账号即可使用,适合无需自行维护的用户,但需按套餐付费。官方链接:Powerful Workflow Automation Software & Tools – n8n
  • 自托管版:作为开源项目,n8n 支持用户自行部署。您可以下载源码自行编译,或直接使用官方发布的 Docker 镜像,建议直接通过 Docker 进行部署,自主可控。GitHub 仓库:GitHub – n8n-io/n8n

n8n 的部署方式有很多种,它支持 Docker-compose、K8S、docker-caddy 等,详见:GitHub – n8n-io/n8n-hosting
木子这里以 Docker Compose 方式部署为例,进行讲解。

Docker Compose 部署

Docker Compose 部署有三种方式:

  1. subfolderWithSSL
  2. withPostgres
  3. withPostgresAndWorker

和官方提供的 yaml 文件有所不同,木子这里将 subfolderWithSSL 与 withPostgres、withPostgresAndWorker 方案结合。

说明: 基于前期构建的 traefik 网关,详见: DIY NAS系列12 — Traefik 出口网关配置
docker-compose.yaml 文件中,会对重要的配置进行说明,因个人网络环境等不同,需要根据自身实际情况调整配置。

withPostgres

部署需要用到的文件包括:

  • .env:配置数据库账号、密码环境变量。
  • docker-compose.yml:n8n、pg、redis 配置文件。
  • init-data.sh:数据库初始化文件。

n8n 环境变量很多,详细参考链接:Environment Variables Overview | n8n Docs

# n8n docker-compose 配置文件
[root@ai-server-001 n8n]# cat > docker-compose.yaml << \EOF
services:
  # PG 数据库
  postgres:
    image: postgres:16
    container_name: n8n-postgres-001
    networks:
      - traefik_net
    restart: always
    environment: # 环境变量,从 .env 文件获取
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_NON_ROOT_USER
      - POSTGRES_NON_ROOT_PASSWORD
    volumes:
      - /etc/localtime:/etc/localtime:ro # 时区文件,需要在环境变量设置 GENERIC_TIMEZONE 生效
      - /data/n8n/pg_storage:/var/lib/postgresql/data # 数据库持久化
      - /data/n8n/init-data.sh:/docker-entrypoint-initdb.d/init-data.sh # 初始化数据库
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10
  # n8n 服务
  n8n:
    image: docker.n8n.io/n8nio/n8n:1.97.1
    container_name: n8n-001
    networks: # 网络配置
      - traefik_net
    restart: always
    environment:
      # 连接 PG 数据库相关设置
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} # 取 .env 文件变量值
      - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
      - N8N_SECURE_COOKIE=false # 确保 cookie 仅通过 HTTPS 发送,从而增强安全性。默认为 true
      - N8N_DEFAULT_LOCALE=zh-CN # 设置语言为中文(在没有挂载中文语言包的情况下,默认英文不需要设置)
      - N8N_RUNNERS_ENABLED=true # 设置任务运行器启动
      - N8N_RUNNERS_LAUNCHER_LOG_LEVEL=info # 设置任务运行器日志级别
      - GENERIC_TIMEZONE=Asia/Shanghai # 时区设置很重要,在做定时任务的时候,会根据设定的时区执行。
      - N8N_HOST=https://n8n.rockylinux.cn # 指定域名
    ports:
      - 5678:5678 # Web 端口
    links:
      - postgres # 链接 PG 数据库服务
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/n8n/n8n_storage:/home/node/.n8n # 用户数据存放位置,npm 社区节点包也安装在此目录
      - /data/n8n/n8n_chinese:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist # 中文语言包设置
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik_net
      - traefik.http.routers.n8n.rule=Host(`n8n.rockylinux.cn`)
      - traefik.http.routers.n8n.entrypoints=websecure
      - traefik.http.routers.n8n.tls.certresolver=myresolver
      - traefik.http.services.n8n.loadbalancer.server.port=5678
    depends_on:
      postgres:
        condition: service_healthy # PG 服务健康后,启动 n8n 服务
networks:
  traefik_net:
    external: true
EOF

# 环境变量文件
[root@ai-server-001 n8n]# cat .env
# PG 超级管理员用户
POSTGRES_USER=user001
# PG 超级管理员密码
POSTGRES_PASSWORD=spxxxx5XOM
# n8n 数据库
POSTGRES_DB=n8n
# n8n 连接 PG 使用的用户
POSTGRES_NON_ROOT_USER=user002
# n8n 连接 PG 使用的用户密码
POSTGRES_NON_ROOT_PASSWORD=0IxxxxBphC
# 设置自定义加密密钥,主要用于 n8n 加密凭证,并存储至PG。
ENCRYPTION_KEY=Y3xxxx2ZFn

# 加密密钥存放在 /home/node/.n8n/config 文件中
[root@ai-server-001 n8n]# cat config
{
        "encryptionKey": "gv0qRprdj8OXQR7LeNstRflQbx9MFcpk"
}

# PG 数据库初始化文件
# init-data.sh 最好通过链接下载,有时候复制、粘贴会出现数据库启动异常的情况。
[root@ai-server-001 n8n]# cat > init-data.sh << \EOF
#!/bin/bash
set -e;

if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then
        psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
                CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
                GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER};
                GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER};
        EOSQL
else
        echo "SETUP INFO: No Environment variables given!"
fi
EOF

# 设置可执行权限
[root@ai-server-001 n8n]# chmod +x init-data.sh

# 因为启动 n8n 服务时,如果没有设置目录权限,会出现报错。可以先临时设置 /data/n8n/n8n_storage 目录权限为 777
[root@ai-server-001 n8n]# chmod -R 777 /data/n8n/n8n_storage

# 启动 n8n & PG 服务
[root@ai-server-001 n8n]# docker compose up -d

withPostgresAndWorker

withPostgresAndWorker 与 withPostgres 的主要区别在于,前者对 n8n 的 master 节点和 worker 节点进行了拆分,并引入了 Redis 作为中间件,用于缓存 n8n 的临时数据。通过这种架构拆分,可以有效提升 n8n 在高并发场景下的任务处理能力和整体系统的吞吐量。

[root@ai-server-001 n8n]# cat > docker-compose.yml << \EOF
# Master 节点与 Worker 节点公共配置
x-shared: &shared
  restart: always
  image: docker.n8n.io/n8nio/n8n:1.97.1
  networks:
    - traefik_net
  environment:
    - DB_TYPE=postgresdb
    - DB_POSTGRESDB_HOST=postgres
    - DB_POSTGRESDB_PORT=5432
    - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
    - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
    - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
    - EXECUTIONS_MODE=queue
    - QUEUE_BULL_REDIS_HOST=redis
    - QUEUE_HEALTH_CHECK_ACTIVE=true
    - N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
    - N8N_SECURE_COOKIE=false
    - N8N_DEFAULT_LOCALE=zh-CN
    - N8N_RUNNERS_ENABLED=true
    - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
    - N8N_RUNNERS_LAUNCHER_LOG_LEVEL=info
    - GENERIC_TIMEZONE=Asia/Shanghai
    - N8N_HOST=https://n8n.rockylinux.cn
  links:
    - postgres
    - redis
  volumes:
    - /etc/localtime:/etc/localtime:ro
    - /data/n8n/n8n_storage:/home/node/.n8n
    - /data/n8n/n8n_chinese:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist
  depends_on:
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

services:
  postgres:
    image: postgres:16
    container_name: n8n-postgres-001
    networks:
      - traefik_net
    restart: always
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
      - POSTGRES_NON_ROOT_USER
      - POSTGRES_NON_ROOT_PASSWORD
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/n8n/pg_storage:/var/lib/postgresql/data
      - /data/n8n/init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 5s
      timeout: 5s
      retries: 10
  # 这里需要用到 Redis 进行临时数据存储
  redis:
    image: redis:6-alpine
    container_name: n8n-redis-001
    networks:
      - traefik_net
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/n8n/redis_storage:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10

  # Master 节点配置
  n8n-master-001:
    <<: *shared
    container_name: n8n-master-001
    ports:
      - 5678:5678
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik_net
      - traefik.http.routers.n8n-master-001.rule=Host(`n8n.rockylinux.cn`)
      - traefik.http.routers.n8n-master-001.entrypoints=websecure
      - traefik.http.routers.n8n-master-001.tls=true
      - traefik.http.routers.n8n-master-001.service=n8n-master-001
      - traefik.http.routers.n8n-master-001.middlewares=SecHeaders@file,AllowIPList@file
      - traefik.http.services.n8n-master-001.loadbalancer.server.port=5678
  # Worker 节点配置
  n8n-worker-001:
    <<: *shared
    container_name: n8n-worker-001
    command: worker
    depends_on:
      - n8n-master-001

networks:
  traefik_net:
    external: true
EOF

# 环境变量文件 & init-data.sh 与 withPostgres 模式部署相同(略)

# 配置完成,启动服务
[root@ai-server-001 n8n]# docker compose up -d

注意事项:

  1. 时区环境变量一定要设置,默认为:America/New_York,根据需求设置为:Asia/Shanghai,不然 n8n 中配置的计划任务到时间不会执行。参考链接:Timezone and localization environment variables | n8n Docs

  2. 计划任务设置,参考链接:Schedule Trigger node documentation | n8n Docs

中文语言包

第三方中文语言包:GitHub – other-blowsnow/n8n-i18n-chinese: n8n 配置多语言

# 克隆后,参考 withPostgres 中的配置说明,挂载汉化包即可
[root@ai-server-001 n8n]# git clone https://github.com/other-blowsnow/n8n-i18n-chinese.git

n8n 初始化

如果没有添加中文语言包,默认是英文界面。创建的第一个账号即管理员账号。非企业版添加用户只能够通过邮箱连接激活。企业版支持 SAML 2.0 和 LDAP 认证。

初始化完成以后,需要通过邮件激活付费功能。

输入邮箱,点击“向我发送免费许可证密钥”,邮箱查收密钥,在下图中粘贴密钥,即可解锁付费功能。
点击 n8n 左下角,用户“…”,打开设置界面,如下图所示激活即可。

激活成功

安装节点

n8n 的节点分为两大类:内置节点社区节点

  • 内置节点:由 n8n 官方团队默认集成在平台中的节点,涵盖了常用的应用、工具和自动化操作,例如:HTTP Request、Webhook、Gmail、Notion、Google Sheets 等,满足大多数常见的自动化需求。详见:n8n Integrations Documentation and Guides | n8n Docs
  • 社区节点:由 n8n 社区开发者贡献的第三方节点,通常用于对接更多小众或新兴的服务、API 和特殊场景。社区节点能够大幅拓展 n8n 的适用范围,用户可以通过官方文档或社区市场(n8n-nodes)查找和安装这些节点,也可以自行开发自定义节点,实现个性化的功能扩展。支持通过 Web 界面或 CLI 工具安装。安装方法可参考官方文档:Install and manage community nodes | n8n Docs

通过灵活组合内置节点与社区节点,用户可以快速搭建横跨各类服务与数据源的自动化工作流,满足各类定制化需求。

这里以安装 n8n-nodes-evolution-api 社区节点为例,可在 n8n 的“安装社区节点”界面中,打开 n8n 社区节点包搜索 (NPM),浏览并选择所需节点,按提示完成安装即可。

输入包名:n8n-nodes-evolution-api,点击“安装”。

安装完成。点击“…”,可以更新或卸载社区节点。

常用插件

全局变量插件:n8n-nodes-globals – npm
语音转换插件:n8n-nodes-elevenlabs – npm
社区官方语音转换插件:@elevenlabs/n8n-nodes-elevenlabs – npm
使用 Puppeteer 实现浏览器自动化插件:n8n-nodes-puppeteer – npm

参考文献

[1] 官方部署仓库
[2] 官方工作流

Avatar photo

关于 木子

Email: [email protected] 微信:rockylinuxcn QQ: 2306867585
Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇