Featured image of post n8n 自部署

n8n 自部署

n8n 自部署环境搭建(docker)

关注AI 相关内容的朋友,一定对Dify和n8n不陌生。它们都是优秀的开源 “AI 应用构建平台”。

之前在 自部署Dify 那篇文章里,介绍了使用docker工具快速搭建Dify平台的全过程。

今天赶紧把另一道菜:< n8n 自部署环境搭建> 端出来。 后续可以导入其他人制作好的工作流,进一步学习&使用。

话不多说,先看效果

登录后界面:

工作流界面:

双击某个节点,其中 INPUTOUTPUT信息 是突出显示的:

与Dify不同的是,n8n中没有知识库的组件。可以认为 当前它更强调的是 “生产环境”下工作流全流程搭建与使用上。

个人自部署方式

个人部署n8n用到的docker 镜像不多,这里有两种自部署方式,供大家参考:

  1. 在“1panle” 和“宝塔”的应用市场里就提供了App,直接图形化点击、安装——

  2. 使用一个 docker-compose.yml 文件搞定所有 镜像和环境变量,额外还需要一个脚本完成数据库的初始化配置。

使用第二种方式

和dify 一样我们还是在 群晖的docker 工具 内完成部署 。

配置文件参考:

https://github.com/n8n-io/n8n-hosting/blob/main/docker-compose/withPostgres/docker-compose.yml

docker-compose 配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: '3.8'

services:
  postgres:
    image: postgres:16
    restart: always
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=qbcvLY7zJzdHk4Fk
      - POSTGRES_DB=n8n
      - POSTGRES_NON_ROOT_USER=n8n
      - POSTGRES_NON_ROOT_PASSWORD=Szk3hpR3fqBJAYWv
    volumes:
      - ./n8n-data/db:/var/lib/postgresql/data
      - ./n8n-data/init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U admin -d n8n']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: n8nio/n8n:1.108.2
    restart: always
    environment:
      - GENERIC_TIMEZONE=Asia/Shanghai
      - TZ=Asia/Shanghai
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=admin
      - DB_POSTGRESDB_PASSWORD=qbcvLY7zJzdHk4Fk
      - N8N_HOST=n8n.host
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_RUNNERS_ENABLED=true
      - N8N_ENCRYPTION_KEY=y4jfzyUix57aRZeV
      - N8N_PROTOCOL=https
      #- N8N_SECURE_COOKIE=false    
      - NODE_ENV=production
    volumes:
      - ./n8n-data/app:/home/node/.n8n
    ports:
      - 5678:5678
    depends_on:
      postgres:
        condition: service_healthy

0. 准备工作

照例,还是先检查下群晖中 的docker管理组件工作正常。

以及镜像仓库可以正常访问。

此外,还需要多准备一个脚本:init-data.sh 内容如下——

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/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

1. 导入yaml 配置文件

新增一个n8n_pj 的项目,路径放置在docker应用数据目录下(我这里是 /docker/n8n ),粘贴上面配置文件后点击 “下一步”。

此时还没有创建持久化数据的目录,不要勾选 “立即启动”。

最后,点击“完成”。

2. 添加持久化存储路径和数据库脚本

数据库,配置,插件等数据都持久化 的数据,所以在doker-compose 配置文件中已经指定了数据存放路径( /docker/n8n/n8n-data )。

需要在 /docker/n8n/n8n-data 下,手动创建两个空文件夹“app” 和 “db”,并上传之前的数据库初始化脚本文件“init-data.sh”——

3. 修改app 目录所属用户和用户组

因为 n8n docker 镜像访问数据目录权限问题,需要把 /docker/n8n/n8n-data/app 文件夹的用户属性改为 1000:1000

具体操作为: 1)先ssh 登录到 群晖NAS 上

2)执行命令:"sudo chown 1000:1000 /volume1/docker/n8n/n8n-data/app"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
admin@NAS:~$ 
admin@NAS:~$ cd /volume1/docker/n8n/n8n-data/
admin@NAS:/volume1/docker/n8n/n8n-data$ ls -l
total 4
drwxrwxrwx+ 1 admin users   0 Sep  5 18:46 app
drwxrwxrwx+ 1 admin users   0 Sep  5 18:46 db
-rwxrwxrwx+ 1 admin users 494 Aug 19 10:43 init-data.sh

admin@NAS:/volume1/docker/n8n/n8n-data$ 
admin@NAS:/volume1/docker/n8n/n8n-data$ sudo chown 1000:1000 app
Password: 
admin@NAS:/volume1/docker/n8n/n8n-data$ ls -l
total 4
drwxrwxrwx+ 1  1000  1000   0 Sep  5 18:46 app
drwxrwxrwx+ 1 admin users   0 Sep  5 18:46 db
-rwxrwxrwx+ 1 admin users 494 Aug 19 10:43 init-data.sh
admin@NAS:/volume1/docker/n8n/n8n-data$

4. 拉取镜像,启动项目

因为n8n 默认参数“N8N_SECURE_COOKIE=true” ,要求使用https协议,这里直接使用群晖自带的web station 实现https 访问代理——

没有使用群晖的小伙伴也不用担心,文末会提供关闭“N8N_SECURE_COOKIE”功能后的docker-compose 配置文件。

注意: 关闭后,因为cookie 不受加密通信的保护,存在安全风险。

上面步骤点击“保存”后。回到docker 管理界面,点击“操作” -> “构建”。拉取对应docker 镜像,生成相关docker 实例。

等待拉取镜像,n8n 的组件会逐个启动。

启动成功——

5. 追加 Hosts/DNS 解析

项目已经成功运行了,配置中指定了N8N_HOST=n8n.host ,这里需要把域名关联到NAS IP上。

两个地方应用这个域名,一个在之前创建的 web station 中——

还有一个 是在家里dns server上(一般是路由器)——

6. 登录web 界面完成初始化

以上都完成后,就可以登录n8n 进行最后的初始化工作啦。

浏览器中 访问 https://n8n.host ,跳出初始化界面——

激活免费功能,需要关联自己的邮箱——

另外,n8n 的中文文档支持很好,初步上手可以看下 官方的入门案例指南

企业自部署

参考

官方文档:

https://github.com/n8n-io/n8n/blob/master/packages/%40n8n/benchmark/scripts/n8n-setups/scaling-single-main/docker-compose.yml

总体上看,各个组件的模块和dify 差不多。

相同的是:

  1. 都是用了 redis 做缓存,postgres 做数据库
  2. 都是一个主节点带1-2 个worker

不同的是:

  1. 多了mockapi 用于API 验证—— “MockAPI顾名思义是一个模拟的API,它可以模拟真实API的请求并返回数据。MockAPI可用于前后端分离,在项目初期前端可使用MockAPI对系统进行开发,而不需要依赖后端开发好正式的API后才开始进行前端开发。"
  2. 多了一个 单节点性能测试组件——n8n-benchmark。用来评估 节点响应性能。
  3. 如一开始说的,n8n 没有知识库组件,所以也用不到向量数据库。

附:

关闭“N8N_SECURE_COOKIE” 后的docker-compose 配置文件,在本公众号(AI 热气球)中发送【906】获取。

Licensed under CC BY-NC-SA 4.0