Installation von n8n mit Docker und PostgreSQL
n8n ist eine Workflow-Automatisierungsplattform, die Sie auf Ihrem eigenen Server betreiben können. Eine selbst gehostete Instanz hält Ihre Workflows, Anmeldeinformationen und Ausführungsdaten unter Ihrer Kontrolle und hat keine Limits für die Anzahl der Workflows oder Ausführungen, abgesehen von dem, was der Server bewältigen kann.
Diese Anleitung richtet n8n auf einem dedizierten Server mit PostgreSQL, HTTPS und Backups ein. Sie verwendet drei von Docker Compose verwaltete Container:
- n8n, die Automatisierungsplattform selbst;
- PostgreSQL, die Datenbank für Workflows, Anmeldeinformationen und den Ausführungsverlauf;
- Caddy, ein Reverse-Proxy, der automatisch ein HTTPS-Zertifikat anfordert und erneuert.
Standardmäßig speichert n8n seine Daten in SQLite. Diese Anleitung verwendet stattdessen PostgreSQL: Es kann gesichert werden, während n8n läuft, und es ist die Datenbank, die n8n für das Self-Hosting empfiehlt.
Die Schritte wurden auf Ubuntu 24.04 LTS mit n8n 2.46.7, PostgreSQL 17, Docker 29 und Docker Compose v5 getestet.
Bevor Sie beginnen
Sie benötigen:
- einen Server mit Ubuntu 24.04 LTS und Root-Zugang über SSH;
- eine Domain oder Subdomain für n8n, zum Beispiel
n8n.example.com; - einen A-Eintrag für diesen Namen, der auf die IPv4-Adresse des Servers zeigt.
Wenn die Domain auch einen AAAA-Eintrag hat, muss der Server unter dieser Adresse über IPv6 erreichbar sein. Andernfalls versucht Let's Encrypt möglicherweise zuerst IPv6 und schlägt bei der Ausstellung des Zertifikats fehl.
Überprüfen Sie, ob der Eintrag auf Ihren Server auflöst, bevor Sie fortfahren:
dig +short n8n.example.com
Der Befehl sollte die IP-Adresse des Servers zurückgeben. Die Zertifikatsausstellung in Caddy hängt davon ab, warten Sie also, bis sich die DNS-Änderung verbreitet hat.
Alle folgenden Befehle werden als Root ausgeführt. Wenn Sie als normaler Benutzer mit sudo-Rechten arbeiten, fügen Sie vor jedem Befehl sudo hinzu.
Docker installieren
Installieren Sie Docker Engine und das Compose-Plugin aus dem offiziellen Docker-Repository. Das Paket docker.io aus dem Ubuntu-Repository ist älter und enthält nicht Compose v2.
apt update && apt install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc
Fügen Sie das Repository hinzu:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list
Installieren Sie die Pakete:
apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Überprüfen Sie, ob beide Tools verfügbar sind:
docker --version docker compose version
Projektverzeichnis und Geheimnisse erstellen
Alle n8n-Dateien befinden sich in /opt/n8n:
mkdir -p /opt/n8n && cd /opt/n8n
Erstellen Sie die Datei .env mit Ihrer Domain, Zeitzone und generierten Geheimnissen. Ersetzen Sie n8n.example.com und die Zeitzone durch Ihre eigenen Werte:
cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env
GENERIC_TIMEZONE legt die Zeitzone fest, die vom Schedule Trigger und anderen zeitbasierten Nodes verwendet wird. Ohne diesen Wert verwendet n8n America/New_York.
N8N_ENCRYPTION_KEY ist der Schlüssel, den n8n verwendet, um die darin gespeicherten Anmeldeinformationen zu verschlüsseln: API-Tokens, Passwörter, OAuth-Geheimnisse. Wenn dieser Schlüssel verloren geht, können die Anmeldeinformationen in einer wiederhergestellten Datenbank nicht entschlüsselt werden und müssen alle erneut eingegeben werden.
Kopieren Sie die Datei .env sofort an einen sicheren Ort außerhalb des Servers, zum Beispiel in einen Passwort-Manager. Ein Datenbank-Backup ohne N8N_ENCRYPTION_KEY stellt Ihre Workflows wieder her, aber nicht Ihre Anmeldeinformationen.
Die Docker Compose-Datei erstellen
Erstellen Sie /opt/n8n/compose.yaml:
services: postgres: image: postgres:17 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s 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_PORT: 5432 DB_POSTGRESDB_DATABASE: ${POSTGRES_DB} DB_POSTGRESDB_USER: ${POSTGRES_USER} DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD} N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:
Einige Details in dieser Datei sind für die Sicherheit und Stabilität wichtig.
PostgreSQL hat keinen Ports-Abschnitt. Die Datenbank ist nur von den anderen Containern im Projekt erreichbar, niemals aus dem Internet.
Der n8n-Port wird als 127.0.0.1:5678 veröffentlicht. Benutzer erreichen n8n nur über Caddy via HTTPS, während Sie n8n lokal auf dem Server weiterhin überprüfen können.
Kürzen Sie die n8n-Port-Zeile nicht auf 5678:5678. Docker fügt eigene Firewall-Regeln für veröffentlichte Ports hinzu, die UFW umgehen. Ohne das Präfix 127.0.0.1 wird n8n über einfaches HTTP von überall aus erreichbar, selbst wenn UFW den Port 5678 blockiert.
Die depends_on-Bedingung mit einem Healthcheck sorgt dafür, dass n8n wartet, bis PostgreSQL bereit ist, Verbindungen anzunehmen. Ohne diese Bedingung kann n8n bei einem Kaltstart zuerst starten und die Verbindung zur Datenbank fehlschlagen.
N8N_PROXY_HOPS teilt n8n mit, dass es hinter einem Reverse-Proxy läuft, sodass es die echte Client-Adresse aus den Proxy-Headern liest. N8N_WEBHOOK_URL legt die öffentliche Adresse fest, die n8n für Webhook-URLs anzeigt. In n8n-Versionen vor 2.30 heißt diese Variable WEBHOOK_URL.
HTTPS mit Caddy konfigurieren
Erstellen Sie /opt/n8n/Caddyfile mit Ihrer Domain:
n8n.example.com { reverse_proxy n8n:5678 }
Das ist die gesamte Konfiguration. Beim ersten Start fordert Caddy ein Let's Encrypt-Zertifikat für die Domain an, leitet HTTP auf HTTPS um und erneuert das Zertifikat, bevor es abläuft. Damit dies funktioniert, müssen die Ports 80 und 443 offen sein.
Die Firewall konfigurieren
Erlauben Sie zuerst SSH, dann HTTP und HTTPS, und aktivieren Sie UFW:
ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status
Wenn UFW bereits mit Ihren eigenen Regeln aktiviert war, führen Sie vor Änderungen ufw status aus und behalten Sie die Regeln bei, die Sie benötigen. Das Erlauben von OpenSSH vor der Aktivierung von UFW verhindert, dass Ihre aktuelle SSH-Sitzung unterbrochen wird.
n8n starten
Starten Sie die Container im Hintergrund:
cd /opt/n8n docker compose up -d
Der erste Start lädt die Images herunter und dauert ein oder zwei Minuten. Überprüfen Sie, ob alle drei Container laufen und PostgreSQL gesund (healthy) ist:
docker compose ps
Sehen Sie sich das n8n-Log an:
docker compose logs n8n --tail 50
Das Log sollte mit einer Zeile wie dieser enden:
Editor is now accessible via: https://n8n.example.com
Überprüfen Sie, ob n8n lokal und über Caddy antwortet:
curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz
Beide Befehle sollten {"status":"ok"} zurückgeben.
Wenn der zweite Befehl fehlschlägt, überprüfen Sie das Caddy-Log mit docker compose logs caddy. Die häufigste Ursache ist ein DNS-Eintrag, der noch nicht auf diesen Server zeigt, oder geschlossene Ports 80 und 443.
Das Eigentümerkonto erstellen
Öffnen Sie https://n8n.example.com in Ihrem Browser. Beim ersten Besuch fordert n8n Sie auf, das Eigentümerkonto zu erstellen. Dieses Konto hat volle Rechte über die Instanz und verwaltet alle anderen Benutzer.

Geben Sie Ihre E-Mail-Adresse, Ihren Vor- und Nachnamen sowie ein Passwort ein und klicken Sie auf Weiter. Das Passwort muss mindestens 8 Zeichen lang sein und mindestens eine Zahl und einen Großbuchstaben enthalten. Verwenden Sie ein sicheres Passwort: Der n8n-Editor ist für das Internet offen, und jeder, der Zugriff darauf erhält, kann über Ihre Workflows Befehle auf dem Server ausführen.
Nach der ersten Anmeldung zeigt n8n eine kurze Umfrage an: Customize n8n to you. Die Fragen sind optional. Klicken Sie auf Loslegen (Get started), um sie zu schließen, unabhängig davon, ob Sie sie beantwortet haben oder nicht.

Als Nächstes bietet n8n einen kostenlosen Lizenzschlüssel für mehrere Community Edition-Funktionen an: erweitertes Debugging, Ausführungssuche und Tagging sowie Ordner für Workflows. Der Schlüssel wird an die von Ihnen eingegebene E-Mail-Adresse gesendet. Klicken Sie auf Send me a free license key, um ihn zu erhalten, oder auf Überspringen (Skip), wenn Sie diese Funktionen nicht benötigen.

Die Übersichtsseite wird geöffnet. Die Installation ist abgeschlossen und Sie können Ihren ersten Workflow erstellen.

n8n sichern (Backup)
Ein n8n-Backup besteht aus zwei Teilen: einem PostgreSQL-Dump mit Ihren Workflows, Anmeldeinformationen, Benutzern und dem Ausführungsverlauf, und der Datei .env mit dem N8N_ENCRYPTION_KEY. Kein Teil ist ohne den anderen nützlich.
In diesem Setup speichert n8n seinen gesamten Zustand in PostgreSQL. Das Volume n8n_data muss nicht gesichert werden: Eine vollständige Wiederherstellung funktioniert allein aus dem Datenbank-Dump und der Datei .env.
Erstellen Sie ein Backup-Verzeichnis und dumpen Sie die Datenbank:
mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/
Der Dump wird erstellt, während n8n läuft, sodass keine Ausfallzeit erforderlich ist.
Ein Backup, das auf demselben Server verbleibt, hilft nicht, wenn die Festplatte des Servers ausfällt. Kopieren Sie /opt/n8n-backup regelmäßig auf einen externen Speicher. Sie können hierfür INTROSERV Cloud Storage verwenden, wie in der Anleitung Verbindung von INTROSERV Cloud Storage mit dem Server beschrieben.
Wiederherstellung aus einem Backup
Um n8n auf einem neuen Server wiederherzustellen, installieren Sie Docker wie oben beschrieben und kopieren Sie das Backup-Verzeichnis auf diesem Server nach /opt/n8n-backup. Platzieren Sie dann die Konfigurationsdateien an ihrem Platz:
mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env
Wenn der neue Server eine andere IP-Adresse hat, aktualisieren Sie zuerst den A-Eintrag der Domain.
Starten Sie nur die Datenbank:
cd /opt/n8n docker compose up -d postgres
Warten Sie, bis docker compose ps PostgreSQL als gesund (healthy) anzeigt, und stellen Sie dann den Dump wieder her:
docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump
Starten Sie den Rest des Stacks:
docker compose up -d
Melden Sie sich mit demselben Eigentümerkonto an und überprüfen Sie, ob Ihre Workflows und Anmeldeinformationen vorhanden sind. Gespeicherte Anmeldeinformationen werden mit dem N8N_ENCRYPTION_KEY aus der wiederhergestellten Datei .env entschlüsselt, sodass sie funktionieren, ohne erneut eingegeben werden zu müssen.
n8n aktualisieren
n8n veröffentlicht häufig Updates. Um auf die neueste Version zu aktualisieren, laden Sie die neuen Images herunter und erstellen Sie die Container neu:
cd /opt/n8n docker compose pull docker compose up -d docker image prune -f
Der letzte Befehl entfernt die alten Images, die nicht mehr verwendet werden.
Überprüfen Sie die neue Version:
docker compose exec n8n n8n --version
Erstellen Sie vor jedem Update ein Backup. Beim Start kann eine neue n8n-Version das Datenbankschema migrieren. Der zuverlässige Weg zurück zur vorherigen Version besteht daher darin, einen Dump wiederherzustellen, der vor dem Update erstellt wurde.
Das PostgreSQL-Image ist auf die Hauptversion 17 festgelegt, sodass docker compose pull nur Minor-Updates von PostgreSQL installiert. Der Wechsel zu einer neuen Hauptversion erfordert einen Dump und eine Wiederherstellung und erfolgt nicht automatisch.
Wie geht es weiter?
Ihre n8n-Instanz ist einsatzbereit. Von hier aus können Sie:
- andere Benutzer zur Instanz einladen;
- SMTP einrichten, damit n8n Einladungen und E-Mails zum Zurücksetzen des Passworts senden kann;
- Ihre Dienste verbinden und Ihre ersten Workflows erstellen.
Wenn Sie vorhaben, AI-Workflows mit lokalen Sprachmodellen auszuführen, lesen Sie die Anleitung Installation des n8n AI Starter Kits mit Ollama.