
背景
之前给了一个在 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