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