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

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.
# Projektverzeichnis erstellen und aufrufen
mkdir -p ~/n8n && cd ~/n8nIn diesem Verzeichnis werden drei Dateien erstellt:
docker-compose.yml— definiert die n8n- und PostgreSQL-Dienste.env— speichert Konfigurationswerte und Zugangsdatennginx.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.
nano ~/n8n/.envFolgendes einfügen und jeden Wert in < > durch eigene Werte ersetzen:
# 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=falseEinen sicheren Verschlüsselungskey erzeugen:
openssl rand -hex 16
# Beispielausgabe: a3f8c2d1e4b5097634a1f2e3d4c5b6a7Diese 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.
.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:
nano ~/n8n/docker-compose.ymlFolgendes einfügen:
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_healthyn8nio/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:
cd ~/n8n
docker compose up -dDocker lädt die Images herunter (erster Durchlauf dauert 1-3 Minuten) und startet beide Container. Prüfen, ob beide laufen:
docker compose psErwartete Ausgabe:
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:
docker compose logs n8n | tail -20Diese Zeile bestätigt, dass n8n erfolgreich gestartet ist:
n8n ready on 0.0.0.0, port 5678An 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:
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginxDie Nginx-Konfiguration für deine Domain erstellen:
sudo nano /etc/nginx/sites-available/n8nFolgendes einfügen und deine-domain.de durch deine tatsächliche Domain ersetzen:
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:
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 nginxEin SSL-Zertifikat von Let's Encrypt beziehen:
sudo certbot --nginx -d deine-domain.deCertbot ä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:
sudo certbot renew --dry-run
# Erwartet: Congratulations, all simulated renewals succeededn8n auf eine neue Version aktualisieren
Wenn n8n eine neue Version veröffentlicht, das Deployment durch Herunterladen des neuen Images und Neuerstellen des Containers aktualisieren:
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 n8nDie laufende Version nach dem Update prüfen:
docker compose exec n8n n8n --versionn8n-Daten sichern
n8n-Daten vor Updates oder Migrationen sichern:
# 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.jsonFehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| n8n-Container beendet sich sofort nach dem Start | PostgreSQL ist noch nicht bereit, wenn n8n versucht sich zu verbinden. Passiert meist beim ersten Start, bevor der Healthcheck anschlägt | Mit 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öglich | Firewall blockiert Port 5678 oder n8n bindet nur an 127.0.0.1 | Prü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 Anfragen | Die WEBHOOK_URL in .env stimmt nicht mit der Domain überein, unter der n8n erreichbar ist, sodass n8n falsche Webhook-URLs erzeugt | WEBHOOK_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 propagiert | Port 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 Wiederherstellung | Der N8N_ENCRYPTION_KEY in .env stimmt nicht mit dem Key überein, der beim Speichern der Zugangsdaten verwendet wurde | Die 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
| Tool | Art | Preis | Ideal für |
|---|---|---|---|
| Zapier | Cloud SaaS | Kostenlos (100 Tasks/Monat), kostenpflichtig ab $19,99/Monat | Nicht-technische Nutzer, die verwaltete Infrastruktur ohne Server-Wartung wollen |
| Make (früher Integromat) | Cloud SaaS | Kostenlos (1.000 Operationen/Monat), kostenpflichtig ab $9/Monat | Teams, die komplexere Logik als Zapier zu niedrigeren Kosten benötigen |
| Activepieces | Self-Hosted oder Cloud | Kostenlos (self-hosted), Cloud ab $0 | n8n-Alternative mit ähnlichem Open-Source-Self-Hosted-Modell und wachsender Integrationsbibliothek |
| Pipedream | Cloud SaaS | Kostenlos (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.