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