n8n auf v3 vorbereiten: Migration Report, OpenCode und ein bisschen Handarbeit

n8n auf v3 vorbereiten: Migration Report, OpenCode und ein bisschen Handarbeit

Seit dem 27. Oktober gibt es die Beta von n8n 3.0. Die stabile Version soll Anfang Dezember folgen. Der Major-Sprung ist kein Marketing: n8n räumt Legacy-Nodes ab, verschärft Security-Defaults und baut Teile der Ausführung um. Manuelle Executions laufen im Queue Mode künftig immer auf Workern, der In-Memory-Modus für Binärdaten fällt weg und das Timeout für den Code-Node sinkt von fünf Minuten auf eine.

Meine n8n-Instanz ist inzwischen ein zentraler Baustein in meinem Homelab. Sie läuft self-hosted mit Docker, PostgreSQL, Redis im Queue Mode und externen Task Runnern. Dazu kommen 216 Workflows, von denen einige täglich oder auch mehrfach am Tag laufen. Ich wollte deshalb nicht direkt auf die Beta springen, sondern die Instanz noch auf 2.x so vorbereiten, dass der eigentliche Upgrade-Schritt unspektakulär wird.

Ein Punkt hat mich dabei besonders vorsichtig gemacht: Der Weg auf 3.x ist eine Einbahnstraße. Zurück auf 2.x geht es nur über ein Backup.

Der Migration Report als Ausgangspunkt

Seit Version 2.39 bringt n8n unter Settings → Migration report ein Werkzeug mit, das genau für diese Vorbereitung gedacht ist. Der Report prüft zwei Dinge:

  • Workflow issues: Alle Workflows werden auf Nodes untersucht, die in v3 wegfallen oder sich anders verhalten.
  • Instance issues: Die Konfiguration der Instanz selbst, also Umgebungsvariablen und Defaults, die sich ändern.

Jeder Punkt ist mit einem Label versehen. „Executions will fail" heißt: Nach dem Upgrade bricht etwas. „Behavior changes" heißt: Es läuft weiter, liefert aber womöglich ein anderes Ergebnis. Diese Unterscheidung hilft beim Priorisieren enorm.

Bei mir sah der Ausgangszustand so aus: 212 von 216 Workflows kompatibel, drei Workflow-Themen und sieben Instance-Themen.

Migration Report in n8n mit 212 von 216 kompatiblen Workflows und drei Workflow-Issues: Convert to/from binary data node removed, Write Binary File node removed und Always Output Data behavior fix

Der Reiter für die Instanz zeigt die Infrastruktur-Themen. Hier wird es für Self-Hoster interessant, denn diese Punkte lassen sich nicht im Editor lösen, sondern nur im Docker-Setup.

Instance issues im Migration Report: gesenkte Limits für den Compression-Node, Task-Runner-Timeout von 60 Sekunden, manuelle Executions immer auf Workern und Umbenennung des Storage-Verzeichnisses

Die für mich relevanten Instance-Themen im Überblick:

Thema Variable Alt Neu in v3
Compression-Limits N8N_COMPRESSION_NODE_MAX_DECOMPRESSED_SIZE_BYTES / N8N_COMPRESSION_NODE_MAX_ZIP_ENTRIES 2 GiB / 5000 256 MiB / 1000
Task-Runner-Timeout N8N_RUNNERS_TASK_TIMEOUT 300 s 60 s
Manuelle Executions OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS optional entfällt, immer auf Workern
Storage-Verzeichnis N8N_MIGRATE_FS_STORAGE_PATH ~/.n8n/binaryData ~/.n8n/storage
Unverified Community Packages N8N_UNVERIFIED_PACKAGES_ENABLED true false
Binary-Data-Modus N8N_DEFAULT_BINARY_DATA_MODE default (In-Memory) default ist nicht mehr gültig

Die vollständige Liste steht in der Dokumentation zu den Breaking Changes.

Erst der Snapshot, dann alles andere

n8n läuft bei mir in einem LXC-Container auf Proxmox. Bevor irgendjemand, Mensch oder Agent, an der Konfiguration dreht, gibt es einen Snapshot. Das kostet ein paar Sekunden und ist im Zweifel der schnellste Weg zurück.

Proxmox-Oberfläche mit dem Snapshot before-3-0-beta für den n8n-Container

Instanz-Check mit OpenCode

Mein Docker-Setup für n8n liegt als Repository lokal auf meinem Rechner, der Agent hat zusätzlich SSH-Zugriff auf den Server. Für die Prüfung habe ich OpenCode in einer Session in herdr gestartet. Im Screenshot ist noch GPT-6.1 Terra ausgewählt, die eigentliche Arbeit hat dann aber GPT-6.1 Sol von OpenAI erledigt.

Der Prompt war bewusst kurz. Dazu kam der Inhalt der Instance Issues aus dem Migration Report per Copy & Paste. Der Agent hat keinen Zugriff auf die UI des Reports, also habe ich ihm die relevanten Informationen direkt mitgegeben.

OpenCode-Prompt: Check my n8n instance and prepare the instance for n8n v3.0, ergänzt um die eingefügten Instance Issues aus dem Migration Report

Erst analysieren, nichts ändern

Positiv aufgefallen ist mir, dass der Agent im ersten Durchlauf nur analysiert hat. Keine Datei geändert, nichts neu gestartet. Stattdessen gab es eine Bestandsaufnahme:

Live-Findings von OpenCode: n8n 2.44.6 mit PostgreSQL, Redis Queue Mode und externen Task Runnern, Health OK, freier Speicher und Deployment-Drift in der docker-compose.yml auf dem Server

Der wichtigste Fund war für mich der Deployment-Drift. Die docker-compose.yml auf dem Server enthielt Änderungen, die nie ins Repository zurückgeflossen sind, unter anderem eine AI-Sandbox und SearXNG. Hätte der Agent einfach die lokale Datei hochkopiert, wären diese Dienste weg gewesen. Er hat das erkannt und die Server-Änderungen als „muss erhalten bleiben" markiert. Ehrlicherweise ist das ein Problem, das ich selbst verursacht habe.

Auch beim Task-Runner-Timeout fand ich die Argumentation nachvollziehbar: In einer Stichprobe von 259 Executions gab es sieben Code-Node-Läufe, alle unter 1,5 Sekunden. Das spricht eigentlich für den neuen Default von 60 Sekunden. Eine Stichprobe sagt aber nichts über den Worst Case aus. Deshalb lautete die Empfehlung, die 300 Sekunden vorerst explizit zu setzen. Das ist konservativ, aber für mich der richtige erste Schritt.

Zusätzlich hat der Agent zwei aktive Workflows gefunden, die Nodes verwenden, die in v3 entfernt werden:

Workflow-Blocker: muench.dev Upload Adobe Commerce Version Infos mit sechs Convert-to/from-Binary-Data-Nodes und Sub Backup n8n workflows to GIT mit je einem Convert- und Write-Binary-File-Node, darunter der Vorschlag für einen v2 preparation pass

Er weist dabei selbst darauf hin, dass das nur eine gezielte Prüfung ist und kein Ersatz für den Migration Report. Daraus entstand ein Vorschlag für einen „v2 preparation pass": Die Instanz bleibt auf 2.x, wird aber so konfiguriert, dass sie sich schon wie v3 verhält oder die alten Werte explizit beibehält.

Die Vorbereitung auf 2.44.6

Nach meiner Freigabe hat der Agent folgende Änderungen umgesetzt und geprüft:

Ergebnis der Vorbereitung: n8n und Task Runner auf 2.44.6 gepinnt, Timeout 300 Sekunden, unverified packages aktiviert, Binary Storage auf database, Offloading auf main aktiviert; anschließend validiert

  • Versionen gepinnt inklusive Image-Digests für n8n und die Task Runner. Damit kann mir kein latest-Tag versehentlich die Beta unterschieben.
  • N8N_RUNNERS_TASK_TIMEOUT=300 auf Main, Worker und beiden Runnern.
  • N8N_UNVERIFIED_PACKAGES_ENABLED=true, damit meine Community-Nodes weiter laden.
  • Binary Storage explizit auf database, da der implizite Default wegfällt.
  • Offloading manueller Executions auch auf Main, sodass ich das künftige Verhalten schon unter v2 testen kann.

Beim Thema Unverified Packages bin ich nicht ganz glücklich. n8n schaltet das in v3 aus gutem Grund ab. Ich habe es erst einmal aktiviert gelassen, damit nichts bricht. Mittelfristig will ich prüfen, welche Community-Nodes ich wirklich brauche und ob es dafür verifizierte Alternativen gibt.

Zweite Runde: Compression und Storage-Verzeichnis

Danach blieben noch zwei Themen offen, für die es eine kurze zweite Runde gab:

Vorschlag von OpenCode: Compression-Limits explizit auf die neuen v3-Werte setzen und das Storage-Verzeichnis mit N8N_MIGRATE_FS_STORAGE_PATH schon jetzt migrieren

Da in keinem meiner Workflows ein Compression-Node vorkommt, gab es keinen Grund, die alten, großzügigen Limits zu behalten. Die neuen Werte explizit zu setzen entfernt außerdem die Warnung aus dem Report.

Für das Storage-Verzeichnis gibt es mit N8N_MIGRATE_FS_STORAGE_PATH=true einen Schalter, der die Umbenennung von binaryData nach storage schon unter 2.x durchführt. Da bei mir das komplette .n8n-Verzeichnis als Volume eingebunden ist, war keine Anpassung am Mount nötig. Der Agent hat Main und Worker gestoppt, damit nicht beide parallel migrieren, und sie anschließend nacheinander gestartet. Beim Upgrade auf v3 kann der Schalter wieder raus.

Workflows von Hand umstellen

Die betroffenen Workflows habe ich manuell angepasst. Das wäre sicher auch über den Instance-level MCP-Server von n8n mit einem Agenten gegangen. Bei einer Handvoll Nodes war ich so aber schneller und konnte das Ergebnis direkt im Editor prüfen.

Der Migration Report gibt die Richtung vor:

  • Convert to/from Binary Data, Richtung JSON/Base64 → Datei: ersetzen durch Convert to File.
  • Convert to/from Binary Data, Richtung Datei → Base64: ersetzen durch Extract From File mit „Move File to Base64 String".
  • Write Binary File: ersetzen durch Read/Write Files from Disk mit „Write File to Disk".

In meinem Workflow für die Adobe-Commerce-Versionsinformationen wird eine JSON-Struktur als Datei per SSH auf einen Server hochgeladen. Aus dem alten Move Binary Data (JSON to Binary) wurde ein Convert to File:

Im n8n-Editor wird der Node Move Binary Data5 (JSON to Binary) durchgestrichen und durch Convert to File4 (Convert to JSON) vor dem SSH-Upload ersetzt

Die Einstellungen sind überschaubar: Operation „Convert to JSON", Mode „Each Item to Separate File" und das Ausgabefeld data, damit der nachfolgende SSH-Node das Binärfeld wie bisher findet. Wichtig ist, danach einmal auszuführen und den Output zu vergleichen. Hier landet wie zuvor das JSON mit den Versionen in der Datei.

Convert-to-File-Node mit Operation Convert to JSON, Mode Each Item to Separate File und Output-Feld data; rechts der erzeugte JSON-Inhalt mit der Liste der Adobe-Commerce-Versionen

Always Output Data: die stille Verhaltensänderung

Der dritte Punkt im Report ist der tückischste, weil er nichts kaputt macht, sondern nur anders routet. Bei Nodes mit mehreren Ausgängen, etwa If oder Switch, hängt „Always Output Data" bisher ein leeres Item an den ersten Ausgang, auch wenn ein anderer Ausgang Daten geliefert hat. In v3 wird das leere Item nur noch erzeugt, wenn alle Ausgänge leer sind.

Detailansicht zu Always Output Data mit zwei betroffenen Workflows: Ingest Yearly Stackoverflow Developer Survey und AI Tool n8n Workflow starten, letzterer seit über einem Jahr nicht gelaufen

Praktisch finde ich, dass der Report Workflows erkennt, die seit über zwölf Monaten nicht gelaufen sind, und anbietet, sie gesammelt als „Won't fix" zu markieren. Das hält die Liste sauber, ohne dass man sich durch Altlasten arbeiten muss.

Bei mir war die Sache schnell erledigt. Ich habe mir beide Workflows angeschaut. An den betroffenen Stellen wird immer nur ein Item verarbeitet, die geänderte Logik wirkt sich also nicht aus. Beide Workflows habe ich deshalb im Migration Report auf „Won't fix" gesetzt. Das bedeutet nicht, dass man das Thema ignoriert. Man dokumentiert, dass man es geprüft und bewusst entschieden hat. Wenn ein Workflow mehrere Items über If- oder Switch-Nodes verteilt, lohnt sich ein genauerer Blick auf die Ausgaben.

Das Ergebnis

Nach den Anpassungen meldet der Migration Report 216 von 216 kompatiblen Workflows und keine Workflow-Issues mehr.

Migration Report mit 216 von 216 kompatiblen Workflows, No workflow issues detected, und zwei verbleibenden Instance Issues

Zwei Instance Issues bleiben offen. Beide tragen das Label „Capability removed" und sind eher Hinweise als To-dos:

  • Chat Hub ist deprecated und standardmäßig aus. In v3 verschwindet der Bereich „Chat" aus der Oberfläche. Er lässt sich über N8N_ENABLED_MODULES wieder aktivieren, mit v4 wird das Feature aber komplett entfernt.
  • „Import from URL" im Editor entfällt.

Ich nutze beides nicht, daher gibt es hier nichts zu tun. Wer den Chat Hub produktiv einsetzt, sollte sich aber jetzt schon Gedanken über eine Alternative machen. Das Wiedereinschalten verschiebt das Problem nur bis v4.

Die Instanz läuft weiterhin stabil auf 2.44.6. Der eigentliche Wechsel auf v3 ist jetzt im Wesentlichen ein Tausch des Image-Tags plus das Entfernen der Übergangsvariablen.

Meine Einschätzung

Der Migration Report ist das beste Upgrade-Werkzeug, das ich bisher in n8n gesehen habe. Statt ein Changelog gegen 216 Workflows abzugleichen, bekomme ich eine konkrete Liste mit Handlungsempfehlungen. Die Einordnung in „bricht" und „verhält sich anders" spart Zeit.

Der Agent war vor allem beim Infrastruktur-Teil hilfreich: Konfiguration lesen, Executions auswerten, Drift erkennen, Änderungen umsetzen und verifizieren. Das sind Aufgaben, die ich selbst hätte erledigen können, die aber deutlich länger gedauert hätten. Dass er vor jeder Änderung und jedem Neustart nach Freigabe gefragt hat, war für mich Voraussetzung.

Es gibt aber auch Grenzen:

  • Der Agent sieht den Migration Report nicht. Ich musste den Inhalt selbst übergeben.
  • Die Empfehlungen muss ich bewerten können. Ob 300 Sekunden Timeout sinnvoll sind oder Unverified Packages aktiv bleiben dürfen, ist eine Entscheidung, die ich treffe, nicht das Modell.
  • Ohne Snapshot und gepinnte Versionen würde ich so etwas nicht laufen lassen.

Fazit

Wer n8n selbst betreibt, sollte sich den Migration Report jetzt anschauen, nicht erst wenn die stabile 3.0 erscheint. Mein Vorgehen in Kurzform:

  1. Auf die aktuelle 2.x aktualisieren und den Migration Report öffnen.
  2. Snapshot oder Backup anlegen.
  3. Instance Issues im Docker-Setup lösen, möglichst schon unter 2.x.
  4. Betroffene Workflows umstellen und die Ausgaben vergleichen.
  5. Geprüfte, nicht betroffene Punkte und Altlasten als „Won't fix" markieren.
  6. Erst dann auf v3 wechseln, idealerweise zuerst auf einer Testinstanz.

Mit der vorbereiteten Instanz sehe ich dem Upgrade auf v3 relativ entspannt entgegen (ähnlich wie bei meiner Migration zu v2 vor einem Jahr).