self-hosting Docker Setup

Ich betreibe n8n in einem LXC Container mit Docker.
n8n läuft im Container im Worker Modus. Das bedeutet, dass nicht nur ein Container sondern mindestends zwei Container gestartet werden.

Der erste Container ist für die Web-UI und das delegieren von Pipeline Runs zuständig.
Der zweite Container führ nur Pipeline Runs aus.
Wird eine Pipeline in der Web-UI manuell gestartet, so wird diese über den Container der Web-UI gestartet. Der Worker Container ist so konfiguriert, dass dieser parallel bis zu vier Pipelines gleichzeitig ausführen darf.

Der Worker Modus erwartet einen Redis Server um dorthin seine Job-Daten zu verteilen.
Redis stellt in meinem Setup den dritten Container dar.

Da mein n8n auf Dienste mit eigenen SSL Zertifikaten zugreifen muss, habe ich mein eigenes CA Zertifikat in die Container gemounted.

Die n8n Datenbank habe ich in einen Postgres Server ausgelagert. Da ich in meinem Netzwerk bereits einen Postgres Server betreibe, spare ich mir hier im Docker Setup den Container für die Datenbank ein.

Die docker-compose.yml

x-n8n: &service-n8n
  image: n8nio/n8n:1.74.3
  env_file: n8n.env
  networks:
    - default
  user: node
  volumes:
    - n8n-data:/home/node/.n8n
    - "./MuenchCA.pem:/MuenchCA.pem:ro"
  restart: unless-stopped

services:

  n8n:
    <<: *service-n8n
    container_name: n8n
    ports:
      - 5678:5678
    depends_on:
      redis:
        condition: service_healthy

  n8n_worker:
    <<: *service-n8n
    container_name: n8n_worker
    command: worker --concurrency=6
    depends_on:
      - n8n

  # Webhook container is starting but not working.
  # Ever webhook call results in a 404 http status.
  #n8n_webhook:
  #  <<: *service-n8n
  #  container_name: n8n_webhook
  #  command: webhook
  #  depends_on:
  #    - n8n

  redis:
    container_name: n8n_redis
    image: redis:7-alpine
    restart: unless-stopped
    networks:
      - default
    volumes:
      - redis-data:/data
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10

volumes:
  n8n-data:
  redis-data:

Meine .n8n.env

(Sensible Parameter wurden maskiert)

DB_TYPE=postgresdb
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_HOST=postgres.muench.lan
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
DB_POSTGRESDB_SCHEMA=n8n
DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=true

EXECUTIONS_MODE=queue
N8N_DISABLE_PRODUCTION_MAIN_PROCESS=false
N8N_CONCURRENCY_PRODUCTION_LIMIT=20

# https://docs.n8n.io/hosting/scaling/execution-data/#reduce-saved-data -> in hours
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000

QUEUE_BULL_REDIS_HOST=redis
QUEUE_HEALTH_CHECK_ACTIVE=true

N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
N8N_BASIC_AUTH_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
N8N_ENCRYPTION_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
N8N_DIAGNOSTICS_ENABLED=false
N8N_HOST=foo.example.com
N8N_PORT=5678
N8N_PROTOCOL=https
NODE_OPTIONS=--max_old_space_size=4096
NODE_ENV=production
WEBHOOK_URL=https://foo.example.com
GENERIC_TIMEZONE=Europe/Berlin
TZ=Europe/Berlin
# required to get DB SSL connection running
NODE_EXTRA_CA_CERTS=/MuenchCA.pem

# Install custom package dependencies
#N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
N8N_REINSTALL_MISSING_PACKAGES=true
N8N_COMMUNITY_PACKAGES_ENABLED=true

# Trust traefik proxy -> See: https://community.n8n.io/t/x-forwarded-for-header-is-set-but-the-express-trust-proxy-s/51208/6
EXPRESS_TRUST_PROXY=true
N8N_PROXY_HOPS=1

N8N_LOG_LEVEL=debug