AutomatisierungFortgeschritten

n8n mit Docker Compose selbst hosten: Komplette Anleitung (2026)

30 Min. Setup📖 14 Min. LesezeitVeröffentlicht: 19. März 2026
n8n Workflow-Editor-Oberfläche mit einem mehrstufigen Automatisierungsworkflow

n8n ist eine Open-Source-Workflow-Automatisierungsplattform mit über 400 Integrationen. Sie erlaubt dir, Automatisierungen zwischen beliebigen APIs, Datenbanken oder Diensten über einen visuellen Knoten-Editor aufzubauen, ohne für die meisten Aufgaben Code schreiben zu müssen. Die selbst gehostete Version ist kostenlos ohne Workflow- oder Ausführungslimits, anders als die Cloud-Version, die pro Ausführung berechnet.

Diese Anleitung behandelt ein produktionsbereites self-hosted n8n-Deployment: Docker Compose mit PostgreSQL für zuverlässige Datenspeicherung, einen Nginx-Reverse-Proxy und SSL über Let's Encrypt. Du konfigurierst auch Webhook-URLs, richtest Basic-Authentication ein und lernst, wie du n8n bei neuen Versionen aktualisierst.

Am Ende hast du n8n auf deinem eigenen Server laufen, über HTTPS unter deiner Domain erreichbar, mit in einer PostgreSQL-Datenbank persistierten Daten. Wenn du die manuelle Installation überspringen möchtest, bietet Contabo vorinstallierte n8n-VPS-Pläne ab €4,50/Monat an, wo n8n innerhalb von Minuten nach der Bestellung einsatzbereit ist.

Voraussetzungen

  • Einen Linux-Server oder VPS (Ubuntu 22.04 empfohlen) mit mindestens 1 GB RAM
  • Docker Engine 24.x+ installiert
  • Docker Compose 2.x+ installiert (im Lieferumfang von Docker Desktop oder als Docker Compose-Plugin)
  • Einen Domainnamen, der auf die IP-Adresse deines Servers zeigt (für SSL-Setup)
  • Port 80 und 443 in deiner Firewall geöffnet
  • Grundkenntnisse in der Linux-Kommandozeile

Wenn du die manuelle Installation überspringen möchtest, bietet Contabo vorinstallierte n8n-VPS-Pläne an, wo n8n innerhalb von Minuten nach der Bestellung einsatzbereit ist.

Contabo Cloud VPS 10€5,45/Monat →
Inhaltsverzeichnis

Projektverzeichnis erstellen

Zunächst ein dediziertes Verzeichnis für die n8n-Installation und benötigte Dateien erstellen.

bash
# Projektverzeichnis erstellen und aufrufen
mkdir -p ~/n8n && cd ~/n8n

In diesem Verzeichnis werden drei Dateien erstellt:

  • docker-compose.yml — definiert die n8n- und PostgreSQL-Dienste
  • .env — speichert Konfigurationswerte und Zugangsdaten
  • nginx.conf — die Nginx-Reverse-Proxy-Konfiguration (später hinzugefügt)

Konfigurationsdatei (.env) erstellen

Die .env-Datei enthält deine Konfiguration. Jetzt erstellen und alle Werte ausfüllen, bevor die Container gestartet werden.

bash
nano ~/n8n/.env

Folgendes einfügen und jeden Wert in < > durch eigene Werte ersetzen:

ini
# n8n Kernkonfiguration
N8N_HOST=deine-domain.de
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://deine-domain.de

# Verschlüsselungskey (einen zufälligen 32-Zeichen-String erzeugen)
# Ausführen: openssl rand -hex 16
N8N_ENCRYPTION_KEY=dein_32_zeichen_zufalls_string_hier

# Basic Auth (schützt die n8n-Oberfläche mit einem Login)
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=dein_sicheres_passwort

# PostgreSQL-Datenbank
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=dein_db_passwort

# Zeitzone (für geplante Workflows)
GENERIC_TIMEZONE=Europe/Berlin

# Optional: Telemetrie deaktivieren
N8N_DIAGNOSTICS_ENABLED=false
N8N_PERSONALIZATION_ENABLED=false

Einen sicheren Verschlüsselungskey erzeugen:

bash
openssl rand -hex 16
# Beispielausgabe: a3f8c2d1e4b5097634a1f2e3d4c5b6a7

Diese Ausgabe in den N8N_ENCRYPTION_KEY-Wert kopieren. Dieser Key verschlüsselt gespeicherte Zugangsdaten. Wenn du ihn verlierst oder änderst, werden alle gespeicherten Zugangsdaten unlesbar.

⚠️
Warnung:Die .env-Datei und den N8N_ENCRYPTION_KEY-Wert sicher sichern. Bei Wiederherstellung oder Migration der n8n-Instanz wird dieser exakte Key benötigt, um gespeicherte Zugangsdaten zu entschlüsseln.

Docker Compose-Datei erstellen

Die docker-compose.yml-Datei erstellen, die die n8n- und PostgreSQL-Dienste definiert:

bash
nano ~/n8n/docker-compose.yml

Folgendes einfügen:

yaml
version: '3.8'

volumes:
  n8n_data:
  postgres_data:

services:
  postgres:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: n8n
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${DB_POSTGRESDB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -h localhost -U n8n -d n8n']
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: n8nio/n8n:latest
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=${N8N_HOST}
      - N8N_PORT=${N8N_PORT}
      - N8N_PROTOCOL=${N8N_PROTOCOL}
      - WEBHOOK_URL=${WEBHOOK_URL}
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
      - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
      - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
      - DB_TYPE=${DB_TYPE}
      - DB_POSTGRESDB_HOST=${DB_POSTGRESDB_HOST}
      - DB_POSTGRESDB_PORT=${DB_POSTGRESDB_PORT}
      - DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE}
      - DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER}
      - DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD}
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - N8N_DIAGNOSTICS_ENABLED=${N8N_DIAGNOSTICS_ENABLED}
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
ℹ️
Hinweis:Diese Konfiguration verwendet n8nio/n8n:latest. Für Produktions-Deployments eine spezifische Version pinnen (z.B. n8nio/n8n:1.85.0), damit Updates nur bei bewusster Entscheidung erfolgen. Die neueste Version unter github.com/n8n-io/n8n/releases prüfen.

n8n starten

Mit den fertigen .env- und docker-compose.yml-Dateien die Dienste starten:

bash
cd ~/n8n
docker compose up -d

Docker lädt die Images herunter (erster Durchlauf dauert 1-3 Minuten) und startet beide Container. Prüfen, ob beide laufen:

bash
docker compose ps

Erwartete Ausgabe:

bash
NAME           IMAGE                 COMMAND                  SERVICE    STATUS
n8n-n8n-1      n8nio/n8n:latest      "tini -- /docker-ent…"   n8n        Up 30 seconds
n8n-postgres-1 postgres:15-alpine    "docker-entrypoint.s…"   postgres   Up 32 seconds (healthy)

Die n8n-Logs auf Startbestätigung prüfen:

bash
docker compose logs n8n | tail -20

Diese Zeile bestätigt, dass n8n erfolgreich gestartet ist:

bash
n8n ready on 0.0.0.0, port 5678

An diesem Punkt ist n8n unter http://deine-server-ip:5678 erreichbar. Der nächste Abschnitt fügt Nginx und SSL hinzu, sodass es stattdessen unter https://deine-domain.de erreichbar ist.

Nginx Reverse Proxy und SSL einrichten

Ein Reverse Proxy übernimmt die HTTPS-Terminierung und leitet Anfragen an n8n auf Port 5678 weiter. Nginx und Certbot installieren:

bash
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

Die Nginx-Konfiguration für deine Domain erstellen:

bash
sudo nano /etc/nginx/sites-available/n8n

Folgendes einfügen und deine-domain.de durch deine tatsächliche Domain ersetzen:

nginx
server {
    listen 80;
    server_name deine-domain.de;

    location / {
        proxy_pass http://localhost:5678;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket-Unterstützung (für n8n UI Live-Updates erforderlich)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 300;
        proxy_connect_timeout 300;
    }
}

Site aktivieren und Konfiguration testen:

bash
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n
sudo nginx -t
# Erwartet: nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx

Ein SSL-Zertifikat von Let's Encrypt beziehen:

bash
sudo certbot --nginx -d deine-domain.de

Certbot ändert deine Nginx-Konfiguration für HTTPS und richtet automatische Verlängerung ein. Danach ist n8n unter https://deine-domain.de erreichbar.

Automatische SSL-Zertifikat-Verlängerung prüfen:

bash
sudo certbot renew --dry-run
# Erwartet: Congratulations, all simulated renewals succeeded

n8n auf eine neue Version aktualisieren

Wenn n8n eine neue Version veröffentlicht, das Deployment durch Herunterladen des neuen Images und Neuerstellen des Containers aktualisieren:

bash
cd ~/n8n

# Neuestes Image herunterladen
docker compose pull n8n

# Den n8n-Container mit dem neuen Image neu erstellen
# --no-deps: nur den n8n-Dienst neu starten, nicht postgres
docker compose up -d --no-deps n8n

Die laufende Version nach dem Update prüfen:

bash
docker compose exec n8n n8n --version
ℹ️
Hinweis:n8n führt Datenbankmigrationen automatisch beim Start durch. Diese sind im Allgemeinen sicher, aber immer das n8n-Changelog auf Breaking Changes prüfen, bevor eine Produktionsinstanz aktualisiert wird. Ein PostgreSQL-Backup vor größeren Versions-Updates ist empfehlenswert.

n8n-Daten sichern

n8n-Daten vor Updates oder Migrationen sichern:

bash
# Alle Workflows als JSON exportieren
docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/workflows-backup.json

# Das Backup aus dem Container auf den Host kopieren
docker cp n8n-n8n-1:/home/node/.n8n/workflows-backup.json ./workflows-backup.json

Fehlerbehebung

ProblemUrsacheLösung
n8n-Container beendet sich sofort nach dem StartPostgreSQL ist noch nicht bereit, wenn n8n versucht sich zu verbinden. Passiert meist beim ersten Start, bevor der Healthcheck anschlägtMit docker compose logs postgres prüfen, ob PostgreSQL startet. Das depends_on: condition: service_healthy in der Compose-Datei sollte dies behandeln. Wenn es fehlschlägt: 10 Sekunden warten und docker compose up -d erneut ausführen.
Keine Verbindung zu n8n auf Port 5678 möglichFirewall blockiert Port 5678 oder n8n bindet nur an 127.0.0.1Prüfen, ob Port 5678 geöffnet ist: sudo ufw status. Zum Erlauben: sudo ufw allow 5678. Bei Nginx als Reverse Proxy muss Port 5678 nicht öffentlich exponiert sein — aus UFW entfernen und n8n über Port 443 aufrufen.
Webhooks empfangen keine AnfragenDie WEBHOOK_URL in .env stimmt nicht mit der Domain überein, unter der n8n erreichbar ist, sodass n8n falsche Webhook-URLs erzeugtWEBHOOK_URL auf die exakte öffentliche URL setzen: WEBHOOK_URL=https://deine-domain.de. Dann n8n neu starten: docker compose restart n8n. Webhook-Trigger nach der URL-Änderung neu erstellen.
SSL-Zertifikat kann nicht ausgestellt werden ("Connection refused" in Certbot)Port 80 durch Firewall blockiert oder DNS der Domain noch nicht propagiertPort 80 öffnen: sudo ufw allow 80. Prüfen, ob die Domain zur Server-IP auflöst: dig deine-domain.de. DNS-Propagierung kann bis zu 48 Stunden dauern.
Zugangsdaten zeigen "Could not decrypt"-Fehler nach WiederherstellungDer N8N_ENCRYPTION_KEY in .env stimmt nicht mit dem Key überein, der beim Speichern der Zugangsdaten verwendet wurdeDie originale .env-Datei mit dem korrekten N8N_ENCRYPTION_KEY wiederherstellen. Dieser Key muss exakt übereinstimmen. Wenn der ursprüngliche Key verloren ist, können Zugangsdaten nicht wiederhergestellt und müssen neu eingegeben werden.

Alternativen

ToolArtPreisIdeal für
ZapierCloud SaaSKostenlos (100 Tasks/Monat), kostenpflichtig ab $19,99/MonatNicht-technische Nutzer, die verwaltete Infrastruktur ohne Server-Wartung wollen
Make (früher Integromat)Cloud SaaSKostenlos (1.000 Operationen/Monat), kostenpflichtig ab $9/MonatTeams, die komplexere Logik als Zapier zu niedrigeren Kosten benötigen
ActivepiecesSelf-Hosted oder CloudKostenlos (self-hosted), Cloud ab $0n8n-Alternative mit ähnlichem Open-Source-Self-Hosted-Modell und wachsender Integrationsbibliothek
PipedreamCloud SaaSKostenlos (10.000 Aufrufe/Monat)Entwickler, die Node.js-Code in Workflows neben No-Code-Komponenten schreiben möchten

Häufige Fragen

Ist die selbst gehostete n8n-Version kostenlos?

Ja. Die selbst gehostete n8n Community Edition ist kostenlos ohne Workflow-Limits, keine Ausführungslimits und keine Feature-Einschränkungen. Du kannst so viele Workflows mit so vielen Ausführungen betreiben, wie dein Server verarbeiten kann.

Die n8n-Cloud-Preise gelten nur für deren verwalteten Hosting-Dienst. Beim Self-Hosting zahlst du nur für deinen Server. Ein Contabo Cloud VPS 10 für €5,45/Monat verarbeitet die meisten persönlichen und kleinen Unternehmens-n8n-Workloads problemlos.

Warum PostgreSQL statt SQLite für n8n verwenden?

n8n verwendet standardmäßig SQLite, empfiehlt aber PostgreSQL für Produktions-Deployments. SQLite speichert alles in einer einzigen Datei, die bei hohem Workflow-Ausführungsvolumen und parallelen Ausführungen zum Engpass werden kann. PostgreSQL verarbeitet parallelen Zugriff besser, unterstützt größere Datensätze und hat robustere Crash-Recovery.

Für persönliche Nutzung mit wenigen Workflows funktioniert SQLite gut. Für alles, das Webhook-ausgelöste Workflows in großem Umfang verarbeitet (100+ Ausführungen pro Tag), PostgreSQL verwenden. Das Docker-Compose-Setup in dieser Anleitung verwendet standardmäßig PostgreSQL, da es die sicherere Wahl für Wachstum ist.

Wie greife ich von außerhalb meines Netzwerks auf n8n zu?

Das Nginx-Reverse-Proxy-Setup in dieser Anleitung exponiert n8n über HTTPS unter deiner Domain, sodass es von überall erreichbar ist, sobald DNS konfiguriert ist. Wenn du n8n auf einem Heimserver ohne öffentliche IP betreibst, Cloudflare Tunnel oder Ngrok verwenden, um den lokalen Port ohne Öffnen der Router-Firewall zugänglich zu machen.

Für Webhook-ausgelöste Workflows muss n8n öffentlich unter der in WEBHOOK_URL gesetzten URL erreichbar sein. Dienste wie Zapier, Stripe oder GitHub senden Webhook-POST-Anfragen an diese URL, wenn Ereignisse auftreten.

Kann ich n8n auf einem Server mit 512 MB RAM betreiben?

Technisch ja, aber 512 MB RAM sind nicht komfortabel. Der n8n-Prozess selbst verbraucht 200-400 MB im Leerlauf. Bei komplexen Workflows oder mehreren parallelen Ausführungen kann die Speichernutzung steigen, bis der Container vom OS beendet wird. 1 GB RAM ist das praktische Minimum für ein stabiles Deployment. 2 GB sind für Workflows empfohlen, die große Datensätze oder Browser-Automatisierungsschritte umfassen.

Wie aktualisiere ich n8n ohne Verlust meiner Workflows?

Workflows werden in der PostgreSQL-Datenbank gespeichert, nicht im Docker-Container. Das Aktualisieren des Containers betrifft gespeicherte Workflows, Zugangsdaten oder Ausführungshistorie nicht.

Vor dem Upgrade Workflows als Backup exportieren: docker compose exec n8n n8n export:workflow --all --output=/home/node/.n8n/backup.json. Dann neues Image laden und neu starten: docker compose pull n8n && docker compose up -d --no-deps n8n. n8n führt alle erforderlichen Datenbankmigrationen beim Start automatisch durch.

Was ist der Unterschied zwischen n8n und Zapier?

Die Hauptunterschiede sind Kosten, Datenschutz und Flexibilität. n8n self-hosted ist kostenlos ohne Ausführungslimits. Zapier berechnet nach der kostenlosen Stufe (100 Tasks/Monat) pro Task. Für ein Unternehmen, das monatlich 10.000+ automatisierte Tasks durchführt, spart self-hosted n8n im Vergleich zu Zapier Hunderte von Euro pro Monat.

n8n unterstützt benutzerdefinierte JavaScript- und Python-Code-Knoten, direkte SQL-Datenbankabfragen, SSH-Verbindungen und komplexe Verzweigungslogik. Zapier ist für einfachere lineare Automatisierungen zwischen beliebten Apps konzipiert. n8n hat eine steilere Lernkurve, verarbeitet aber deutlich komplexere Workflows.

Server für dieses Projekt

Contabo (gegründet 2003 in München) bietet VPS mit unbegrenztem Traffic, vollem Root-Zugriff und Rechenzentren in Deutschland, USA, Singapur und weiteren Regionen.

Contabo Cloud VPS 10€5,45/Monat ansehen →

Affiliate-Link. Provision bei Kauf, ohne Mehrkosten für dich.

Verwandte Anleitungen

Zurück zu den Anleitungen