The install is twenty minutes. What costs people a weekend six months later is the encryption key, the webhook URL and an executions table nobody ever pruned.Die Installation dauert zwanzig Minuten. Was Leute sechs Monate später ein Wochenende kostet, ist der Encryption Key, die Webhook-URL und eine Executions-Tabelle, die nie jemand aufgeräumt hat.
n8n is a Node application plus a database. Out of the box the database is SQLite — a single file inside the data directory — which is genuinely fine for a personal instance. Everything else is a reverse proxy and a certificate.n8n ist eine Node-Anwendung plus eine Datenbank. Ab Werk ist die Datenbank SQLite — eine einzelne Datei im Datenverzeichnis —, was für eine persönliche Instanz wirklich in Ordnung ist. Alles andere ist ein Reverse-Proxy und ein Zertifikat.
Memory is the honest constraint. Idle, n8n sits comfortably under 1 GiB. Load comes from concurrent executions and from the size of the payloads moving through them: a workflow that pulls a 50 MB CSV into memory is a different animal from one that posts a webhook to Slack. Start at 1 GiB, watch it, size up when you actually see pressure.Der Arbeitsspeicher ist die ehrliche Grenze. Im Leerlauf bleibt n8n bequem unter 1 GiB. Last entsteht durch gleichzeitige Ausführungen und durch die Größe der Payloads, die dabei durchlaufen: Ein Workflow, der eine 50-MB-CSV in den Speicher zieht, ist ein anderes Tier als einer, der einen Webhook an Slack schickt. Starte mit 1 GiB, beobachte es, und dimensioniere hoch, sobald du tatsächlich Druck siehst.
One thing that is not obvious until it bites: n8n is not a bot. A Discord bot only makes outbound connections, so it will run anywhere. n8n's whole point is Webhook nodes, and those need inbound HTTPS on a public hostname.Eine Sache, die nicht offensichtlich ist, bis sie zuschlägt: n8n ist kein Bot. Ein Discord-Bot baut nur ausgehende Verbindungen auf und läuft deshalb überall. Der ganze Sinn von n8n sind Webhook-Nodes, und die brauchen eingehendes HTTPS auf einem öffentlichen Hostnamen.
Cheap VPS plans very often give you NAT IPv4 — a shared public address with a handful of forwarded ports — rather than an address of your own. If you get a forwarded port like 41022 instead of ports 80 and 443, a plain https://n8n.example.com will not work, because you do not own 443 on that address.Günstige VPS-Tarife geben dir sehr oft NAT-IPv4 — eine geteilte öffentliche Adresse mit einer Handvoll weitergeleiteter Ports — statt einer eigenen Adresse. Bekommst du einen weitergeleiteten Port wie 41022 statt der Ports 80 und 443, funktioniert ein einfaches https://n8n.example.com nicht, weil dir Port 443 auf dieser Adresse nicht gehört.
Three honest ways out:Drei ehrliche Auswege:
Worth reading first: NAT IPv4 vs a dedicated IP and NAT IPv4, ports and forwarding.Lesenswert vorab: NAT IPv4 vs. dedizierte IP und NAT IPv4, Ports und Weiterleitung.
Deploy an Ubuntu LTS image, then do the boring part properly before anything else touches the internet — create a non-root user, put your SSH key on it, disable password login, and let the firewall default to deny. Our own walkthroughs for that are connect to your VPS over SSH and secure your VPS.Setze ein Ubuntu-LTS-Image auf, und erledige dann den langweiligen Teil ordentlich, bevor irgendetwas sonst das Internet berührt — leg einen Non-Root-User an, hinterlege deinen SSH-Key, deaktiviere den Passwort-Login und lass die Firewall standardmäßig blockieren. Unsere eigenen Anleitungen dazu sind über SSH mit deinem VPS verbinden und deinen VPS absichern.
Point an A record at the machine (n8n.example.com) and let DNS settle before you ask a certificate authority for anything.Richte einen A-Record auf die Maschine (n8n.example.com) und lass DNS sich setzen, bevor du eine Zertifizierungsstelle um irgendetwas bittest.
Pin a version tag. latest will eventually pull a release with a breaking change on a night you were not planning to debug anything.Pinne einen Versions-Tag. latest zieht irgendwann ein Release mit einer Breaking Change, ausgerechnet in einer Nacht, in der du nichts debuggen wolltest.
services:
n8n:
image: docker.n8n.io/n8nio/n8n:1.80.3 # pin it, don't use :latest
restart: unless-stopped
environment:
- N8N_HOST=n8n.example.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://n8n.example.com/
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- GENERIC_TIMEZONE=Europe/Berlin
- TZ=Europe/Berlin
- N8N_RUNNERS_ENABLED=true
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
volumes:
- n8n_data:/home/node/.n8n
ports:
- "127.0.0.1:5678:5678"
volumes:
n8n_data:
Two details in there are deliberate. The port is bound to 127.0.0.1, so the only thing that can reach n8n is the reverse proxy on the same host — not the whole internet, and not a stray scanner that found port 5678. And N8N_RUNNERS_ENABLED=true switches on task runners, which recent versions expect; leave it off and you get a deprecation warning in the log on every boot.Zwei Details darin sind Absicht. Der Port ist an 127.0.0.1 gebunden, sodass nur der Reverse-Proxy auf demselben Host n8n erreichen kann — nicht das ganze Internet, und kein Scanner, der zufällig Port 5678 gefunden hat. Und N8N_RUNNERS_ENABLED=true schaltet Task-Runner ein, die neuere Versionen erwarten; lässt du es aus, bekommst du bei jedem Boot eine Deprecation-Warnung im Log.
Put the key in a .env file next to the compose file, not in the compose file itself:Leg den Key in eine .env-Datei neben der Compose-Datei ab, nicht in der Compose-Datei selbst:
printf 'N8N_ENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" > .env
chmod 600 .env
Caddy is the shortest path, because it gets and renews the certificate without being asked:Caddy ist der kürzeste Weg, weil es das Zertifikat holt und erneuert, ohne dass man es bitten muss:
n8n.example.com {
reverse_proxy 127.0.0.1:5678
}
That is the entire config. nginx plus certbot works equally well and is worth it if you are already running nginx — you need proxy_pass, the usual Upgrade/Connection headers for the editor's websocket, and a client_max_body_size big enough for whatever files your workflows move.Das ist die gesamte Konfiguration. nginx plus certbot funktioniert genauso gut und lohnt sich, wenn du ohnehin schon nginx betreibst — du brauchst proxy_pass, die üblichen Upgrade/Connection-Header für das WebSocket des Editors und eine client_max_body_size, die groß genug für die Dateien ist, die deine Workflows bewegen.
1. The encryption key. n8n encrypts every saved credential with N8N_ENCRYPTION_KEY. If you never set one, it generates a key on first boot and writes it into .n8n/config inside the volume. Restore that volume onto a fresh host without that file and every credential you saved is unreadable — the workflows are all still there, quietly failing to authenticate. Set the key explicitly and store a copy somewhere that is not the same disk.1. Der Encryption Key. n8n verschlüsselt jede gespeicherte Credential mit N8N_ENCRYPTION_KEY. Setzt du nie einen, erzeugt es beim ersten Boot einen Key und schreibt ihn nach .n8n/config im Volume. Stellst du dieses Volume auf einem neuen Host wieder her, ohne diese Datei, ist jede gespeicherte Credential unlesbar — die Workflows sind alle noch da, scheitern aber still an der Authentifizierung. Setze den Key explizit und bewahre eine Kopie an einem Ort auf, der nicht dieselbe Festplatte ist.
2. WEBHOOK_URL. If it does not exactly match the public HTTPS address, the Webhook node happily shows you a URL nobody outside can reach, and the third-party service posts into nothing. This is the single most common "n8n is broken" report, and it is always a one-line fix.2. WEBHOOK_URL. Stimmt sie nicht exakt mit der öffentlichen HTTPS-Adresse überein, zeigt dir der Webhook-Node bereitwillig eine URL, die niemand von außen erreichen kann, und der Drittanbieter-Dienst postet ins Leere. Das ist die mit Abstand häufigste Meldung „n8n ist kaputt“, und es ist immer ein Ein-Zeilen-Fix.
3. The executions table. Every run is stored. Left alone, a chatty workflow will grow the database until the disk fills and the symptom is "n8n won't start". EXECUTIONS_DATA_PRUNE=true with EXECUTIONS_DATA_MAX_AGE (hours) and EXECUTIONS_DATA_PRUNE_MAX_COUNT fixes it before it happens. Do it on day one; it is free.3. Die Executions-Tabelle. Jeder Lauf wird gespeichert. Sich selbst überlassen, lässt ein geschwätziger Workflow die Datenbank wachsen, bis die Festplatte voll ist, und das Symptom ist „n8n startet nicht mehr“. EXECUTIONS_DATA_PRUNE=true mit EXECUTIONS_DATA_MAX_AGE (Stunden) und EXECUTIONS_DATA_PRUNE_MAX_COUNT behebt das, bevor es passiert. Mach es am ersten Tag; es kostet nichts.
SQLite is one writer at a time. Once you have several workflows firing concurrently, or you want a database you can back up with a dump rather than a file copy, move to Postgres:SQLite erlaubt immer nur einen Schreiber gleichzeitig. Sobald mehrere Workflows gleichzeitig feuern, oder du eine Datenbank willst, die du per Dump statt per Dateikopie sicherst, wechsle zu Postgres:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
Do it before you have data you care about. There is no supported in-place migration from the SQLite store to Postgres; the realistic path afterwards is exporting workflows and credentials and importing them into a fresh instance, and credentials only survive that if you carry the same encryption key. If you are running Postgres on the same box, run a database on your VPS covers the sizing and the backup habits.Mach das, bevor du Daten hast, an denen dir etwas liegt. Es gibt keine unterstützte In-Place-Migration vom SQLite-Store zu Postgres; der realistische Weg danach ist, Workflows und Credentials zu exportieren und in eine frische Instanz zu importieren, und Credentials überleben das nur, wenn du denselben Encryption Key mitnimmst. Läuft Postgres auf derselben Maschine, deckt eine Datenbank auf deinem VPS betreiben die Dimensionierung und die Backup-Gewohnheiten ab.
Two things need to survive the machine dying: the volume and the encryption key.Zwei Dinge müssen den Tod der Maschine überleben: das Volume und der Encryption Key.
docker run --rm \
-v n8n_data:/data:ro \
-v "$PWD":/backup \
alpine tar czf /backup/n8n-$(date +%F).tar.gz -C /data .
Copy that off the server. A backup that lives on the same disk as the thing it backs up is a file, not a backup — see back up your VPS for what we actually recommend, including what is and is not included by default.Kopiere das vom Server herunter. Ein Backup, das auf derselben Festplatte liegt wie das, was es sichert, ist eine Datei, kein Backup — sieh dir Backup deines VPS an für das, was wir tatsächlich empfehlen, einschließlich dessen, was standardmäßig enthalten ist und was nicht.
Updating is docker compose pull && docker compose up -d, but bump the pinned tag deliberately and read the release notes first. n8n moves quickly and node behaviour does change between minor versions.Updaten ist docker compose pull && docker compose up -d, aber ändere den gepinnten Tag bewusst und lies vorher die Release Notes. n8n bewegt sich schnell, und das Verhalten von Nodes ändert sich durchaus zwischen Minor-Versionen.
n8n is fair-code, not open source in the OSI sense. It ships under the Sustainable Use License: self-hosting it for your own or your company's internal purposes is explicitly fine, which is what nearly everyone reading this is doing. What the licence restricts is offering n8n to third parties as a service. If your plan is to run instances for clients, read the licence terms properly first rather than assuming — it is a short document and it is worth the ten minutes.n8n ist Fair-Code, nicht Open Source im Sinne der OSI. Es erscheint unter der Sustainable Use License: Es für die eigenen oder die internen Zwecke deines Unternehmens selbst zu hosten, ist ausdrücklich erlaubt — das ist es, was fast jeder tut, der das hier liest. Was die Lizenz einschränkt, ist, n8n Dritten als Dienst anzubieten. Willst du Instanzen für Kunden betreiben, lies die Lizenzbedingungen vorher gründlich, statt es anzunehmen — es ist ein kurzes Dokument, und die zehn Minuten lohnen sich.
Full disclosure: this is what we sell. A 1 GiB Starter is enough for a personal n8n; move up a tier when you add Postgres or run workflows that carry real payloads.Zur vollen Transparenz: Das ist, was wir verkaufen. Ein 1-GiB-Starter reicht für ein persönliches n8n; steige eine Stufe höher, sobald du Postgres hinzufügst oder Workflows mit echten Datenmengen laufen lässt.
Linux KVM VPS — EUR 4.99 to EUR 59.99 a month, on our own single-tenant bare metal in Dallas, TX and Charlotte, NC. Full hardware virtualisation (KVM), your own kernel, full root. Six tiers, vps-starter to vps-ultra. Starter is 1 vCPU, 1 GiB RAM, 25 GB disk.Linux-KVM-VPS — 4,99 bis 59,99 EUR im Monat, auf unserer eigenen Single-Tenant-Bare-Metal-Hardware in Dallas, TX und Charlotte, NC. Vollständige Hardware-Virtualisierung (KVM), eigener Kernel, volles Root. Sechs Tarife, vps-starter bis vps-ultra. Starter hat 1 vCPU, 1 GiB RAM, 25 GB Speicher.
You order in the shop, pay by card (Stripe) or SEPA bank transfer, and your login details are e-mailed to you once the service is set up. Support is e-mail, run by one person, with no guaranteed response time. All prices are final totals under the German small-business rule (§19 UStG); no VAT is added or shown.Du bestellst im Shop, zahlst per Karte (Stripe) oder SEPA-Überweisung, und deine Zugangsdaten werden dir per E-Mail zugeschickt, sobald der Dienst eingerichtet ist. Support läuft per E-Mail, von einer einzelnen Person betrieben, ohne garantierte Reaktionszeit. Alle Preise sind Endpreise. Gemäß § 19 UStG wird keine Umsatzsteuer ausgewiesen.
Order vps-starter → · Linux KVM VPS overviewvps-starter bestellen → · Übersicht Linux-KVM-VPS
Written by the person who runs overnight.host: a small, honest hosting company on dedicated bare metal — Linux VPS, game servers, web hosting. Live status at up.overnight.host.Geschrieben von der Person, die overnight.host betreibt: ein kleines, ehrliches Hosting-Unternehmen auf dedizierter Bare-Metal-Hardware — Linux-VPS, Gameserver, Webhosting. Live-Status unter up.overnight.host.
Around 1 GiB for a personal instance that runs a handful of workflows. Push to 2 GiB or more once you have concurrent executions, a Postgres on the same machine, or workflows that pull large files into memory. It is payload size and concurrency that drive memory, not the number of workflows you have saved.Etwa 1 GiB für eine persönliche Instanz, die eine Handvoll Workflows ausführt. Geh auf 2 GiB oder mehr, sobald du gleichzeitige Ausführungen hast, ein Postgres auf derselben Maschine läuft oder Workflows große Dateien in den Speicher ziehen. Es sind Payload-Größe und Gleichzeitigkeit, die den Speicherbedarf treiben, nicht die Anzahl gespeicherter Workflows.
Yes, if your workflows only use schedule and polling triggers, because those make outbound connections. Webhook triggers need inbound HTTPS on a public hostname, so you need either a dedicated IPv4, or TLS terminated somewhere that already has one and forwarded to your machine.Ja, wenn deine Workflows nur Schedule- und Polling-Trigger verwenden, weil die ausgehende Verbindungen aufbauen. Webhook-Trigger brauchen eingehendes HTTPS auf einem öffentlichen Hostnamen, also brauchst du entweder eine dedizierte IPv4 oder TLS, das irgendwo terminiert wird, das schon eine hat, und dann zu deiner Maschine weitergeleitet wird.
SQLite is fine for a personal instance and is the default. Move to Postgres when you have concurrent executions or want dump-based backups. Switch early: there is no supported in-place conversion, so doing it later means exporting and re-importing.SQLite ist für eine persönliche Instanz in Ordnung und ist der Standard. Wechsle zu Postgres, wenn du gleichzeitige Ausführungen hast oder dump-basierte Backups willst. Wechsle früh: Es gibt keine unterstützte In-Place-Umwandlung, später bedeutet es also Exportieren und erneutes Importieren.
Your workflows survive; your saved credentials do not. n8n cannot decrypt them and you re-enter every credential by hand. Back up the key separately from the data volume.Deine Workflows überleben; deine gespeicherten Credentials nicht. n8n kann sie nicht entschlüsseln, und du trägst jede Credential von Hand neu ein. Sichere den Key getrennt vom Daten-Volume.
The community edition is free to run under the Sustainable Use License, which covers internal use. Some features are reserved for the paid tiers, and offering n8n as a service to third parties is a separate licensing question.Die Community Edition darfst du kostenlos unter der Sustainable Use License betreiben, die die interne Nutzung abdeckt. Manche Funktionen sind den bezahlten Tarifen vorbehalten, und n8n Dritten als Dienst anzubieten, ist eine eigene lizenzrechtliche Frage.
Prices are final totals; no VAT is shown (§19 UStG). Need something the shop does not list? Email us for a written offer.Alle Preise sind Endpreise ohne ausgewiesene USt. (§19 UStG). Du brauchst etwas, das nicht im Shop steht? Schreib uns für ein schriftliches Angebot.
Order now →Jetzt bestellen → Request a custom configIndividuelle Konfiguration anfragen