n8n mit Docker: KI-Workflows und Automatisierung self-hosted
n8n self-hosten mit Docker Compose: produktionsreifes Setup mit Postgres, HTTPS-Reverse-Proxy, Encryption-Key sichern, erster KI-Workflow mit dem AI Agent, plus Update- und Backup-Routine.

n8n self-hosten mit Docker macht aus einem kleinen Linux-Server eine vollwertige Automatisierungs-Zentrale: n8n (Aussprache „n-eight-n“) ist ein Open-Source-Workflow-Tool, mit dem Du per Drag-and-drop Dienste verbindest, Daten zwischen APIs umherschiebst und – das ist der spannende Teil – KI-Knoten wie den AI Agent mit Chat-Modellen, Memory und Vector-Stores zu echten LLM-Automatisierungen verkettest. Im Gegensatz zu reinen LLM-App-Plattformen wie Dify ist n8n eine generische Workflow-Engine: Du baust nicht nur Chatbots, sondern jede Art von Automatisierung – mit oder ohne KI. Diese Anleitung zeigt Dir Schritt für Schritt, wie Du n8n produktionsreif per Docker Compose mit Postgres betreibst, hinter HTTPS absicherst und den ersten KI-Workflow startest.
Voraussetzungen
n8n selbst ist eine Node.js-Anwendung und läuft rein CPU-basiert – Du brauchst keine GPU für n8n. Eine GPU ist nur relevant, wenn Du parallel ein lokales LLM (z. B. Ollama) betreibst, das n8n als Chat-Modell anspricht; dafür kommt das nvidia-container-toolkit ins Spiel (mehr dazu am Ende). Für n8n gilt:
- Betriebssystem: Linux-Server mit Docker Engine und Docker Compose Plugin, z. B. Debian 12 oder Ubuntu 24.04.
- Hardware (klein/Single-User): ca. 1 vCPU und 1–2 GB RAM reichen zum Ausprobieren.
- Hardware (produktiv mit Postgres): empfohlen 2 vCPU und 4 GB RAM.
- Docker: aktuelle Docker Engine plus
docker compose(v2-Plugin). Test:docker compose version. - Domain & HTTPS: für den Produktivbetrieb eine Subdomain (z. B.
n8n.DEINE-DOMAIN.de) mit gültigem TLS-Zertifikat über einen Reverse Proxy. Pflicht für Webhooks und OAuth. - Tools:
gitzum Klonen des Setups undopensslzum Erzeugen sicherer Schlüssel.
Wenn Docker Compose für Dich neu ist, lies vorab die Grundlagen zu Docker Compose und Stacks – die Begriffe Service, Volume und Healthcheck setze ich hier voraus.
Schritt 1: Offizielles Compose-Setup holen
n8n pflegt das Repository n8n-io/n8n-hosting mit einem fertigen, produktionsnahen Compose-Setup. Die Variante withPostgres enthält bereits alles: die docker-compose.yml, eine .env-Vorlage und ein init-data.sh, das beim ersten Start einen separaten Datenbank-Benutzer anlegt.
git clone https://github.com/n8n-io/n8n-hosting
cd n8n-hosting/docker-compose/withPostgres
ls -la
Du siehst dort docker-compose.yml, .env und init-data.sh. Wir arbeiten direkt in diesem Verzeichnis weiter. Wenn Du das Setup lieber an einen festen Ort wie /opt/n8n legst, kopiere die drei Dateien einfach dorthin.
Schritt 2: Sichere Werte erzeugen und in die .env eintragen
Die mitgelieferte .env enthält Platzhalter wie changeUser und changePassword. Diese musst Du vor dem ersten Start ersetzen – sonst läuft Deine Datenbank mit Default-Zugangsdaten. Erzeuge zunächst ein paar sichere Zufallswerte:
# Je einen Wert fuer DB-Passwort, Runner-Token und Encryption-Key:
openssl rand -hex 32 # -> Postgres-Passwort (root)
openssl rand -hex 32 # -> Postgres-Passwort (non-root)
openssl rand -hex 32 # -> RUNNERS_AUTH_TOKEN
openssl rand -hex 32 # -> N8N_ENCRYPTION_KEY
Trage die Werte in die .env ein. Eine produktionstaugliche Vorlage sieht so aus (echte Zufallswerte statt der Platzhalter einsetzen):
# Postgres
POSTGRES_USER=n8n_root
POSTGRES_PASSWORD=DEIN-ROOT-PASSWORT
POSTGRES_DB=n8n
POSTGRES_NON_ROOT_USER=n8n_app
POSTGRES_NON_ROOT_PASSWORD=DEIN-APP-PASSWORT
# n8n
N8N_VERSION=stable
RUNNERS_AUTH_TOKEN=DEIN-RUNNER-TOKEN
N8N_ENCRYPTION_KEY=DEIN-ENCRYPTION-KEY
# Domain / HTTPS (produktiv)
N8N_HOST=n8n.DEINE-DOMAIN.de
WEBHOOK_URL=https://n8n.DEINE-DOMAIN.de/
N8N_EDITOR_BASE_URL=https://n8n.DEINE-DOMAIN.de/
# Zeitzone
GENERIC_TIMEZONE=Europe/Berlin
TZ=Europe/Berlin
Merke Dir den N8N_ENCRYPTION_KEY an einem sicheren Ort. n8n verschlüsselt damit alle gespeicherten Credentials. Geht der Key verloren, sind sämtliche hinterlegten Zugangsdaten unbrauchbar – das ist die häufigste teure Panne beim Self-Hosting. Wenn Du den Key nicht selbst setzt, generiert n8n ihn beim ersten Start automatisch und legt ihn unter /home/node/.n8n/config im Volume ab; dann ist das Volume-Backup zwingend.
Schritt 3: Die docker-compose.yml verstehen und anpassen
Hier die vollständige, lauffähige docker-compose.yml in der withPostgres-Variante. Sie startet drei Dienste: postgres (Datenbank), n8n (die Anwendung mit Web-UI) und n8n-runner (ein separater Task-Runner-Container für die Code-Ausführung). Daten liegen in Named Volumes, damit sie Container-Neustarts überleben.
services:
postgres:
image: postgres:16
restart: always
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
- POSTGRES_NON_ROOT_USER
- POSTGRES_NON_ROOT_PASSWORD
volumes:
- db_storage:/var/lib/postgresql/data
- ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: always
environment:
# Datenbank
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD}
# Domain / HTTPS
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=${WEBHOOK_URL}
- N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL}
# Sicherheit
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
# Zeitzone
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${TZ}
# Task-Runner (extern)
- N8N_RUNNERS_ENABLED=true
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
ports:
- '5678:5678'
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
n8n-runner:
image: docker.n8n.io/n8nio/runners:${N8N_VERSION}
restart: always
environment:
- N8N_RUNNERS_AUTH_TOKEN=${RUNNERS_AUTH_TOKEN}
- N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
depends_on:
- n8n
volumes:
db_storage:
n8n_storage:
Drei Dinge sind wichtig: Der n8n-Container wartet per depends_on auf den Healthcheck von Postgres. Das Mapping 5678:5678 macht die Web-UI erreichbar. Und der Task-Runner verbindet sich über N8N_RUNNERS_TASK_BROKER_URI zurück zu n8n (Port 5679 ist der interne Broker-Port).
Schritt 4: Stack starten und Logs prüfen
Jetzt den Stack hochfahren:
docker compose up -d
docker compose ps
Alle drei Container sollten den Status running (Postgres zusätzlich healthy) zeigen. Falls etwas hakt, schau in die Logs:
docker compose logs -f n8n
Erscheint die Zeile Editor is now accessible via: ..., läuft n8n. Beachte: Umgebungsvariablen werden nur beim Container-Start gelesen. Änderst Du später die .env oder die compose-Datei, musst Du mit docker compose up -d neu erstellen – ein bloßer Anwendungs-Neustart greift nicht.
Schritt 5: Reverse Proxy mit HTTPS davorsetzen (Pflicht für Produktion)
n8n setzt per Default N8N_SECURE_COOKIE=true. Rufst Du die UI über http://SERVER-IP:5678 auf, verweigert n8n den Login mit der Meldung, dass ein Secure Cookie über eine unsichere URL nicht möglich ist. Lösung: ein Reverse Proxy mit TLS davor. Caddy ist dafür am schnellsten, weil es Let’s-Encrypt-Zertifikate automatisch holt. Eine minimale Caddyfile:
n8n.DEINE-DOMAIN.de {
reverse_proxy 127.0.0.1:5678
}
Alternativ mit Nginx als Reverse Proxy (Zertifikate z. B. per certbot):
server {
listen 443 ssl;
server_name n8n.DEINE-DOMAIN.de;
ssl_certificate /etc/letsencrypt/live/n8n.DEINE-DOMAIN.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.DEINE-DOMAIN.de/privkey.pem;
location / {
proxy_pass http://127.0.0.1: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;
# Webhooks/Editor brauchen WebSocket-Upgrade:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Wichtig: Setze WEBHOOK_URL und N8N_EDITOR_BASE_URL in der .env auf Deine öffentliche https://-Adresse (Schritt 2). Sonst zeigen Webhook- und OAuth-Callback-URLs auf localhost:5678, und externe Dienste erreichen n8n nicht. Nur für einen reinen lokalen Test ohne Proxy kannst Du übergangsweise N8N_SECURE_COOKIE=false setzen – niemals in Produktion.
Schritt 6: Web-UI öffnen und Owner-Account anlegen
Rufe die UI auf: produktiv https://n8n.DEINE-DOMAIN.de, beim lokalen Test http://localhost:5678. Beim ersten Aufruf zeigt n8n einen Setup-Screen, in dem Du den Owner-Account mit E-Mail und Passwort anlegst. Das ist das integrierte User-Management; das früher übliche N8N_BASIC_AUTH_ACTIVE ist abgekündigt und entfernt.
Nach dem Setup landest Du im Workflow-Editor. Lege Dir zum Aufwärmen einen ersten Mini-Workflow an: Füge einen Manual Trigger hinzu, danach einen Set-Node, der ein Feld hallo = welt erzeugt, und klicke auf Execute Workflow. So siehst Du sofort, dass Trigger, Node-Verkettung und Ausführung funktionieren.
Schritt 7: Ersten KI-Workflow mit dem AI Agent bauen
Jetzt der eigentliche Mehrwert: KI-Automatisierung über die Advanced-AI- bzw. LangChain-Knoten. Diese sind sogenannte Cluster Nodes: Ein Root-Node (AI Agent, intern n8n-nodes-langchain.agent) bündelt mehrere Sub-Nodes. So baust Du einen einfachen KI-Assistenten:
- Neuen Workflow anlegen und einen
Chat Triggerals Einstieg setzen (alternativManualoderWebhook). - Den Root-Node
AI Agenthinzufügen und mit dem Trigger verbinden. - Am AI Agent den Sub-Node Chat Model anhängen, z. B.
OpenAI Chat Model, und dort Deine API-Credentials hinterlegen. - Optional Simple Memory anhängen, damit der Agent den Gesprächsverlauf behält.
- Optional Tools (etwa HTTP-Request- oder Calculator-Tools) ergänzen, damit der Agent aktiv Aktionen ausführen kann.
- Für RAG einen Vector Store als Sub-Node anbinden – von
Simple/In-MemoryüberPGVectorbisQdrant.
Tippe in den Chat-Test eine Frage ein und beobachte, wie der Agent das Chat-Modell aufruft, ggf. Tools nutzt und antwortet. Genau hier wird der Unterschied zu reinen LLM-App-Plattformen sichtbar: In n8n hängst Du an die KI-Antwort beliebige weitere Workflow-Schritte – Datenbank-Eintrag, E-Mail, Ticket-System – und automatisierst so ganze Prozesse statt nur einen Chatbot.
Die LLM-Inferenz selbst läuft nicht in n8n: Du lagerst sie an eine externe API (OpenAI & Co.) oder an ein separates Ollama aus. Wer Embeddings und Vektorsuche lokal betreiben will, kombiniert n8n gut mit einem lokalen Qdrant-RAG-System mit Embeddings.
Schritt 8: Credentials sicher speichern und Verschlüsselung verstehen
Alle Zugangsdaten (API-Keys, OAuth-Tokens, DB-Passwörter), die Du in n8n hinterlegst, werden mit dem N8N_ENCRYPTION_KEY verschlüsselt und in der Postgres-Datenbank abgelegt. Der Schlüssel selbst liegt im n8n-Volume unter /home/node/.n8n. Daraus folgt die wichtigste Backup-Regel: Du musst beide Teile sichern – das n8n-Volume (Key und Settings) und die Postgres-DB (Workflows, Credentials, Executions). Sicherst Du nur eines, ist ein Restore wertlos.
Den Key kannst Du jederzeit aus dem Container prüfen:
docker compose exec n8n cat /home/node/.n8n/config
Schritt 9: Update und Backup
Der Update-Workflow ist bewusst simpel: neues Image ziehen, Container neu erstellen, Volumes bleiben erhalten.
docker compose pull
docker compose up -d
docker image prune -f
Backup hat zwei Teile. Erstens das n8n-Volume als Archiv (enthält Encryption-Key und Settings):
docker run --rm -v n8n_storage:/source -v $(pwd):/backup alpine \
tar czf /backup/n8n-backup-$(date +%Y%m%d).tar.gz -C /source .
Zweitens ein logischer Dump der Datenbank (enthält Workflows, Credentials, Verlauf):
docker compose exec postgres pg_dump -U "$POSTGRES_NON_ROOT_USER" n8n > n8n-db-$(date +%Y%m%d).sql
Bewahre beide Dateien zusammen auf und teste den Restore mindestens einmal. Hinweis zur Lizenz: Beim Self-Hosting gilt die n8n Community Edition unter der Sustainable Use License – für mehrere aktive Owner-/Enterprise-Features lohnt ein Blick in die Lizenzhinweise.
Troubleshooting
- Login schlägt fehl („configured to use a secure cookie … insecure URL“): Du rufst n8n über
httpoder eine IP auf. Setze einen Reverse Proxy mit TLS davor (Schritt 5) oder – nur zum Testen –N8N_SECURE_COOKIE=false. - Gespeicherte Credentials werden nach Neustart als unbrauchbar gemeldet: Der
N8N_ENCRYPTION_KEYhat sich geändert oder das Volume ging verloren. Stelle den ursprünglichen Key wieder her; ohne ihn lassen sich die Credentials nicht entschlüsseln. - Webhooks/OAuth-Redirects landen auf localhost:
WEBHOOK_URL(undN8N_EDITOR_BASE_URL) wurden nicht auf die öffentlichehttps-URL gesetzt. Werte korrigieren und mitdocker compose up -dneu erstellen. - Postgres-Login funktioniert nicht, obwohl Du das Passwort geändert hast:
init-data.shlegt den Non-Root-User nur beim Erst-Init des leeren DB-Volumes an. Nachträgliche Änderungen greifen erst nach einem DB-Reset (Volume neu). - Cron-/Schedule-Trigger feuern zur falschen Zeit:
GENERIC_TIMEZONE(DefaultAmerica/New_York) undTZgetrennt aufEurope/Berlinsetzen. - Änderungen an der .env wirken nicht: Env-Vars werden nur beim Start gelesen. Immer
docker compose up -d(Neuerstellung) statt nur Restart.
Häufige Fragen
Brauche ich für n8n eine GPU?
Nein. n8n läuft komplett CPU-basiert; versuche nicht, n8n eine GPU zuzuweisen. Eine GPU samt nvidia-container-toolkit ist nur dann sinnvoll, wenn Du ein separates lokales LLM wie Ollama in einem eigenen Container betreibst, das n8n dann als Chat-Modell anspricht. Für CPU-Betrieb genügt das normale Ollama-Image; für GPU-Betrieb gibst Du dem Ollama-Container per deploy.resources.reservations.devices Zugriff auf die NVIDIA-GPU.
SQLite oder Postgres – was soll ich nehmen?
Zum schnellen Ausprobieren reicht der ephemere docker run mit SQLite (Daten im Volume /home/node/.n8n). Produktiv solltest Du Postgres nehmen – das ist die Variante aus dieser Anleitung. Postgres skaliert besser und macht Backups sauberer.
Worin unterscheidet sich n8n von Dify?
Dify ist eine LLM-App-Plattform, die auf das Bauen von KI-Apps und Agenten spezialisiert ist. n8n ist eine generische Workflow-Automatisierung, bei der KI nur einer von vielen Knoten ist. In n8n verkettest Du KI-Antworten mit beliebigen weiteren Schritten (Datenbanken, E-Mail, APIs). Wenn Du primär KI-Apps brauchst, wirf einen Blick auf die Anleitung zu Dify als KI-App- und Agenten-Plattform.
Wozu der separate Runner-Container?
Der Task-Runner (n8nio/runners) führt Code-Knoten in einem isolierten Prozess aus. Das entlastet den Hauptprozess und ist die aktuelle, empfohlene Architektur. Er nutzt dasselbe Versions-Tag wie n8n und verbindet sich per N8N_RUNNERS_AUTH_TOKEN über den Broker-Port 5679 zurück zu n8n.
Wie aktualisiere ich auf eine bestimmte Version statt auf stable?
Setze in der .env N8N_VERSION auf einen konkreten Tag, z. B. 1.81.0. Verfügbar sind latest (stable), next (unstable) und konkrete Versionsnummern. Danach docker compose pull und docker compose up -d.
Was passiert, wenn ich nur die Datenbank sichere?
Dann fehlt Dir beim Restore der Encryption-Key aus dem n8n-Volume und alle Credentials in der DB bleiben unentschlüsselbar. Sichere immer beide Teile zusammen.
Fazit
Mit dem offiziellen withPostgres-Compose von n8n hast Du in unter einer halben Stunde eine produktionsnahe Automatisierungs-Plattform: Postgres als Datenbank, persistente Volumes, ein separater Task-Runner und die Web-UI auf Port 5678. Die zwei Dinge, die Du nicht vergessen darfst, sind ein Reverse Proxy mit HTTPS (wegen der Secure Cookies und für Webhooks/OAuth) und das Sichern von N8N_ENCRYPTION_KEY plus beider Datenspeicher. Danach steht Dir mit den AI-Agent-Knoten der gesamte Werkzeugkasten für KI-Automatisierung offen – von einfachen Chat-Assistenten bis zu komplexen RAG-Workflows mit Vector-Store. Weil n8n generisch ist, hängst Du an jede KI-Antwort beliebige weitere Schritte und automatisierst echte Geschäftsprozesse statt nur Gespräche.
Weiterführende Anleitungen und Quellen
Passende Anleitungen aus unserem Wissensbereich:
- Docker Compose Grundlagen und Stacks – Services, Volumes und Healthchecks verstehen.
- Dify als KI-App- und Agenten-Plattform mit Docker – die Abgrenzung zu n8n.
- Qdrant: lokales RAG-System mit Embeddings – passender Vector-Store für n8n.
- Weitere Anleitungen zur künstlichen Intelligenz.
Offizielle Quellen: