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 部署有三种方式:
- subfolderWithSSL
- withPostgres
- 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
注意事项:
-
时区环境变量一定要设置,默认为:
America/New_York
,根据需求设置为:Asia/Shanghai
,不然 n8n 中配置的计划任务到时间不会执行。参考链接:Timezone and localization environment variables | n8n Docs -
计划任务设置,参考链接: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
参考文献
