n8n 安装与配置

使用方式优点限制
官方 SaaS 服务官方提供的服务,开箱即用需要订阅费,基础版本$20 每月
本地 PC快速上手1. 网络环境可能导致部分集成不可用
2. 回调等功能会有限制
3. 对于定期执行的工作流需要保持机器一直开机
云主机部署有较大的灵活性,完全掌控数据1. 需要云主机(最好是海外)
2. 需要有个人域名
3. 需要一定的技术能力
huggingface space简单,且不需要云主机、域名等1. 需要科学的网络环境
2. 需要数据库存储数据

官方 SaaS

官方 SaaS 服务提供 14 天免费试用,可以作为快速体验 n8n 的方式。如下是官方的刊例价,详细的价格及功能列表可以参考官网

n8n price

打开官网注册页面https://app.n8n.cloud/register ,填入必要信息,点击 Start free 14-day trial

n8n cloud register

接下来会弹出一些问卷,按照自己的需求填写即可。同时官网会发送邮箱验证,点击邮件中的链接完成邮箱地址验证。

n8n email verify

本地 PC 部署

本地部署推荐使用 docker 的部署方式。使用 docker 可以避免由于不同操作系统造成的问题, 因为 Docker 提供了一个一致的系统,可以避免由于操作系统和工具之间的差异造成的兼容性问题。

官方提供了基于 docker 环境的安装指南,可以参考https://docs.n8n.io/hosting/installation/docker/

安装 docker 环境

以下使用 Windows 系统作为示例,如果本地已经有 docker 环境可以跳过该步骤。

从官网https://www.docker.com/products/docker-desktop/ 下载 docker desktop 安装包。

docker download

双击 docker 安装包完成安装,随后启动 docker,当看到如下界面时表示安装成功

docker desktop

运行 n8n

打开命令提示符软件(系统菜单搜索 cmd),运行以下命令创建存储卷

docker volume create n8n_data

运行如下命令启动 n8n 服务(cmd 命令行中直接右键粘贴)

docker run -d ^
    --name n8n ^
    -p 5678:5678 ^
    -e GENERIC_TIMEZONE="Asia/Shanghai" ^
    -e TZ="Asia/Shanghai" ^
    -v n8n_data:/home/node/.n8n ^
    docker.n8n.io/n8nio/n8n

可以看到命令行中开始下载 docker 镜像

docker run n8n

运行docker ps检查镜像是否启动,

docker ps

或者通过 docker desktop 软件查看容器是否运行

docker desktop container

相关的数据存放在数据卷中,可以通过 docker desktop 软件查看。默认情况 n8n 使用 sqlite 作为数据存储。

docker desktop volume

最后我们可以通过浏览器访问http://127.0.0.1:5678/ 来使用 n8n 服务。

云主机部署

云主机部署需要一台服务器,一般为 Linux 系统,同时最好配置域名。域名购买后需配置 DNS 解析至云主机的 IP 地址。后续的教程以域名 n8n.example.com 为例。

本教程我们使用 docker compose 进行云主机配置。以下操作使用 ssh 工具连接到云主机,使用命令行操作。

安装 docker & docker compose

在云主机上安装 docker,具体安装方式可以参考官网 。以下以 ubuntu 系统为例,介绍相关步骤(如果云主机已经有 docker 环境,可以跳过这一步)。

  1. 卸载原始有冲突的包
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
  1. 配置 docker 的 apt 源
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
  1. 安装 docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 验证安装
sudo docker run hello-world
  1. 安装 docker compose
sudo apt-get install docker-compose-plugin
  1. 非 root 用户使用 docker
sudo usermod -aG docker $USER
newgrp docker

docker compose 部署 n8n

这里我们使用官方提供的 docker compose 配置来部署 n8n。使用 git 下载官方 self-hosting 仓库

git clone https://github.com/n8n-io/n8n-hosting.git
cd n8n-hosting/docker-compose/withPostgresAndWorker

这里我们使用withPostgresAndWorker目录中的配置,该配置包含 n8n、postgres、redis、worker 等服务。

编辑.env文件,修改其中的数据库密码等信息。密码可以使用在线工具生成,如https://my.norton.com/extspa/passwordmanager?path=pwd-genENCRYPTION_KEY是 n8n 的加密密钥,用于加密数据库中的数据,可以使用命令openssl rand -base64 32生成。

POSTGRES_USER=postgres
POSTGRES_PASSWORD=changePassword
POSTGRES_DB=n8n

POSTGRES_NON_ROOT_USER=n8n
POSTGRES_NON_ROOT_PASSWORD=changePassword

ENCRYPTION_KEY=changeEncryptionKey

N8N_EDITOR_BASE_URL=https://n8n.example.com
WEBHOOK_URL=https://n8n.example.com

GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai

编辑docker-compose.yml文件,添加新增的环境变量配置。

--- a/docker-compose/withPostgresAndWorker/docker-compose.yml
+++ b/docker-compose/withPostgresAndWorker/docker-compose.yml
@@ -19,6 +19,11 @@ x-shared: &shared
     - QUEUE_BULL_REDIS_HOST=redis
     - QUEUE_HEALTH_CHECK_ACTIVE=true
     - N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY}
+    - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL}
+    - WEBHOOK_URL=${WEBHOOK_URL}
+    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
+    - TZ=${TZ}
+
   links:
     - postgres
     - redis

编辑完成后,执行以下命令启动 n8n

docker compose up -d

现在 docker 开始拉取镜像,完成后,运行docker compose ps,可以看到 n8n、postgres、redis、 worker 等服务都启动了,如下

NAME                                 IMAGE                     COMMAND                  SERVICE      CREATED         STATUS                   PORTS
withpostgresandworker-n8n-1          docker.n8n.io/n8nio/n8n   "tini -- /docker-ent…"   n8n          5 minutes ago   Up 5 minutes             0.0.0.0:5678->5678/tcp, [::]:5678->5678/tcp
withpostgresandworker-n8n-worker-1   docker.n8n.io/n8nio/n8n   "tini -- /docker-ent…"   n8n-worker   5 minutes ago   Up 5 minutes             5678/tcp
withpostgresandworker-postgres-1     postgres:16               "docker-entrypoint.s…"   postgres     5 minutes ago   Up 5 minutes (healthy)   5432/tcp
withpostgresandworker-redis-1        redis:6-alpine            "docker-entrypoint.s…"   redis        5 minutes ago   Up 5 minutes (healthy)   6379/tcp

上述的 docker compose 配置文件中启动了两个 n8n 实例,其中一个是主实例,一个是 worker 实例。该模式为队列运行模式,使用 redis 作为消息队列。理论上这种模式可以扩展到更多的 worker,进行分布式部署,提高 n8n 的并发处理能力。详细的描述可以参考官方文档https://docs.n8n.io/hosting/scaling/queue-mode/

配置反向代理

编辑域名解析,将域名指向云主机的 IP 地址。这里我们使用 Caddyserver 作为我们的反向代理服务器。 Caddyserver 是一个开源的、高性能的、易用的反向代理服务器,可以类比 Nginx, 其官网为https://caddyserver.com/ 。Caddyserver 最大的优势是可以自动管理 SSL 证书,无需手动配置。

以下介绍如何使用 Caddyserver 配置反向代理。

  1. 安装 Caddyserver,参考官方文档https://caddyserver.com/docs/install
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
  1. 配置 Caddyserver,编辑/etc/caddy/Caddyfile文件,添加以下内容(替换其中的域名)
n8n.example.com {
    reverse_proxy localhost:5678
}
  1. 重启 Caddyserver
sudo systemctl restart caddy
  1. 访问域名,即可看到 n8n 的界面

huggingface space 部署

云服务部署需要主机,且需要域名,有一定的门槛,最后我们介绍使用 huggingface space 部署 n8n。 huggingface space 是 huggingface 提供的一个在线服务环境,其支持 docker 部署应用。

通过 supabase 创建数据库

由于 huggingface space 在长时间未使用后,会“进入休眠”状态并停止执行。我们需要使用外部数据库来保存 n8n 服务的数据,这里我们使用 supabase 提供的服务。

  1. 注册 supabase 账号,https://supabase.com/dashboard/sign-up

  2. 创建项目,按表单填写项目相关配置。保存填写的数据库密码,后面会使用到

    supabase create project
    supabase project setting

  3. 查看数据库链接信息,点击 Project 左上角的Connect按钮

    supabase project

  4. Connection String 中,选择SQLAlchemy,找到Transaction pooler

    supabase connection
    supabase connection transaction pooler

  5. 记录下提供的数据库连接信息,如 host、port、user、password、dbname 等。

使用 huggingface space 部署 n8n

huggingface space 免费版本提供的服务资源,足够 n8n 服务的运行。

HardwareGPU MemoryCPUMemoryDiskHourly Price
CPU Basic-2 vCPU16 GB50 GBFree!

课程作者创建了 n8n 空间模板项目,可共学习者直接使用。

  1. 首先需要注册 huggingface 账号,记住自己的 profile 名字。如https://huggingface.co/tomowang 中的tomowang即为 profile 名字

  2. 访问https://huggingface.co/spaces/tomowang/n8n , 在右上角点击垂直省略按钮,选择Duplicate this space

    hf duplicate space

  3. 在弹出的对话框中,配置相关的环境变量

    hf space env

    VariableValue
    DB_POSTGRESDB_PASSWORD为 supabase 项目创建时配置的数据库密码
    DB_POSTGRESDB_USER为之前链接信息中的user
    DB_POSTGRESDB_HOST为之前链接信息中的host
    DB_POSTGRESDB_PORT6543
    N8N_ENCRYPTION_KEY随机串,可以使用openssl rand -base64 32生成
    WEBHOOK_URL格式为 https://<profile>-n8n.hf.space/
    N8N_EDITOR_BASE_URL格式为 https://<profile>-n8n.hf.space/
    GENERIC_TIMEZONE按需填写,如 Asia/Shanghai
    TZ按需填写,如 Asia/Shanghai
  4. 点击Duplicate Space按钮,等待部署完成,相关日志输出如下

    hf space deploy start

  5. 最终部署完成后会输出如下日志,展示我们配置的N8N_EDITOR_BASE_URL地址,访问该地址即可开始使用 n8n

    hf space deploy done

需要注意的是,n8n 使用helmet 来处理 HTTP 相关的安全配置,在生产环境中会默认配置X-Frame-Optionssameorigin,以禁止 iframe 嵌入。所以后续可以直接打开上图中展示的地址直接使用。

最后附上原始的 Dockerfile 供参考https://huggingface.co/spaces/tomowang/n8n/blob/main/Dockerfile

ARG N8N_VERSION=stable

FROM docker.n8n.io/n8nio/n8n:$N8N_VERSION

LABEL maintainer="Xiaoliang <[email protected]>"

ENV N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
    N8N_RUNNERS_ENABLED=true \
    N8N_PROXY_HOPS=1

# https://huggingface.co/docs/hub/spaces-sdks-docker#permissions
# The container runs with user ID 1000.
# node docker image already has a user named node with ID 1000.
USER node

VOLUME ["$HOME/.n8n"]

# n8n default port
EXPOSE 5678

ENTRYPOINT ["tini", "--", "/docker-entrypoint.sh"]