N8N 2.x 完整版 docker-compose.yml

N8N 2.x 完整版 docker-compose.yml

 次点击
22 分钟阅读

n8n-image.png

背景

之前给了一个在 MacOS 上部署 n8n 2.x 的简单配置,使用它可以快速在自己的笔记本上部署 n8n,但是当你有更复杂的使用需求,基础的 docker 配置文件肯定是无法满足您的。接下来提供一套基于 Docker Compose 的 n8n 2.x 自托管配置,使用 Postgres 作为数据库,并启用了外部 Task Runners(支持原生 Python Code 节点),主要做了以下优化:

  • 使用 Postresq 数据库代替默认的 SqlLite

  • 启用 task-runners 服务,支持运行原生 Python 代码

  • 通过环境变量放开了更多 n8n 的权限,方便本地调试

  • 加入 healthcheck,确保相关依赖服务的正常运行

  • 通过 .env 文件统一管理私密配置

  • 通过 N8N_RESTRICT_FILE_ACCESS_TO 挂载了额外的 mnt 目录

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:2.1.4
    ports:
      - "5678:5678"
    user: "${UID:-1000}:${GID:-1000}" # 以指定用户运行(默认 1000:1000)
    # 环境变量文档:https://docs.n8n.io/hosting/configuration/environment-variables
    environment:
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - N8N_HOST=localhost
      - N8N_EDITOR_BASE_URL=http://localhost:5678 # 编辑器基础URL
      - WEBHOOK_URL=http://localhost:5678 # 外部回调URL
      - TZ=Asia/Shanghai # 时区
      - N8N_LOG_LEVEL=info # 日志级别
      - N8N_RELEASE_TYPE=stable # 使用稳定版本
      - N8N_DEFAULT_LOCALE=en # 默认语言,默认值 en
      - GENERIC_TIMEZONE=Asia/Shanghai # 通用时区
      # - EXECUTIONS_TIMEOUT=-1 # 整个工作流的超时时间
      # - EXECUTIONS_TIMEOUT_MAX=3600 # 单个节点的超时时间
      # - EXECUTIONS_DATA_SAVE_ON_PROGRESS=true # 保存节点的执行进度

      # ==== 安全相关(生产环境谨慎配置) ====
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} # 加密密钥
      - N8N_RESTRICT_FILE_ACCESS_TO=/home/node/.n8n-files;/mnt # 定义“可访问的目录”,节点默认只能访问 /home/node/.n8n-files 及其子目录,多个目录以半角分号分隔
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false # 强制设置文件权限
      - N8N_SKIP_AUTH_ON_OAUTH_CALLBACK=true # 跳过OAuth回调的认证
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=false # 允许节点访问环境变量
      - N8N_GIT_NODE_DISABLE_BARE_REPOS=false # 禁用git裸仓库交互
      - N8N_GIT_NODE_ENABLE_HOOKS=true # 允许git节点执行钩子
      - NODE_FUNCTION_ALLOW_BUILTIN=* # 允许所有内置模块(启用 Task Runners 后需要到 Runners 容器中去配置)
      - NODES_EXCLUDE=[] # 排除指定节点

      # ==== 数据库配置 ====
      - DB_TYPE=${DB_TYPE}
      - DB_POSTGRESDB_HOST=${DB_POSTGRESDB_HOST}
      - DB_POSTGRESDB_PORT=${DB_POSTGRESDB_PORT}
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
      - DB_POSTGRESDB_USER=${POSTGRES_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
      - DB_POSTGRESDB_SCHEMA=${DB_POSTGRESDB_SCHEMA}
      - DB_POSTGRESDB_SSL_ENABLED=${DB_POSTGRESDB_SSL_ENABLED}

      # ==== Task Runners 配置 ====
      # 文档:https://docs.n8n.io/hosting/configuration/task-runners
      - N8N_RUNNERS_ENABLED=true # 启用 Task Runners
      - N8N_RUNNERS_MODE=external # 使用外部模式(单独 runners 容器)
      - N8N_NATIVE_PYTHON_RUNNER=true # 启用原生 Python Code 节点
      - N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0 # 监听来自 runners 的连接
      - N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN} # 与 runners 通信的共享密钥(务必自行修改)
    volumes:
      - ./n8n_data:/home/node/.n8n # 挂载 n8n 数据目录到容器
      - ./n8n_files:/home/node/.n8n-files # 挂载 n8n 主文件目录到容器
      - ./mnt:/mnt # 挂载自定义目录到容器,用于其它自定义文件存储
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy

  task-runners:
    image: n8nio/runners:2.1.4 # 版本和 n8n 保持一致
    container_name: n8n-task-runners
    restart: unless-stopped
    environment:
      # 连接到 n8n 容器内的 Task Broker(默认端口 5679)
      - N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
      # 必须和 n8n 容器内的 N8N_RUNNERS_AUTH_TOKEN 一致
      - N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN}
      # 空闲多少秒自动关闭 runner 进程(有新任务会自动再拉起)
      - N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=15
      # 允许使用的模块
      - N8N_RUNNERS_STDLIB_ALLOW=*
      - N8N_RUNNERS_EXTERNAL_ALLOW=*
      - NODE_FUNCTION_ALLOW_BUILTIN=*
      - NODE_FUNCTION_ALLOW_EXTERNAL=*
    depends_on:
      - n8n

  postgres:
    image: postgres:15
    container_name: n8n-postgres
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
    volumes:
      - ./postgres:/var/lib/postgresql/data
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5

.env 文件中主要是一些密码相关的私密配置,到时候如果部署到公网,需要注意安全性。

# 加密密钥
N8N_ENCRYPTION_KEY=my_n8n_workflow
N8N_RUNNERS_AUTH_TOKEN=my_n8n_runners_auth_token

# POSTGRES 数据库配置
DB_TYPE=postgresdb
POSTGRES_DB=n8n
POSTGRES_USER=postgres
POSTGRES_PASSWORD=12345678
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_SCHEMA=public
DB_POSTGRESDB_SSL_ENABLED=false

容器启动成功后,您就可以通过 Docker Desktop 很方便的看到当前已经挂载的目录及其权限。

如果没使用 Docker Desktop 来管理,您也可以直接通过 docker 命令进入容器内部自行查看:

~/Documents/n8n on ☁️  (ap-southeast-1) 
❯ docker ps
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS                    PORTS                                         NAMES
67c9ba9f85b3   n8nio/runners:2.1.4             "tini -- /usr/local/…"   15 minutes ago   Up 15 minutes             5680/tcp                                      n8n-task-runners
dbe83c95c048   docker.n8n.io/n8nio/n8n:2.1.4   "tini -- /docker-ent…"   15 minutes ago   Up 15 minutes             0.0.0.0:5678->5678/tcp, [::]:5678->5678/tcp   n8n-n8n-1
ff533496d1b9   postgres:15                     "docker-entrypoint.s…"   15 minutes ago   Up 15 minutes (healthy)   5432/tcp                                      n8n-postgres
6c04e32675a3   postgres:16                     "docker-entrypoint.s…"   2 days ago       Up 18 hours (healthy)     5432/tcp                                      marek-goods-collector-postgres

~/Documents/n8n on ☁️  (ap-southeast-1) 
❯ docker exec -it dbe83c95c048 sh           
~ $ ls -la
total 20
drwxr-sr-x    1 node     node          4096 Dec 25 04:41 .
drwxr-xr-x    1 root     root          4096 Dec  5 05:12 ..
-rw-------    1 node     node             7 Dec 25 04:41 .ash_history
drwxr-sr-x    3 node     node          4096 Dec 25 04:25 .cache
drwxr-xr-x   12 node     node           384 Dec 25 04:25 .n8n
drwxrwxrwx    5 node     node           160 Dec 25 03:56 .n8n-files

文档&资源

© 本文著作权归作者所有,未经许可不得转载使用。