n8n Self-Hosted mit Docker Compose: Der ultimative Setup-Guide

12 Min. Lesezeit Vinspire
n8nDockerSelf-HostingWorkflow AutomationDevOps

Ihr wollt n8n self-hosted betreiben und maximale Kontrolle über eure Workflow-Automation haben? Mit n8n Docker Compose könnt ihr in wenigen Minuten eine produktionsreife Instanz aufsetzen. In diesem Guide zeige ich euch, wie ihr n8n professionell selbst hostet – mit allen wichtigen Konfigurationen, Sicherheits-Best-Practices und Tipps aus der Praxis.

Warum n8n Self-Hosted?

Bevor wir in die technische Umsetzung einsteigen, hier die wichtigsten Gründe für n8n self-hosted:

✅ Volle Datenkontrolle

  • Alle Workflow-Daten bleiben auf euren eigenen Servern
  • DSGVO-konform ohne Drittanbieter-Abhängigkeiten
  • Keine Limits bei sensiblen Daten

✅ Kosteneffizienz

  • Keine monatlichen SaaS-Gebühren
  • Unbegrenzte Workflows und Executions
  • Skalierbar nach Bedarf

✅ Anpassbarkeit

  • Custom Nodes und Extensions möglich
  • Volle Kontrolle über Updates
  • Integration in bestehende Infrastruktur

Voraussetzungen

Für die n8n Docker Compose Installation benötigt ihr:

  • Docker (Version 20.10+)
  • Docker Compose (Version 2.0+)
  • Linux Server (Ubuntu 22.04 empfohlen) oder macOS
  • Domain mit SSL-Zertifikat (für Produktiv-Umgebung)
  • Mindestens 2GB RAM und 10GB Speicher

n8n Docker Compose Setup: Schritt für Schritt

1. Projektstruktur erstellen

Erstellt zunächst ein dediziertes Verzeichnis für eure n8n-Installation:

mkdir -p ~/n8n-docker
cd ~/n8n-docker
mkdir -p data

2. Docker Compose Datei erstellen

Erstellt eine docker-compose.yml mit folgender Konfiguration:

version: "3.8"

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      # Basis-Konfiguration
      - N8N_HOST=${N8N_HOST}
      - N8N_PORT=5678
      - N8N_PROTOCOL=${N8N_PROTOCOL}
      - NODE_ENV=production

      # Datenbank (PostgreSQL empfohlen für Produktion)
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
      - DB_POSTGRESDB_USER=${POSTGRES_USER}
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}

      # Authentifizierung
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
      - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}

      # Webhook-URL
      - WEBHOOK_URL=${WEBHOOK_URL}

      # Timezone
      - GENERIC_TIMEZONE=Europe/Berlin
      - TZ=Europe/Berlin

    volumes:
      - ./data:/home/node/.n8n
    depends_on:
      - postgres
    networks:
      - n8n-network

  postgres:
    image: postgres:15-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - n8n-network

volumes:
  postgres-data:

networks:
  n8n-network:
    driver: bridge

3. Environment-Variablen konfigurieren

Erstellt eine .env Datei für eure Konfiguration:

# n8n Konfiguration
N8N_HOST=n8n.euredomain.de
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.euredomain.de/

# Authentifizierung (ÄNDERN!)
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=IhrSicheresPasswort123!

# PostgreSQL Datenbank
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=IhrDatenbankPasswort456!

⚠️ Wichtig: Ändert unbedingt die Passwörter vor dem produktiven Einsatz!

4. n8n starten

Startet eure n8n self-hosted Instanz:

docker-compose up -d

Überprüft den Status:

docker-compose ps
docker-compose logs -f n8n

5. Zugriff auf n8n

Öffnet euren Browser und navigiert zu:

  • Lokal: http://localhost:5678
  • Produktiv: https://n8n.euredomain.de

Loggt euch mit den Credentials aus der .env ein.

Produktiv-Setup: SSL & Reverse Proxy

Für den produktiven Einsatz empfehle ich Traefik oder Nginx als Reverse Proxy mit automatischem SSL.

Traefik Integration

Erweitert eure docker-compose.yml:

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=info@euredomain.de"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - n8n-network

  n8n:
    # ... bestehende Konfiguration
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.euredomain.de`)"
      - "traefik.http.routers.n8n.entrypoints=websecure"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

Best Practices für n8n Self-Hosted

1. Regelmäßige Backups

Erstellt ein Backup-Script:

#!/bin/bash
# backup-n8n.sh

BACKUP_DIR="/backups/n8n"
DATE=$(date +%Y%m%d_%H%M%S)

# PostgreSQL Backup
docker exec n8n-postgres pg_dump -U n8n n8n > "$BACKUP_DIR/n8n_db_$DATE.sql"

# n8n Daten Backup
tar -czf "$BACKUP_DIR/n8n_data_$DATE.tar.gz" -C ~/n8n-docker data/

# Alte Backups löschen (älter als 30 Tage)
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

Automatisiert mit Cron:

0 2 * * * /path/to/backup-n8n.sh

2. Monitoring & Logging

Integriert Monitoring mit Prometheus und Grafana:

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - n8n-network

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - n8n-network

3. Ressourcen-Limits

Begrenzt CPU und RAM in der docker-compose.yml:

services:
  n8n:
    # ... bestehende Konfiguration
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 2G
        reservations:
          cpus: "1"
          memory: 1G

4. Updates durchführen

Regelmäßige Updates sind wichtig:

# Images aktualisieren
docker-compose pull

# Container neu starten
docker-compose up -d

# Alte Images aufräumen
docker image prune -a

Erweiterte Konfiguration

Custom Nodes installieren

Erstellt ein Dockerfile für Custom Nodes:

FROM n8nio/n8n:latest

USER root

# Custom Node installieren
RUN cd /usr/local/lib/node_modules/n8n && \
    npm install n8n-nodes-custom-package

USER node

Aktualisiert die docker-compose.yml:

services:
  n8n:
    build: .
    # statt: image: n8nio/n8n:latest

Mehrere n8n Instanzen (Queue Mode)

Für High-Availability Setup:

services:
  n8n-main:
    # Main Instance
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis

  n8n-worker:
    # Worker Instance
    command: worker
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis

  redis:
    image: redis:7-alpine

Troubleshooting

Problem: Container startet nicht

# Logs prüfen
docker-compose logs n8n

# Container neu erstellen
docker-compose down
docker-compose up -d --force-recreate

Problem: Webhooks funktionieren nicht

Überprüft die WEBHOOK_URL in der .env:

WEBHOOK_URL=https://n8n.euredomain.de/

Problem: Datenbank-Verbindung fehlgeschlagen

# PostgreSQL Container prüfen
docker-compose logs postgres

# Datenbank-Verbindung testen
docker exec -it n8n-postgres psql -U n8n -d n8n

Performance-Optimierung

1. PostgreSQL Tuning

Erstellt postgres.conf:

# Für 2GB RAM Server
shared_buffers = 512MB
effective_cache_size = 1536MB
maintenance_work_mem = 128MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 2621kB
min_wal_size = 1GB
max_wal_size = 4GB

2. n8n Execution Settings

In der .env:

# Execution Limits
EXECUTIONS_TIMEOUT=300
EXECUTIONS_TIMEOUT_MAX=600
EXECUTIONS_DATA_SAVE_ON_ERROR=all
EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true

Kosten-Vergleich: Self-Hosted vs. Cloud

Aspektn8n Cloudn8n Self-Hosted
Monatliche Kostenab 20€/MonatServer: ~5-20€/Monat
WorkflowsLimitiertUnbegrenzt
ExecutionsLimitiertUnbegrenzt
DatenkontrolleBei n8n100% bei euch
WartungsaufwandKeineGering (Updates, Backups)
SkalierungAutomatischManuell

Fazit: Ab ~5 Workflows lohnt sich n8n self-hosted finanziell.

Fazit: n8n Docker Compose lohnt sich

Mit n8n Docker Compose habt ihr in wenigen Minuten eine produktionsreife Workflow-Automation-Plattform am Laufen. Die Vorteile:

Volle Kontrolle über Daten und Infrastruktur
Kosteneffizient bei regelmäßiger Nutzung
Skalierbar nach euren Anforderungen
DSGVO-konform durch Self-Hosting
Professionell mit PostgreSQL und SSL

Der initiale Setup-Aufwand von 1-2 Stunden zahlt sich schnell aus. Mit den Best Practices aus diesem Guide habt ihr eine stabile, sichere und wartbare n8n-Installation.

Nächste Schritte

Ihr wollt n8n self-hosted produktiv einsetzen, aber euch fehlt die Zeit oder Expertise für Setup und Wartung? Wir bei Vinspire helfen euch:

  • Managed n8n Hosting auf eurer Infrastruktur
  • Custom Workflow-Entwicklung für eure Prozesse
  • Integration in bestehende Systeme (CRM, ERP, etc.)
  • Training & Support für euer Team

Kostenloses Erstgespräch: Kontakt aufnehmen


Habt ihr Fragen zum n8n Self-Hosting? Schreibt uns oder hinterlasst einen Kommentar!

Weitere Artikel:

Lasst uns über eure Zukunft sprechen

Habt ihr eine Idee, ein Projekt oder einfach eine Frage? Wir freuen uns auf eure Nachricht und melden uns innerhalb von 24 Stunden bei euch.

10+ Jahre Erfahrung
50+ Erfolgreiche Projekte
30+ Zufriedene Kunden
Kostenlose Erstberatung
Antwort innerhalb von 24h
Unverbindlich & vertraulich

Beschreibe kurz welchen Bereich du automatisieren möchtest oder welche System du verbinden willst.

Eure Nachricht wird von unserem Vinspire KI Agent "John" bearbeitet und an das passende Team weitergeleitet.