Ein Update, und plötzlich sind alle in n8n gespeicherten Zugangsdaten „kaputt“. Oft ist gar nichts kaputt: Der Verschlüsselungsschlüssel ist bloß in einem Container geblieben, den es nicht mehr gibt.
Kurzantwort
Wie betreibst du n8n, das Werkzeug für automatisierte Abläufe (Workflows), selbst, ohne bei Updates und Wiederherstellungen Daten zu verlieren? Du startest das offizielle Image mit Docker Compose, legst /home/node/.n8n in ein Volume, gibst Port 5678 nur auf 127.0.0.1 frei und lässt einen Reverse Proxy HTTPS übernehmen [1][2]. Das Image nagelst du auf eine feste Version fest: Mit Stand 25.10.2026 ist 2.44.6 die aktuelle stabile Version [2][3]. Vor jedem Update sicherst du den Ordner .n8n, denn darin liegt der Schlüssel, der alle gespeicherten Zugangsdaten entschlüsselt [4]. Unter der Sustainable Use License ist das Selbsthosten für eigene interne Geschäftszwecke und für private oder nicht kommerzielle Nutzung frei. Nicht abgedeckt ist, n8n Kunden bereitzustellen, damit diese ihre Konten verbinden und Workflows bauen [5].
So funktioniert’s
- Was n8n wo ablegt. Standardmäßig speichert n8n Zugangsdaten, Ausführungen und Workflows in einer SQLite-Datenbank [2]. Die Datenbankdatei liegt im Ordner
.n8n, neben einer Datei namensconfigmit dem Verschlüsselungsschlüssel und neben Binär- und Ausführungsdaten, falls diese auf der Platte landen [4]. Im offiziellen Docker-Aufbau ist dieser Ordner das Volumen8n_data, eingehängt unter/home/node/.n8n[1][4]. Behalte das Volume auch nach einem Wechsel zu PostgreSQL. Der Ordner enthält weiterhin Verschlüsselungsschlüssel und Instanz-Logs, und n8n rät, ihn auf einem dauerhaften Volume zu lassen [2]. - Der wichtigste Schlüssel. Beim ersten Start erzeugt n8n einen zufälligen Verschlüsselungsschlüssel, speichert ihn im Ordner
.n8nund verschlüsselt damit Zugangsdaten, bevor sie in die Datenbank kommen [6][7]. Ohne diesen Schlüssel lassen sich weder eine wiederhergestellte Datenbank noch ein verschlüsselter Export der Zugangsdaten entschlüsseln [4]. Einen eigenen Schlüssel setzt du mitN8N_ENCRYPTION_KEY, aber nur, solange noch keiner in der Einstellungsdatei steht [6]. n8n kann einzelne Variablen auch aus einer eigenen Datei lesen, wenn du_FILEan den Namen hängst [7]; so bleibt der Schlüssel aus der Compose-Datei heraus. Im Queue-Modus braucht jeder Worker denselben Schlüssel [6]. Leg eine Kopie des Schlüssels in deinen Passwortmanager, getrennt von den Backups. - Der offizielle Compose-Aufbau. Die n8n-Anleitung für Linux-Server arbeitet in einem Verzeichnis
n8n-composemit einer.env-Datei fürDOMAIN_NAME,SUBDOMAIN,GENERIC_TIMEZONEundSSL_EMAIL[1]. Ein DNS-A-Eintrag lässt die Subdomain auf deinen Server zeigen [1]. Zwei Dienste laufen: Traefik, ein Reverse Proxy, der die TLS-Zertifikate verwaltet und HTTP auf HTTPS umleitet, und n8n selbst [1]. Ein Ordnerlocal-files, den du von Hand anlegst, damit er die richtigen Besitzrechte bekommt, erscheint im Container als/files, undN8N_RESTRICT_FILE_ACCESS_TO=/filesbeschränkt den Dateizugriff auf diesen Pfad [1]. Das Ergebnis läuft unterhttps://<subdomain>.<domain>; reines HTTP unterstützt dieser Aufbau nicht [1]. - Die Version festnageln. In der offiziellen Datei steht nur
image: n8nio/n8n, ohne Tag [1]. Docker zieht dann den Standard-Tag, den die n8n-Doku als neueste stabile Version beschreibt [2]. Stable ist für den Produktivbetrieb gedacht, Beta ist die neueste Veröffentlichung und kann instabil sein [2]. Mit Stand 25.10.2026 ist Stable die 2.44.6, veröffentlicht am 22.10.2026, und Beta die 2.45.3 [2][3]. n8n nutzt semantische Versionierung: Eine neue Hauptversion kann inkompatible Änderungen bringen, die etwas von dir verlangen [8]. Laut den archivierten 2.x-Versionshinweisen erscheint in den meisten Wochen eine neue Minor-Version [9]. Unsere Lesart: Mit einem festen Tag wien8nio/n8n:2.44.6ändert sich beim Ziehen der Images nichts hinter deinem Rücken, und du entscheidest, wann aktualisiert wird. Das gilt auch für Traefik, dessen Image die offizielle Datei ebenfalls ohne Tag lässt [1]. - Port 5678 bleibt lokal. Die offizielle Datei gibt n8n als
127.0.0.1:5678:5678frei [1]. 127.0.0.1 ist die Loopback-Adresse: Nur Programme auf dem Server selbst erreichen diesen Port, und aus dem Internet geht es nur über den Proxy zu n8n. Der Schnellstart-Befehl auf der Docker-Seite von n8n nutzt dagegen-p 5678:5678[2]. Auf deinem eigenen Rechner ist das in Ordnung, auf einen Server kopierst du es nicht. Unser Guide zu Docker auf dem VPS erklärt, wie freigegebene Ports und die Firewall des Hosts zusammenspielen. - Hinter dem Reverse Proxy. n8n muss wissen, dass es hinter einem Proxy sitzt. Setz
N8N_PROXY_HOPS=1und lass den letzten Proxy die HeaderX-Forwarded-For,X-Forwarded-HostundX-Forwarded-Protoweitergeben [10].N8N_WEBHOOK_URLlegt die öffentliche Adresse für Webhooks fest. Die Variable gibt es ab n8n 2.30.0, das ältereWEBHOOK_URLgilt seit 2.35.0 als veraltet [1][10].N8N_HOSTundN8N_PROTOCOL=httpsvervollständigen den Aufbau [1][7]. Betreibst du auch den MCP-Server von n8n auf Instanzebene hinter demselben Proxy, muss der Proxy zusätzlich die MCP-Header weiterreichen [10]. Unser Guide zum Reverse Proxy behandelt Caddy, Traefik und nginx. - Zu Hause oder auf dem VPS. Unsere Einschätzung: Empfangen deine Workflows Webhooks von Onlinediensten, brauchen diese Dienste eine öffentliche Adresse, und das ist der Hauptgrund für einen VPS mit eigener Subdomain. Ruft n8n nur nach außen, etwa nach Zeitplan oder bei deinen eigenen Geräten, kann es im Heimnetz bleiben, und du erreichst den Editor per VPN. Dasselbe gilt, wenn ein Workflow über den n8n-Knoten Ollama Chat Model mit einem lokalen Sprachmodell spricht [17]: Halte Modell und n8n im selben Netz. So oder so sollte der Editor nie ohne HTTPS aus dem Internet erreichbar sein.
- Die Tür abschließen. Eine neue Instanz beginnt mit dem Anlegen des Owner-Kontos, des Hauptkontos der Instanz, und laut der Backup-Anleitung von n8n wird Owner, wer diese Einrichtung zuerst abschließt [4]. Leg das Konto deshalb an, bevor die Instanz aus dem Internet erreichbar ist (unsere Lesart). Die Sicherheitsdoku von n8n behandelt Zwei-Faktor-Authentifizierung, Sicherheitsaudits, das Abschalten der öffentlichen REST-API, Telemetrie, das Sperren einzelner Knoten und den Schutz vor SSRF [11]. Telemetrie ist standardmäßig an.
N8N_DIAGNOSTICS_ENABLED=falseschaltet sie ab, dann lässt sich aber die KI-Hilfe im Code-Knoten nicht einschalten [7]. - Backups in zwei Schichten. Das vollständige Backup ist der Ordner
.n8nplus, falls vorhanden, die PostgreSQL-Datenbank. Stopp n8n, bevor du den Ordner kopierst: Wer die SQLite-Datei kopiert, während n8n hineinschreibt, kann ein inkonsistentes Backup bekommen [4]. PostgreSQL sicherst du mit dessen eigenen Werkzeugen; dazu kommen externer Speicher, eigene Pfade für Binärdaten und die Verzeichnisse ausN8N_CUSTOM_EXTENSIONS, falls du sie nutzt [4]. Die leichte Schicht ist der CLI-Export:export:workflow --backupundexport:credentials --backupschreiben je Workflow oder Zugang eine eigene Datei [4][12]. Dieser Export enthält keine Benutzer, keinen Ausführungsverlauf, keine Variablen und keine Instanzeinstellungen, auch nicht den Verschlüsselungsschlüssel, und reicht deshalb nicht, um eine Instanz neu aufzubauen [4]. Ein Export mit--decryptedschreibt Zugangsdaten im Klartext, und n8n warnt, dass dann alle sensiblen Informationen sichtbar sind [12]. Schütz eine solche Datei wie die Zugangsdaten selbst und lösch sie nach Gebrauch [4]. - Wiederherstellen, und zwar zur Probe. Eine vollständige Wiederherstellung läuft so: n8n stoppen, den Ordner
.n8nund eigene Knoten zurückspielen, die Datenbank wiederherstellen, die Konfiguration samtN8N_ENCRYPTION_KEYzurückholen, falls du ihn gesetzt hast, dann n8n starten [4]. Importierst du nur Workflows und Zugangsdaten, leg zuerst das Owner-Konto an. Importierte Workflows kommen deaktiviert an, und Workflows mit gleicher ID werden überschrieben [4]. Für den Umzug von SQLite zu PostgreSQL bietet n8nexport:entitiesundimport:entities[12]. Unsere Empfehlung: Spiel das Backup einmal in eine zweite, getrennte Instanz ein, bevor du es brauchst. - Updates ohne Datenverlust. n8n empfiehlt, häufig zu aktualisieren, mindestens einmal im Monat, die Versionshinweise auf inkompatible Änderungen zu lesen und das Update zuerst auf einer Testinstanz auszuprobieren [13]. Die Backup-Anleitung empfiehlt vor dem Update ein vollständiges Backup [4]. Mit Docker Compose besteht das Update selbst aus pull, down und up [2]. Häng niemals
-vandocker compose down: Diese Option löscht auch die in der Compose-Datei deklarierten benannten Volumes,n8n_dataeingeschlossen [14]. Unsere Lesart: Hat eine neue Version die Datenbank erst einmal migriert, ist der Weg zurück zum alten Tag kein verlässliches Rollback. Spiel stattdessen das Backup von vor dem Update zurück. - Die Lizenz in einfachen Worten. n8n steht unter der Sustainable Use License, einer Fair-Code-Lizenz, die n8n 2022 geschaffen hat [5]. Du darfst die Software für eigene interne Geschäftszwecke oder für nicht kommerzielle oder private Zwecke nutzen und verändern und sie nur kostenlos für nicht kommerzielle Zwecke weitergeben [5]. Nicht abgedeckt ist, n8n deinen Kunden bereitzustellen, damit diese ihre Konten verbinden und Workflows bauen [5]. Beratung und Support, etwa das Bauen von n8n-Workflows für andere, sind erlaubt [5]. Quelldateien mit
.ee.im Namen fallen unter die n8n Enterprise License [5]. Das ist eine Zusammenfassung, keine Rechtsberatung: Bei Grenzfällen frag n8n oder eine Anwältin oder einen Anwalt.
Praxisbeispiel (ein Plan, nicht getestet)
Wir betreiben n8n selbst in Docker (Stand 25.10.2026). Was folgt, ist keine Kopie unseres Aufbaus, sondern ein Plan nach der Doku, und für diesen Guide haben wir die Befehle nicht ausgeführt. Er setzt einen Server mit Docker Compose voraus, einen Reverse Proxy, der schon auf demselben Host läuft, und das offizielle Verzeichnis n8n-compose mit seiner .env-Datei [1]. Gegenüber der offiziellen Datei hat der Plan einen festen Tag, keinen Traefik-Dienst und N8N_PROXY_HOPS=1 für den vorhandenen Proxy, der an 127.0.0.1:5678 weiterleitet [1][10]. Kein Schlüssel und kein Passwort steht in der Datei.
services:
n8n:
image: n8nio/n8n:2.44.6
restart: always
ports:
- "127.0.0.1:5678:5678"
environment:
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- N8N_WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- N8N_PROXY_HOPS=1
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
- N8N_RESTRICT_FILE_ACCESS_TO=/files
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
volumes:
n8n_data:Sichern (Plan): Compose benennt Container nach dem Muster Projekt-Dienst-Nummer, nimmt als Projektnamen standardmäßig den Verzeichnisnamen, und docker compose ps -a listet die Container auf [15][18][19]. Hier heißt der Container n8n-compose-n8n-1. Der tar-Aufruf folgt Dockers eigenem Beispiel für das Sichern eines Volumes [16]:
cd ~/n8n-compose
docker compose ps -a
docker compose stop n8n
mkdir -p backup
docker run --rm --volumes-from n8n-compose-n8n-1 -v "$(pwd)/backup":/backup ubuntu tar cvf /backup/n8n-data-2026-10-25.tar /home/node/.n8n
docker compose up -dDie zweite Schicht läuft bei gestartetem n8n. Die Dateien landen auf dem Host in ./local-files/backups [1][12]:
docker exec -u node -it n8n-compose-n8n-1 n8n export:workflow --backup --output=/files/backups/workflows/
docker exec -u node -it n8n-compose-n8n-1 n8n export:credentials --backup --output=/files/backups/credentials/Aktualisieren (Plan): vollständiges Backup anlegen, in compose.yaml den Tag auf die Version aus den Versionshinweisen ändern, dann:
docker compose pull
docker compose down
docker compose up -dWiederherstellen (Plan): n8n stoppen, das Archiv ins Volume entpacken, wieder starten. Der Befehl spiegelt Dockers Beispiel zur Wiederherstellung [16], und --strip 3 entfernt den im Archiv gespeicherten Pfad home/node/.n8n. Dateien, die nach dem Backup entstanden sind, bleiben im Volume. Sauberer ist deshalb die Wiederherstellung in ein frisches, leeres Volume, und genau das liefert dir ein Probelauf auf einer zweiten Instanz.
docker compose stop n8n
docker run --rm --volumes-from n8n-compose-n8n-1 -v "$(pwd)/backup":/backup ubuntu bash -c "cd /home/node/.n8n && tar xvf /backup/n8n-data-2026-10-25.tar --strip 3"
docker compose up -dFür die leichte Schicht ist das Gegenstück import:workflow --separate und import:credentials --separate mit denselben Pfaden [4][12].
Prüfliste
- Häng
/home/node/.n8nals Volume ein und führdocker compose downnie mit-vaus. - Kopier den Verschlüsselungsschlüssel in deinen Passwortmanager, getrennt von den Backups.
- Nagel die Images von n8n und Traefik auf feste Versions-Tags fest.
- Gib Port 5678 nur auf 127.0.0.1 frei und erreich den Editor über den Reverse Proxy mit HTTPS.
- Setz
N8N_PROXY_HOPS=1undN8N_WEBHOOK_URLund lass den Proxy die X-Forwarded-Header weitergeben. - Leg das Owner-Konto an, bevor die Instanz online geht, und schalte die Zwei-Faktor-Authentifizierung ein.
- Stopp n8n, sichere den Ordner
.n8nund die Datenbank und aktualisiere erst danach, mindestens einmal im Monat. - Probier eine Wiederherstellung auf einer zweiten Instanz aus, bevor du sie brauchst.
- Lies die Sustainable Use License, bevor du n8n Kunden anbietest.
Passt dazu: Docker Compose: Stack in einer Datei beschreiben; Docker auf dem VPS: Firewall und Absicherung; Reverse Proxy im Homelab; Homelab-Backup mit restic oder Borg; Large Language Model / LLM.