Ein Homelab sammelt kleine Handgriffe. Paperless hat einen Brief erkannt, also mal nachsehen. Uptime Kuma hat nachts etwas gemeldet, also morgens die Mail lesen. Jeden Montag den Backup-Bericht öffnen, weil man ihn sonst vergisst. Jeder dieser Handgriffe dauert eine Minute, und zusammen sind sie der Grund, warum die Dienste einem irgendwann hinterherlaufen statt umgekehrt.
n8n ist das Werkzeug, mit dem man solche Handgriffe verdrahtet: Wenn hier etwas passiert, tu dort etwas. Die Verdrahtung malt man im Browser, als Kästchen mit Linien dazwischen, und n8n führt sie aus, solange der Container läuft. Nach eigener Angabe verbindet es über 1.500 Dienste, von Telegram über E-Mail bis zu jedem Programm, das eine HTTP-Schnittstelle hat. Wir installieren es per Docker Compose, nur fürs Heimnetz, mit einer Compose-Datei, die im Sandkasten dieser Seite gelaufen ist, bevor sie hier steht.
stable), geprüft am 20-09-2026.
Was n8n ist, und was man vorher wissen sollte
Ein Workflow in n8n ist eine Kette aus Kästchen. Das erste Kästchen wartet auf einen Anlass, die weiteren tun etwas mit dem, was ankommt. Der Anlass kann eine Uhrzeit sein, eine neue Mail, oder ein Aufruf von außen, ein sogenannter Webhook.
Zwei Dinge gehören vor die Installation, weil sie die Entscheidung beeinflussen, ob man n8n überhaupt will.
Die Lizenz. n8n nennt sich „fair-code“. Der Quellcode liegt offen, man darf ihn laut Lizenztext „für interne Geschäftszwecke“ und für „nicht-kommerzielle oder persönliche Nutzung“ einsetzen, verändern und weitergeben. Was nicht geht: n8n selbst als Dienst verkaufen. Für zu Hause ändert das nichts, aber Open Source im üblichen Sinn ist es nicht, und ich finde, man sollte das wissen, bevor man Stunden in Workflows steckt. Einige Funktionen der Community-Ausgabe fehlen außerdem, etwa das Teilen von Workflows mit anderen Benutzern; das ist den bezahlten Stufen vorbehalten. Für eine Person im Heimnetz reicht, was übrig bleibt, und das ist fast alles.
Die Sicherheitslage. Zwischen Januar und März 2026 wurden mehrere kritische Lücken in n8n bekannt. Die schwerste, CVE-2026-21858, ließ sich laut der Analyse von Orca Security ohne Anmeldung über die Webhook-Adressen ausnutzen, mit der Höchstwertung 10.0; betroffen war alles vor Version 1.121.0. Wer heute frisch installiert, bekommt eine Version weit dahinter. Die Lehre bleibt trotzdem: n8n hält Zugangsdaten zu all deinen Diensten, und so ein Ding stellt man nicht ins Internet. In dieser Anleitung ist es nur im Heimnetz erreichbar, und die Updates machst du regelmäßig; die Doku empfiehlt einmal im Monat.
Was du brauchst
- Einen Linux-Rechner mit Docker und Docker Compose v2. Das Image gibt es für amd64 und arm64. Wer Docker noch nicht hat: Bei Paperless-ngx steht der Weg.
- Port 5678 frei.
- Einen Browser auf einem Gerät im selben Netz.
- Zehn Minuten für einen ersten Workflow, damit du am Ende siehst, dass alles zusammenspielt.
Die prüfbaren Punkte klärst du auf dem Server. Zuerst Docker:
docker --version
docker compose versionBeide Zeilen liefern eine Versionsnummer. Kennt dein Rechner nur docker-compose mit Bindestrich, ist das die alte Version 1; die Anleitung setzt v2 voraus.
Dann der Port:
sudo ss -tulpn | grep ':5678 ' || echo "Port 5678 ist frei"Port 5678 ist freiSteht statt der Meldung eine Zeile mit einem Programmnamen, sitzt dort schon jemand. Wie du ihn findest, steht in einem eigenen Beitrag.
Alle Befehle rechnen mit denselben Beispielwerten. Wo sie unten auftauchen, setzt du deine ein:
- IP-Adresse des Docker-Rechners:
192.168.178.60 - Ordner für die Compose-Datei:
~/n8n - Port der Weboberfläche:
5678 - Zeitzone:
Europe/Berlin - Owner-Konto in n8n:
sakis@example.org - Sein Passwort:
Werkbank-2026als Platzhalter; du nimmst ein eigenes, langes
Schritt 1: Ordner und Compose-Datei
Grundlage ist der docker run-Befehl aus der n8n-Doku zur Docker-Installation, übersetzt in eine Compose-Datei, damit die ganze Installation in einer Datei steht und ein Update aus zwei Befehlen besteht. Dazu kommen vier Variablen aus der Referenz der Umgebungsvariablen, die das Heimnetz braucht. Was jede Zeile tut, steht unter der Datei.
Ordner anlegen und hineinwechseln:
mkdir -p ~/n8n
cd ~/n8nDatei anlegen:
nano compose.yamlInhalt einfügen, mit Strg+O und Enter speichern, mit Strg+X schließen:
services:
n8n:
image: n8nio/n8n:stable
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- GENERIC_TIMEZONE=Europe/Berlin
- TZ=Europe/Berlin
- N8N_SECURE_COOKIE=false
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_WEBHOOK_URL=http://192.168.178.60:5678/
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:Ob Compose die Datei versteht, zeigt eine Probe ohne Start:
docker compose config --quiet && echo OKOKKommt eine Fehlermeldung mit Zeilennummer statt OK, ist fast immer die Einrückung schuld; YAML zählt Leerzeichen.
image: n8nio/n8n:stable n8n veröffentlicht fast täglich. Auf GitHub hängen zwei Marken an den Releases: stable zeigt heute auf 2.39.8 vom 18-09-2026, beta auf die 2.40er-Reihe, die noch als Vorabversion markiert ist. Auf Docker Hub hat der Tag latest im Moment dieselbe Prüfsumme wie stable; ich nehme trotzdem stable, weil das Wort sagt, was ich will, und latest es nur zufällig gerade tut.
GENERIC_TIMEZONE und TZ Zwei Variablen für dieselbe Sache, und die Doku besteht auf beiden: Die erste gilt für Zeitpläne in Workflows, die zweite für die Uhr des Containers. Der Standardwert der ersten ist America/New_York. Ohne die Zeile läuft ein Workflow, den du auf acht Uhr morgens legst, um zwei Uhr nachmittags.
N8N_SECURE_COOKIE=false Die Variable, die die meisten Neulinge erst nach der ersten Fehlermeldung finden. Standardmäßig setzt n8n sein Anmelde-Cookie nur über HTTPS. Wir reden es aber über http://192.168.178.60:5678 an, ohne Verschlüsselung, und dann verweigert der Browser die Anmeldung. Der Schalter nimmt die Pflicht heraus. Das ist im Heimnetz vertretbar und nur dort: Sobald HTTPS über einen Reverse Proxy davor liegt, gehört die Zeile wieder weg.
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true Steht so im docker run-Befehl der Doku. n8n legt beim ersten Start eine Datei mit dem Schlüssel an, mit dem es alle Zugangsdaten verschlüsselt, und die Variable sorgt dafür, dass nur der Benutzer im Container sie lesen darf.
N8N_DIAGNOSTICS_ENABLED=false Standardmäßig schickt n8n anonyme Nutzungsdaten an den Hersteller. Die Doku sagt das offen, und sie sagt auch, wie man es abstellt. Ich stelle es ab.
N8N_WEBHOOK_URL Die Adresse, unter der n8n seine Webhooks nach außen zeigt. Ohne sie baut n8n Adressen mit localhost, und die kann kein anderes Gerät aufrufen. Die Doku kennt die Variable auch als WEBHOOK_URL, aber die Schreibweise gilt seit 2.35.0 als veraltet und produziert beim Start eine Warnung.
volumes Ein von Docker verwaltetes Volume namens n8n_data, eingehängt dort, wo n8n seine Daten hält: die SQLite-Datenbank mit allen Workflows, die Ausführungsprotokolle und die Datei mit dem Verschlüsselungsschlüssel. Ein Volume statt eines Ordners, weil das die häufigste Startpanne von vornherein vermeidet; dazu unten mehr.
Schritt 2: Starten
docker compose up -dBeim ersten Mal lädt Docker das Image; im Sandkasten dieser Seite dauerte das mit Start zusammen 37 Sekunden. Danach:
docker compose psIn der Spalte STATUS steht Up. Ob n8n auch antwortet, fragst du an seiner Gesundheitsadresse nach, die die Doku dafür vorsieht:
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:5678/healthz
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:5678/healthz/readiness200
200Die erste Zeile sagt: n8n ist erreichbar. Die zweite sagt: Die Datenbank ist angelegt und auf dem aktuellen Stand, n8n nimmt Arbeit an. Direkt nach dem Start liefern beide Zeilen noch 000; warte ein paar Sekunden, beim allerersten Start legt n8n die Datenbank erst an. Bleibt es dabei, zeigt das Log den Grund:
docker compose logs --tail 30 n8nSchritt 3: Das Owner-Konto
Der erste Mensch, der die Oberfläche öffnet, wird Owner, mit allen Rechten. Deshalb machst du das jetzt, bevor jemand anderes im Haus die Adresse findet.
Im Browser http://192.168.178.60:5678 öffnen. n8n zeigt das Formular für das Owner-Konto (Stand n8n 2.39): E-Mail sakis@example.org, Vor- und Nachname, Passwort Werkbank-2026. Das Passwort braucht laut Doku mindestens acht Zeichen, eine Zahl und einen Großbuchstaben. Bestätigen.
Danach zeigt n8n eine Seite „Build and debug faster with the AI Assistant“ mit den Knöpfen Get started und Set up later in Settings; Letzteren klicken, die Seite ändert nichts an der Installation. Bietet n8n dir anschließend einen kostenlosen Lizenzschlüssel per E-Mail an: Der schaltet Ordner für Workflows und ein paar Komfortfunktionen im Editor frei, mehr nicht. Das kann warten.


Du landest in der leeren Übersicht deiner Workflows. Die E-Mail ist hier nur der Anmeldename: n8n verschickt nichts, solange kein Mailserver eingetragen ist, und den brauchst du im Heimnetz nicht. Weitere Benutzer lädst du später unter den Einstellungen ein; ohne Mailserver zeigt n8n dir dafür einen Link, den du selbst weitergibst.
Schritt 4: Ein erster Workflow als Probe
Bis hierhin weißt du, dass n8n läuft. Ob es auch von außen erreichbar ist und seine Webhook-Adressen richtig baut, zeigt ein Workflow aus einem einzigen Kästchen.
Einen neuen Workflow anlegen. Als ersten Node On webhook call wählen. Im Node bleibt HTTP Method auf GET, unter Path steht schon ein zufälliger Pfad, den lässt du. Oben im Node stehen zwei Adressen, Test URL und Production URL. Die Test URL kopieren, dann auf Listen for test event klicken. n8n hört jetzt 120 Sekunden lang auf diese Adresse.



Innerhalb dieser zwei Minuten rufst du die Adresse von einem anderen Rechner im Netz auf, mit der kopierten Test-URL in Anführungszeichen:
curl "http://192.168.178.60:5678/webhook-test/DEIN-PFAD"Im Editor füllt sich der Node mit dem, was angekommen ist: die Kopfzeilen des Aufrufs, darunter curl als Absender. Das ist der Moment, in dem die Installation fertig ist: Ein Gerät im Netz hat n8n unter der Adresse erreicht, die n8n selbst herausgibt. Alles, was du ab jetzt baust, hängt an genau diesem Mechanismus.
Fängt die Test-URL mit localhost an statt mit deiner IP, fehlt N8N_WEBHOOK_URL in der Compose-Datei oder steht dort falsch; nach dem Korrigieren docker compose up -d erneut ausführen, Compose startet den Container dann mit den neuen Werten.
Was am Ende eingestellt ist
1. Ein Owner, sonst niemand. Dein Konto darf alles, und es gibt keinen Weg, ohne Anmeldung an die Oberfläche zu kommen. n8n bringt eine Zwei-Faktor-Anmeldung mit, die laut Referenz standardmäßig erlaubt ist; einschalten musst du sie selbst in deinen Kontoeinstellungen. Für ein Gerät, das die Passwörter deiner anderen Dienste kennt, würde ich das tun.
2. Alles liegt in einem Volume, und das Backup ist ein Archiv. Workflows, Zugangsdaten, Ausführungen und der Verschlüsselungsschlüssel liegen in n8n_data. Die Doku nennt den Schlüssel den Teil, ohne den ein Backup wertlos ist: Ohne ihn lassen sich die gesicherten Zugangsdaten nicht mehr lesen. Der einfachste vollständige Sicherungsweg ist der aus der Docker-Doku, das Volume als Tar-Archiv, bei angehaltenem Container, weil die Doku von n8n davor warnt, die Datenbank im Betrieb zu kopieren:
cd ~/n8n
docker compose stop
docker run --rm --volumes-from n8n -v "$(pwd)":/backup ubuntu tar cvf /backup/n8n-backup.tar /home/node/.n8n
docker compose startDanach liegt n8n-backup.tar in ~/n8n, und die Datei gehört in jedes Backup, das du hast. Wer nur die Workflows als lesbare Dateien will, bekommt von n8n dafür eigene Befehle, n8n export:workflow --backup, per docker exec im Container; die Doku beschreibt sie, und sie sichern ausdrücklich nicht den Schlüssel.
3. Updates kommen von dir, einmal im Monat. n8n aktualisiert sich nicht selbst, zeigt aber in der Oberfläche an, wenn es eine neue Version gibt. Die Doku empfiehlt, monatlich nachzuziehen und vorher in die Release Notes zu sehen. Der Weg ist der aus der Doku:
cd ~/n8n
docker compose pull
docker compose down
docker compose up -dDas Volume bleibt bei down erhalten; nur der Container wird ersetzt. Vor einem Sprung auf eine neue Hauptversion kommt das Archiv aus Punkt 2, denn Datenbankumbauten kennen keinen Rückweg.
4. Nur im Heimnetz, und per HTTP. Port 5678 spricht unverschlüsselt, und dank N8N_SECURE_COOKIE=false lässt sich n8n das gefallen. Beides ist nur deshalb in Ordnung, weil im Router keine Weiterleitung auf diesen Port existiert. Das bleibt so. Wer n8n unterwegs braucht, nimmt ein VPN oder einen Reverse Proxy mit HTTPS davor und nimmt dann den Cookie-Schalter wieder heraus. Und wer eine UFW-Firewall auf dem Rechner hat, sollte wissen, dass Docker an ihr vorbei veröffentlicht: Die Zeile "5678:5678" öffnet den Port für das ganze Netz, Firewall hin oder her.
5. Alte Ausführungen räumt n8n selbst weg. Jeder Lauf eines Workflows landet mit allen Daten in der Datenbank. Standardmäßig löscht n8n Ausführungen nach 336 Stunden, also zwei Wochen, und hält höchstens 10.000 davon. Für zu Hause ist das ein guter Wert; wer die Datenbank klein halten will, setzt EXECUTIONS_DATA_MAX_AGE in der Compose-Datei niedriger.
Wo es klemmt
„Your n8n server is configured to use a secure cookie, however you are visiting this via an insecure URL.“ Der Klassiker, im Forum von n8n gibt es dazu ganze Themenfäden. Es fehlt N8N_SECURE_COOKIE=false, oder der Container läuft noch mit der alten Umgebung. Nachsehen, was der Container wirklich bekommen hat:
docker compose exec n8n env | grep N8N_SECURE_COOKIEKommt nichts zurück, steht die Zeile nicht in der Datei, die Compose gelesen hat. Nach dem Nachtragen docker compose up -d, das genügt.
Der Container startet immer wieder neu, im Log steht „EACCES: permission denied, open '/home/node/.n8n/config'“. Das passiert, wenn statt des Volumes ein Ordner deines Rechners eingehängt ist, etwa ./data:/home/node/.n8n, und der Ordner root gehört. Der Container läuft als Benutzer node mit der Kennung 1000 und darf dort nicht schreiben. In den Issues von n8n ist das seit Issue #1240 bekannt und taucht bis heute in neuen Meldungen auf. Mit dem Volume aus dieser Anleitung tritt es nicht auf; wer den Ordner trotzdem will, übergibt ihn vorher:
sudo chown -R 1000:1000 ~/n8n/data
docker compose restartDer Zeitplan feuert zur falschen Uhrzeit. Sechs Stunden daneben, und zwar immer sechs: Das ist New York. Die Zeile GENERIC_TIMEZONE=Europe/Berlin fehlt, oder der Workflow hat in seinen eigenen Einstellungen eine andere Zeitzone, die laut Doku Vorrang hat.
Port 5678 ist belegt. In der Compose-Datei die Zeile zu "5679:5678" ändern, dann lauscht n8n außen auf 5679 und innen weiter auf 5678. Die Adresse in N8N_WEBHOOK_URL bekommt denselben neuen Port, sonst zeigen die Webhooks ins Leere.
Ein Container, eine Datei, ein Konto, ein Kästchen mit einer Adresse, die von außen antwortet. Was mir an n8n gefällt, ist nicht die Zahl der Integrationen, sondern dass die Verdrahtung zwischen deinen Diensten jetzt auf deinem Rechner liegt und nicht bei einem Anbieter, der sie pro Ausführung abrechnet. Was mir weniger gefällt, steht oben: Die Lizenz ist keine freie, und die Lückenserie vom Winter war kein Ausrutscher, sondern ein Muster. Beides lässt sich tragen, wenn das Ding im Heimnetz bleibt und die Updates kommen.
Welcher Handgriff soll bei dir als Erstes von allein laufen? Der Brief aus Paperless aufs Handy, der Backup-Bericht in den Chat, oder etwas, an das ich nicht gedacht habe? Schreib's in die Kommentare, das ist Stoff für den nächsten Beitrag.
Und wenn du n8n irgendwann von unterwegs erreichen willst: Nginx Proxy Manager steht hier schon Schritt für Schritt, und mit ihm davor darf der Cookie-Schalter wieder weg.
Quellen
- n8n-Doku: Install with Docker (docker run mit GENERIC_TIMEZONE, TZ, N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS, Volume /home/node/.n8n, Update-Befehle pull, down, up)
- n8n-Doku: Umgebungsvariablen Security (N8N_SECURE_COOKIE Standard true, N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS, N8N_MFA_ENFORCED_ENABLED)
- n8n-Doku: Umgebungsvariablen Deployment (N8N_DIAGNOSTICS_ENABLED Standard true, N8N_ENCRYPTION_KEY, N8N_PORT 5678)
- n8n-Doku: Umgebungsvariablen Endpoints (N8N_WEBHOOK_URL; WEBHOOK_URL seit 2.35.0 veraltet)
- n8n-Doku: Timezone (GENERIC_TIMEZONE, Standard America/New_York)
- n8n-Doku: Umgebungsvariablen Executions (EXECUTIONS_DATA_MAX_AGE 336, EXECUTIONS_DATA_PRUNE_MAX_COUNT 10000)
- n8n-Doku: Umgebungsvariablen User management und 2FA (N8N_MFA_ENABLED Standard true, SMTP-Variablen)
- n8n-Doku: User management (Owner-Formular, Passwortregel, Einladung ohne SMTP per Link)
- n8n-Doku: Community edition features (was fehlt, was der kostenlose Registrierungsschlüssel freischaltet)
- n8n-Doku: Monitor n8n (/healthz und /healthz/readiness)
- n8n-Doku: Backup and restore (.n8n-Ordner samt Schlüssel, vor dem Kopieren stoppen, export:workflow --backup)
- n8n-Doku: Update n8n (monatliche Updates, Release Notes vorher lesen)
- n8n-Doku: Webhook-Node, Test URL und Production URL (120 Sekunden nach „Listen for test event“)
- n8n-Doku: Schedule Trigger (Zeitzone des Workflows vor der Instanz-Zeitzone)
- Docker-Doku: Volumes (Back up a volume mit --volumes-from und tar)
- n8n auf GitHub (fair-code, über 1.500 Integrationen, Quick Start mit docker run)
- n8n: Sustainable Use License (interne Geschäftszwecke, nicht-kommerzielle oder persönliche Nutzung)
- n8n: Release-Marke stable (2.39.8, 18-09-2026)
- Docker Hub: Tags n8nio/n8n (latest mit derselben Prüfsumme wie 2.39.8)
- Orca Security: CVE-2026-21858 (CVSS 10.0, ohne Anmeldung über Webhook-Endpunkte, behoben in 1.121.0)
- The Hacker News: n8n warnt vor CVE-2026-21877 (Instanzen nicht öffentlich exponieren)
- n8n-Forum: „configured to use a secure cookie“ (Fehlermeldung und N8N_SECURE_COOKIE)
- n8n: Issue #1240, EACCES permission denied /home/node/.n8n/config (Bind-Mount gehört root)
- n8n: Issue #11102, derselbe Fehler in neueren Versionen