Files
n8n-self-hosted/docker-compose.yml
2025-10-22 20:48:28 +03:00

164 lines
4.3 KiB
YAML

x-n8n-common-env: &n8n-common-env
N8N_HOST: ${SUBDOMAIN}.${DOMAIN_NAME}
N8N_PORT: 5678
N8N_PROTOCOL: https
NODE_ENV: production
WEBHOOK_URL: https://${SUBDOMAIN}.${DOMAIN_NAME}/
# Sets the timezone for cron nodes, etc.
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
# Secret key to encrypt credentials.
N8N_ENCRYPTION_KEY: ${N8N_KEY}
# --- Database ---
DB_TYPE: postgresdb
DB_POSTGRESDB_DATABASE: n8n_db
DB_POSTGRESDB_HOST: n8n-psql
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_SCHEMA: public
DB_POSTGRESDB_PASSWORD: ${PSQL_PWD}
# --- Workers & Execution Pruning ---
# 'queue' mode is required for scaling with separate workers.
EXECUTIONS_MODE: queue
QUEUE_BULL_REDIS_HOST: n8n-redis
QUEUE_BULL_REDIS_PASSWORD: ${REDIS_PWD}
# Max age of executions to keep, in hours: 24h * 30d = 720, 14d = 336, 21d = 504, 60d = 1440
EXECUTIONS_DATA_MAX_AGE: 1440
EXECUTIONS_DATA_PRUNE_MAX_COUNT: 1000000
EXECUTIONS_DATA_PRUNE: true
# --- Security & Customization ---
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: true
N8N_GIT_NODE_DISABLE_BARE_REPOS: true
N8N_BLOCK_ENV_ACCESS_IN_NODE: true
# Performance tuning.
N8N_RUNNERS_ENABLED: true
N8N_RUNNERS_MAX_CONCURRENCY: 10
OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS: true
# --- SMTP ---
N8N_EMAIL_MODE: smtp
N8N_SMTP_HOST: ${SMTP_HOST}
N8N_SMTP_PORT: ${SMTP_PORT}
N8N_SMTP_USER: ${SMTP_USER}
N8N_SMTP_PASS: ${SMTP_PWD}
N8N_SMTP_SENDER: ${SMTP_USER}
N8N_SMTP_SSL: true
# Save binary files to filesystem instead of memory
N8N_DEFAULT_BINARY_DATA_MODE: filesystem
# Disable modules and spam
N8N_DISABLED_MODULES: insights
# N8N_TEMPLATES_ENABLED: false
N8N_HIRING_BANNER_ENABLED: false
# N8N_VERSION_NOTIFICATIONS_ENABLED: false
# Disable n8n telemetry events (comment to enable)
N8N_DIAGNOSTICS_ENABLED: false
EXTERNAL_FRONTEND_HOOKS_URLS:
N8N_DIAGNOSTICS_CONFIG_FRONTEND:
N8N_DIAGNOSTICS_CONFIG_BACKEND:
# Enable n8n /metrics, /healthz and /healthz/readiness endpoints
N8N_METRICS: true
QUEUE_HEALTH_CHECK_ACTIVE: true
name: n8n
services:
caddy:
container_name: caddy
hostname: caddy
image: caddy:latest
networks:
- shared_network
restart: always
ports:
- '80:80'
- '443:443'
- '443:443/udp'
environment:
DOMAIN_NAME: ${DOMAIN_NAME}
SSL_EMAIL: ${SSL_EMAIL}
volumes:
- ./data/caddy:/data
- ./config:/etc/caddy
depends_on:
n8n-master:
condition: service_started
n8n-redis:
container_name: n8n-redis
hostname: n8n-redis
image: redis:alpine
networks:
- shared_network
restart: always
healthcheck:
test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]
interval: 5s
timeout: 5s
retries: 5
command: >
--requirepass ${REDIS_PWD}
--bind 0.0.0.0
--save 600 1
--loglevel warning
volumes:
- ./data/n8n-redis:/data
n8n-psql:
container_name: n8n-psql
hostname: n8n-psql
image: postgres:17
networks:
- shared_network
restart: always
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${PSQL_PWD}
POSTGRES_DB: n8n_db
volumes:
- ./data/n8n-psql:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U n8n -d n8n_db']
interval: 5s
timeout: 5s
retries: 10
command:
- postgres
- -c
- log_min_messages=warning
- -c
- client_min_messages=warning
- -c
- log_checkpoints=off
n8n-master:
container_name: n8n-master
hostname: n8n-master
image: n8nio/n8n:${N8N_VERSION:-latest}
networks:
- shared_network
restart: always
ports:
- '5678:5678'
environment: *n8n-common-env
volumes:
- ./data/n8n:/home/node/.n8n
- ./local_files:/files
depends_on:
n8n-psql:
condition: service_healthy
n8n-redis:
condition: service_healthy
n8n-worker:
image: n8nio/n8n:${N8N_VERSION:-latest}
networks:
- shared_network
restart: always
environment: *n8n-common-env
command: worker --concurrency=10
volumes:
- ./data/n8n:/home/node/.n8n
- ./local_files:/files
depends_on:
n8n-psql:
condition: service_healthy
n8n-redis:
condition: service_healthy
networks:
shared_network:
name: shared_network
driver: bridge
external: true