n8n läuft auf einem kleinen Server sehr gut, vorausgesetzt, es wird von Anfang an korrekt installiert. Die „Schnellversion“, die man oft online findet – ein einfacher Container, der auf Port 5678 mit einer SQLite-Datenbank bereitgestellt wird –, eignet sich zwar zum Testen, wirft jedoch im Produktivbetrieb drei Probleme auf: kein HTTPS, wodurch Webhooks von vielen Diensten abgelehnt werden; eine Datenbank, die gleichzeitige Schreibvorgänge nur schlecht unterstützt; und ein Port, der direkt ins Internet offen ist.
Dieser Leitfaden beschreibt eine saubere Installation, wie wir sie unseren Kunden empfehlen: n8n, PostgreSQL und den Reverse-Proxy Caddy, koordiniert durch Docker Compose, mit einem automatisch erneuerten HTTPS-Zertifikat. Rechnen Sie mit etwa zwanzig Minuten.
1. Was Sie benötigen
- Ein Linux-VPS unter Ubuntu 24.04 oder Debian 12 mit Root-Zugriff. Für den praktischen Einsatz sollten Sie mindestens 2 vCPUs und 4 GB RAM einplanen: n8n beansprucht vor allem Speicher, da jede Ausführung ihre Daten im RAM speichert. Unser Artikel Wie viel RAM und vCPU benötigt ein VPS? erläutert die Argumentation.
- Ein Domainname deren DNS-Zone Sie verwalten, um dort eine Subdomain wie
n8n.votre-domaine.fr. - Ein SSH-Zugang funktionsfähig. Falls es sich um einen neuen Server handelt, befolgen Sie zunächst die grundlegenden Anweisungen in unserer Anleitung Ihren VPS-Server absichern : Nicht-Root-Benutzer und SSH-Schlüssel.
SQLite, die Standarddatenbank von n8n, ist eine einfache Datei. Sie eignet sich für einige Workflows, kann jedoch gleichzeitige Schreibvorgänge nur unzureichend bewältigen, wenn mehrere Instanzen gleichzeitig laufen, und ihre Hot-Backup-Funktion ist schwierig zu handhaben. PostgreSQL behebt diese beiden Probleme und ermöglicht es später, n8n in den Warteschlangenmodus mit mehreren Workern zu versetzen.
2. Eine Subdomain auf den Server verweisen
Erstellen Sie im DNS-Bereich Ihrer Domain einen Eintrag vom Typ A für n8n die auf die IPv4-Adresse Ihres VPS verweist. Falls Ihr Server über eine IPv6-Adresse verfügt, fügen Sie bitte auch einen Eintrag hinzu AAAA. Überprüfen Sie anschließend die Auflösung von Ihrem Computer aus:
dig +short n8n.votre-domaine.fr
Der Befehl muss die IP-Adresse Ihres Servers zurückgeben. Fahren Sie nicht fort, solange dies nicht der Fall ist: Beim ersten Start fordert Caddy ein Zertifikat bei Let’s Encrypt an, das überprüft, ob die Domain tatsächlich auf den Rechner verweist. Ist die Propagierung noch nicht abgeschlossen, schlägt die Anfrage fehl, und wiederholte Fehlversuche lösen eine Frequenzbegrenzung aus, die weitere Versuche für eine gewisse Zeit blockiert.
3. Docker installieren
Auf unseren VPS-Servern lässt sich Docker bei der Bestellung mit einem Klick installieren. Auf einem bereits bereitgestellten Server übernimmt das offizielle Skript diese Aufgabe und installiert zudem das Compose-Plugin:
curl -fsSL https://get.docker.com | sh
docker --version
docker compose version
Die beiden letzten Befehle müssen eine Versionsnummer anzeigen. Wenn docker compose ist unbekannt; Sie verfügen über eine ältere Anlage, die docker-compose mit einem Bindestrich: Es ist ratsam, diesen durch die aktuelle Version zu ersetzen.
4. Konfigurieren Sie die Firewall
Es dürfen nur drei Ports geöffnet sein: SSH, HTTP zur Überprüfung des Zertifikats und HTTPS.
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Ein von Docker mit der Anweisung veröffentlichter Port ports ist im Internet erreichbar, auch wenn UFW den Zugriff blockiert, da Docker seine eigenen Netzwerkregeln vorab festlegt. Aus diesem Grund veröffentlicht in der folgenden Konfiguration nur Caddy Ports. n8n und PostgreSQL sind nur innerhalb des Docker-Netzwerks erreichbar. Fügen Sie niemals ports: 5678:5678 beim Dienst n8n.
5. Erstellen Sie die drei Konfigurationsdateien
Legen Sie einen eigenen Ordner an, zum Beispiel /opt/n8n, und begeben Sie sich dorthin. Beginnen Sie mit den Geheimnissen: einem Passwort für die Datenbank und dem Schlüssel, der die in n8n gespeicherten Anmeldedaten verschlüsselt.
mkdir -p /opt/n8n && cd /opt/n8n
echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" > .env
echo "N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)" >> .env
chmod 600 .env
Kopieren Sie unverzüglich den Wert von N8N_ENCRYPTION_KEY in Ihrem Passwort-Manager. Sollten Sie diesen verlieren, werden alle in Ihren Workflows gespeicherten Anmeldedaten unlesbar, selbst wenn eine vollständige Sicherung der Datenbank vorliegt.
Erstellen Sie anschließend die Datei docker-compose.yml :
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
retries: 5
n8n:
image: docker.n8n.io/n8nio/n8n
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: n8n.votre-domaine.fr
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n.votre-domaine.fr/
N8N_PROXY_HOPS: 1
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
GENERIC_TIMEZONE: Europe/Paris
TZ: Europe/Paris
volumes:
- n8n_data:/home/node/.n8n
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
volumes:
pg_data:
n8n_data:
caddy_data:
Einige Zeilen bedürfen einer Erläuterung:
healthcheckundcondition: service_healthy: n8n wartet, bis PostgreSQL tatsächlich Verbindungen akzeptiert, bevor es startet, anstatt beim ersten Start abzustürzen.WEBHOOK_URL: Ohne diese Angabe zeigt n8n interne Webhook-URLs vom Typhttp://localhost:5678, die von den Außenstellen nicht genutzt werden können.N8N_PROXY_HOPS: 1: Teilt n8n mit, dass es sich hinter einem Reverse-Proxy befindet, damit es die tatsächliche IP-Adresse der Besucher korrekt ausliest.GENERIC_TIMEZONE: Legt die Zeitzone fest, die von geplanten Auslösern verwendet wird. Ohne diese Angabe wird ein Workflow, der „täglich um 8 Uhr“ geplant ist, um 8 Uhr UTC ausgeführt.
Schließlich die Datei Caddyfile, das sich in drei Zeilen zusammenfassen lässt:
n8n.votre-domaine.fr {
reverse_proxy n8n:5678
}
Caddy erhält das Zertifikat, leitet HTTP auf HTTPS um, erneuert das Zertifikat vor dessen Ablauf und verwaltet die WebSockets, die der n8n-Editor benötigt – und das alles ohne zusätzliche Konfiguration.
6. Erststart
docker compose up -d
docker compose logs -f n8n
Warten Sie, bis die Zeile erscheint, die anzeigt, dass der Editor verfügbar ist, und verlassen Sie dann die Protokollanzeige mit Ctrl+C, was die Container jedoch nicht anhält. Öffnen Sie https://n8n.votre-domaine.fr : n8n fordert Sie auf, das Eigentümerkonto anzulegen.
Erledigen Sie dies bitte umgehend. Solange dieses Konto noch nicht existiert, kann die erste Person, die die Adresse aufruft, es für Sie erstellen. Aktivieren Sie anschließend die Zwei-Faktor-Authentifizierung in den Kontoeinstellungen und richten Sie für jede Person, die die Instanz nutzen wird, ein eigenes Konto ein.
7. Test- und Produktions-Webhooks verstehen
Der Webhook-Knoten von n8n zeigt zwei unterschiedliche Adressen an, was häufig zu Verwirrung führt:
- Die Test-URL, das Folgendes enthält
/webhook-test/, reagiert nur, wenn Sie im Editor auf „Testereignis abhören“ klicken, und zwar nur für einen einzigen Aufruf. - Die Produktions-URL, das Folgendes enthält
/webhook/, reagiert nur, wenn der Workflow aktiviert.
Ein Webhook, der einen 404-Fehler zurückgibt, obwohl alles korrekt konfiguriert zu sein scheint, ist fast immer auf eine der beiden folgenden Situationen zurückzuführen: Der aufrufende Dienst verwendet die Test-URL, oder der Workflow wurde nicht aktiviert.
8. n8n aktualisieren – ohne böse Überraschungen
n8n veröffentlicht sehr regelmäßig neue Versionen, von denen einige das Verhalten bestehender Knoten verändern. Anstatt blind der neuesten Version zu folgen, sollten Sie eine dreistufige Vorgehensweise anwenden:
- Bitte lesen Sie die Versionshinweise, insbesondere den Abschnitt über inkompatible Änderungen.
- Erstellen Sie mit dem Befehl aus dem folgenden Abschnitt eine Sicherungskopie der Datenbank.
- Laden Sie das neue Image herunter und starten Sie den Computer neu:
cd /opt/n8n
docker compose pull
docker compose up -d
docker image prune -f
In einer kritischen Umgebung ersetzen Sie bitte das Bild docker.n8n.io/n8nio/n8n durch eine bestimmte Version, zum Beispiel docker.n8n.io/n8nio/n8n:1.x.y mit der tatsächlichen Versionsnummer. Sie entscheiden dann selbst, wann Sie die Version wechseln, anstatt dies bei einem Neustart automatisch vornehmen zu müssen.
9. Die Instanz sichern
Zwei Elemente reichen aus, um Ihre Instanz vollständig wiederherzustellen: die PostgreSQL-Datenbank, die Workflows, verschlüsselte Anmeldedaten und den Verlauf enthält, sowie die Datei .env die den Verschlüsselungsschlüssel enthält. Automatisieren Sie einen täglichen Export der Datenbank:
mkdir -p /root/backups
crontab -e
Fügen Sie anschließend diese Zeile hinzu, die die Datenbank jede Nacht um 3 Uhr exportiert und die Exporte löscht, die älter als 14 Tage sind:
0 3 * * * cd /opt/n8n && docker compose exec -T postgres pg_dump -U n8n n8n | gzip > /root/backups/n8n-$(date +\%F).sql.gz && find /root/backups -name 'n8n-*.sql.gz' -mtime +14 -delete
Ein auf demselben Server gespeichertes Backup schützt weder vor Bedienungsfehlern auf dem Rechner noch vor einer Kompromittierung. Speichern Sie diese Dateien an einem anderen Ort: In unserer Dokumentation zu VPS-Backups mit Borg wird erläutert, wie Sie diese verschlüsseln und automatisch exportieren können. Und testen Sie die Wiederherstellung mindestens einmal: Nur so können Sie sicherstellen, dass ein Backup funktioniert.
10. Die häufigsten Probleme
Das HTTPS-Zertifikat wurde nicht ausgestellt
Lesen Sie docker compose logs caddy. In den allermeisten Fällen verweist die Subdomain noch nicht auf den Server, oder Port 80 ist geschlossen: Let's Encrypt benötigt diesen Port, um die Domain zu validieren.
Der Editor zeigt „Connection lost“ an
Der Editor kommuniziert in Echtzeit mit dem Server. Hinter Caddy funktioniert dies ohne weitere Einstellungen; das Problem tritt vor allem dann auf, wenn ein anderer, vorgelagerter Proxy die WebSockets nicht weiterleitet. Überprüfen Sie dessen Konfiguration.
Ausführungen schlagen ohne ersichtlichen Grund fehl
Starten Sie docker stats während der Ausführung eines ressourcenintensiven Workflows. Wenn der Speicher des n8n-Containers die vom Server festgelegte Obergrenze erreicht, wird der Prozess beendet. Es gibt zwei Lösungen: Verarbeiten Sie die Daten stapelweise mit dem Split-Knoten oder wechseln Sie zu einem Angebot mit mehr RAM.
Die Datenbank wächst ständig weiter
n8n speichert den Verlauf der Ausführungen. Begrenzen Sie die Aufbewahrungsdauer, indem Sie beispielsweise Folgendes hinzufügen: EXECUTIONS_DATA_MAX_AGE: 168 in den Umgebungsvariablen des n8n-Dienstes: Der Verlauf wird dann nach Ablauf von sieben Tagen gelöscht.
Subdomain eingerichtet · Docker installiert · Firewall auf die Ports 22, 80 und 443 beschränkt · n8n, PostgreSQL und Caddy in Compose · Verschlüsselungsschlüssel gesichert · Eigentümerkonto mit 2FA angelegt · Täglicher Datenbankexport wird außerhalb des Servers gespeichert.
Auf dieser Grundlage ist Ihre Instanz bereit für den Produktivbetrieb. Falls Sie noch unentschlossen sind, ob Sie n8n selbst hosten oder die Cloud-Version nutzen sollen, finden Sie in unserem Vergleich n8n Cloud oder selbst gehostet: Was kostet das wirklich? Vergleichen Sie die beiden Optionen. Und wenn Sie ein lokales KI-Modell in Ihre Arbeitsabläufe integrieren möchten, lesen Sie unseren Leitfaden Ollama auf einem VPS ohne GPU.
Weiterlesen
Welcher VPS eignet sich für das Hosting von WordPress?
RAM, vCPU, Festplatte: Welche VPS-Konfiguration eignet sich für eine WordPress-Website je nach Besucherzahl, mit oder ohne Control Panel, und wie hoch sind die tatsächlichen Kosten für das Hosting?
MetaTrader 4 oder 5 auf einem Windows-VPS installieren
Schritt-für-Schritt-Anleitung zur Installation von MetaTrader 4 oder 5 auf einem Windows-VPS: Broker-Terminal, Roboter (Expert Advisors), Betrieb rund um die Uhr, Neustart …
Intel Xeon Gold: Was sich für einen VPS ändert
Xeon Gold, ECC-Speicher, AVX-512: Was diese Merkmale im Vergleich zu einem Prozessor für den Consumer-Markt tatsächlich für einen VPS leisten und für welche Anwendungszwecke sie geeignet sind.
Häufig gestellte Fragen
Welche Mindestanforderungen gelten für die Installation von n8n auf einem VPS?
Für Testzwecke reichen 2 vCPU und 2 GB RAM aus. Für den Produktivbetrieb mit PostgreSQL sollten Sie mindestens 2 vCPU und 4 GB RAM einplanen, sowie 8 GB, falls Ihre Workflows Dateien verarbeiten oder KI-Modelle aufrufen.
Benötigt man für n8n zwingend einen Domainnamen?
Bei einer Instanz, die im Produktivbetrieb eingesetzt wird, ja. HTTPS erfordert ein Zertifikat, das wiederum mit einem Domainnamen verknüpft ist, und viele Dienste lehnen es ab, Webhooks an eine unverschlüsselte Adresse zu senden.
Warum gibt mein n8n-Webhook einen 404-Fehler zurück?
Entweder verwendet der aufrufende Dienst die Test-URL, die nur funktioniert, wenn der Listener vom Editor aus gestartet wurde, oder der Workflow ist nicht aktiviert, was jedoch unerlässlich ist, damit die Produktions-URL antwortet.
Was passiert, wenn ich den Schlüssel „N8N_ENCRYPTION_KEY“ verliere?
Die in n8n gespeicherten Anmeldedaten, wie API-Schlüssel und Passwörter, sind nicht mehr lesbar, selbst wenn die Datenbank intakt ist. Sie müssen diese Daten einzeln neu eingeben. Speichern Sie diesen Schlüssel in einem Passwort-Manager.










