Files
n8n-self-hosted/docker-compose.yml
2025-10-09 12:01:37 +03:00

145 lines
4.1 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
services:
caddy:
container_name: n8n-caddy
hostname: n8n-caddy
image: caddy:latest
networks: ['shared_network']
restart: always
ports:
- '80:80'
- '443:443'
- '443:443/udp'
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
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
n8n-master:
container_name: n8n-master
hostname: n8n-master
image: docker.n8n.io/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: docker.n8n.io/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