Hi @Nac,
Try the below docker compose which sets up a docker compose instance on n8n running in queue mode with runners enabled as external supporting both JS and Python.
services:
n8n-db:
image: postgres:16.1
restart: always
environment:
- POSTGRES_DB=n8n
- POSTGRES_PASSWORD=n8n
- POSTGRES_USER=n8n
volumes:
- postgres-data:/var/lib/postgresql/data
n8n-redis:
image: redis:7-alpine
restart: always
volumes:
- redis-data:/data
n8n-main:
image: n8nio/n8n
restart: always
depends_on:
- n8n-db
- n8n-redis
volumes:
- n8n-data:/home/node/.n8n
ports:
- 4567:5678
environment:
- WEBHOOK_URL=http://localhost:5678
- NODE_ENV=production
- N8N_HOST=localhost
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_SECURE_COOKIE=true
- EXECUTIONS_MODE=queue
# Task runner configuration for v2 (external mode)
- N8N_RUNNERS_ENABLED=true
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
- N8N_RUNNERS_AUTH_TOKEN=your-secure-auth-token-change-this
# Security settings
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
- N8N_BLOCK_ENV_ACCESS_IN_NODE=true
- N8N_SKIP_AUTH_ON_OAUTH_CALLBACK=false
# File access restriction
- N8N_RESTRICT_FILE_ACCESS_TO=/home/node/.n8n-files
# Binary data configuration (filesystem mode for regular mode)
- N8N_DEFAULT_BINARY_DATA_MODE=filesystem
- NODE_FUNCTION_ALLOW_BUILTIN=crypto
- OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
- DB_TYPE=postgresdb
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_HOST=n8n-db
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_SCHEMA=n8n
- DB_POSTGRESDB_PASSWORD=n8n
- DB_POSTGRESDB_POOL_SIZE=40
- DB_POSTGRESDB_CONNECTION_TIMEOUT=30000
# Queue mode configuration
- QUEUE_BULL_REDIS_HOST=n8n-redis
- QUEUE_BULL_REDIS_PORT=6379
- QUEUE_BULL_REDIS_DB=0
n8n-worker:
image: n8nio/n8n
restart: always
command: worker --concurrency=6
depends_on:
- n8n-db
- n8n-redis
- n8n-worker-task-runner
volumes:
- n8n-data:/home/node/.n8n
environment:
- EXECUTIONS_MODE=queue
- WEBHOOK_URL=http://localhost:5678
- N8N_HOST=localhost
- N8N_SKIP_DB_INIT=true
# Task runner configuration for v2 (external mode)
- N8N_RUNNERS_ENABLED=true
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
- N8N_RUNNERS_AUTH_TOKEN=your-secure-auth-token-change-this
- N8N_PROCESS=worker
# Security settings
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
- N8N_BLOCK_ENV_ACCESS_IN_NODE=true
# File access restriction
- N8N_RESTRICT_FILE_ACCESS_TO=/home/node/.n8n-files
- NODE_FUNCTION_ALLOW_BUILTIN=crypto
- DB_TYPE=postgresdb
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_HOST=n8n-db
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_SCHEMA=n8n
- DB_POSTGRESDB_PASSWORD=n8n
- DB_POSTGRESDB_POOL_SIZE=40
- DB_POSTGRESDB_CONNECTION_TIMEOUT=30000
# Queue mode configuration
- QUEUE_BULL_REDIS_HOST=n8n-redis
- QUEUE_BULL_REDIS_PORT=6379
- QUEUE_BULL_REDIS_DB=0
# Task runner for n8n-worker with Python support for v2
n8n-worker-task-runner:
image: n8nio/runners
restart: always
depends_on:
- n8n-db
- n8n-redis
environment:
# Task runner configuration
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_TASK_BROKER_URI=http://n8n-worker:5679
- N8N_RUNNERS_AUTH_TOKEN=your-secure-auth-token-change-this
# Enable Python and JavaScript support
- N8N_RUNNERS_ENABLED_TASK_TYPES=javascript,python
# Auto shutdown after 15 seconds of inactivity
- N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=15
volumes:
# Shared volume for file access if needed
- n8n-data:/home/node/.n8n
volumes:
postgres-data:
redis-data:
n8n-data:
