Zum Inhalt springen
Illustration: Ein Server mit einer Kette aus drei Workflow-Knoten auf der Front steht hinter einem Zaun mit verschlossenem Tor; daneben eine Sicherungsplatte mit Kreispfeil und ein Schild.
KI

n8n selbst hosten: Docker, Hetzner, HTTPS, Härtung, Backup

Von · · 11 Min. Lesezeit

n8n selbst hosten heißt: Die Automatisierungssoftware läuft auf einem eigenen Server statt in der Cloud von n8n, und die Daten jedes Ablaufs bleiben dort. Die Community Edition ist kostenlos und für die eigenen Abläufe eines Betriebs uneingeschränkt nutzbar. Auf einem Cloud-Server mit Docker dauert die Einrichtung eine Stunde. Die Anleitung unten folgt der offiziellen Dokumentation von n8n in der Fassung vom 05.10.2026, aktuelle stabile Version 2.41.6.

Selbst hosten macht n8n nicht sicherer, sondern dich verantwortlich. n8n schreibt das gleich oben in die eigene Anleitung: „n8n recommends self-hosting for expert users. Mistakes can lead to data loss, security issues, and downtime.“ (n8n, Docker Compose). Allein 2026 hat n8n bis Anfang Oktober 196 Sicherheitshinweise auf GitHub veröffentlicht, darunter eine Lücke mit der Höchstwertung 10, über die Unangemeldete über Webhooks Dateien vom Server lesen konnten (CVE-2026-21858). Wer einen n8n-Server betreibt, betreibt also ein System, das jede Woche ein Update braucht und Zugangsdaten zu allen angebundenen Diensten hält.

Was du brauchst#

  • Einen Server. n8n verlangt für den eigenen Docker-Compose-Aufbau mindestens 4 GB RAM und 2 vCPU. Bei Hetzner sind das der CX23 (Intel/AMD) für 5,49 € oder der CAX11 (ARM) für 5,99 € im Monat, jeweils netto, in Falkenstein, Nürnberg oder Helsinki (Hetzner, Preisanpassung ab 15.06.2026). Dazu kommen 0,50 € für die IPv4-Adresse und 20 % des Serverpreises, wenn du die täglichen Hetzner-Backups einschaltest.
  • Eine Subdomain, etwa n8n.beispiel.at, mit einem A-Eintrag auf die IP-Adresse des Servers. Wie man prüft, ob der Eintrag schon überall angekommen ist, steht in DNS-Eintrag prüfen.
  • Ein SSH-Schlüsselpaar. Hetzner bietet beim Anlegen Passwort oder Schlüssel an; die n8n-Anleitung für Hetzner sagt dazu nur: „SSH is more secure.“ (n8n, Hetzner).

Server anlegen und absichern#

Der Weg dauert eine Viertelstunde.

  1. Server mit Ubuntu 24.04 und SSH-Schlüssel anlegen. Im Hetzner-Projekt unter „Server hinzufügen“ den Standort und den Typ wählen, den öffentlichen Schlüssel hinterlegen. Hetzner bietet im Reiter „Apps“ auch ein fertiges Abbild mit Docker an; die Anleitung unten installiert Docker selbst, damit klar ist, woher es kommt.
  2. Cloud-Firewall davorsetzen. In der Hetzner Console eine Firewall mit drei eingehenden Regeln anlegen: TCP 22 (am besten nur von der eigenen IP-Adresse), TCP 80 und TCP 443. Alles andere ist dann gesperrt: Eine Hetzner-Firewall blockiert eingehenden Verkehr, für den keine Regel existiert, und kostet nichts (Hetzner, Firewalls). Port 5678 von n8n bleibt so von außen unerreichbar, auch wenn ihn ein Container doch einmal öffnet.
  3. Anmeldung mit Passwort abschalten. In einer Datei unter /etc/ssh/sshd_config.d/, etwa 10-haertung.conf:
PasswordAuthentication no
PermitRootLogin prohibit-password

Danach sudo sshd -t zum Prüfen und sudo systemctl restart ssh.service. Die zweite SSH-Sitzung bleibt offen, bis die neue Anmeldung klappt; Ubuntu warnt ausdrücklich, dass man sich sonst aussperren kann (Ubuntu, OpenSSH, OpenSSH, sshd_config).

  1. Sicherheitsupdates automatisch einspielen. sudo apt install unattended-upgrades, dann in /etc/apt/apt.conf.d/20auto-upgrades die beiden Zeilen APT::Periodic::Update-Package-Lists "1"; und APT::Periodic::Unattended-Upgrade "1"; (Ubuntu, automatische Updates). Das betrifft nur Ubuntu-Pakete. Docker aus dem eigenen Repository und n8n selbst laufen da nicht mit.
  2. Docker aus dem offiziellen Repository installieren. Die Befehle stehen in der Docker-Dokumentation für Ubuntu, am Ende sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin. Das bequeme Installationsskript ist laut Docker „isn't recommended for production environments“.

Die Compose-Datei#

n8n beschreibt mehrere Aufbauten. Der hier hält sich an die Hetzner-Anleitung von n8n (Caddy als Reverse Proxy) und an die Anleitung für Task-Runner im externen Modus. In ein Verzeichnis n8n auf dem Server kommen drei Dateien. Zuerst compose.yaml:

services:
  caddy:
    image: caddy:2.11.6
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data

  n8n:
    image: n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    env_file: .env
    environment:
      - N8N_HOST=${N8N_HOST}
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_WEBHOOK_URL=https://${N8N_HOST}/
      - N8N_PROXY_HOPS=1
      - NODE_ENV=production
      - GENERIC_TIMEZONE=Europe/Vienna
      - TZ=Europe/Vienna
      - N8N_RUNNERS_MODE=external
      - N8N_RUNNERS_BROKER_LISTEN_ADDRESS=0.0.0.0
      - N8N_DIAGNOSTICS_ENABLED=false
      - N8N_VERSION_NOTIFICATIONS_ENABLED=false
      - N8N_PUBLIC_API_DISABLED=true
      - EXECUTIONS_DATA_MAX_AGE=336
    volumes:
      - n8n_data:/home/node/.n8n

  runners:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      - N8N_RUNNERS_TASK_BROKER_URI=http://n8n:5679
      - N8N_RUNNERS_AUTH_TOKEN=${N8N_RUNNERS_AUTH_TOKEN}
    depends_on:
      - n8n

volumes:
  caddy_data:
  n8n_data:

Dann .env, mit zwei Zufallswerten aus openssl rand -hex 32:

N8N_VERSION=2.41.6
N8N_HOST=n8n.beispiel.at
N8N_ENCRYPTION_KEY=<erster Zufallswert>
N8N_RUNNERS_AUTH_TOKEN=<zweiter Zufallswert>

Und Caddyfile, wörtlich aus der n8n-Anleitung bis auf den Namen:

n8n.beispiel.at {
    reverse_proxy n8n:5678 {
        flush_interval -1
    }
}

Mit chmod 600 .env liest nur noch der Eigentümer die Datei, danach sudo docker compose up -d. Caddy holt das Zertifikat von Let's Encrypt beim ersten Aufruf selbst und leitet HTTP auf HTTPS um (Caddy, Automatic HTTPS). Die Datei ist mit docker compose config auf Gültigkeit geprüft. Auf einem Server gestartet habe ich genau diese Fassung nicht: Wer sie übernimmt, prüft nach dem Start mit sudo docker compose logs n8n, dass n8n den Runner findet.

Was die Zeilen tun, die nicht selbsterklärend sind:

  • Kein ports: bei n8n. n8n ist nur über Caddy im internen Netz von Docker erreichbar. Die offizielle Traefik-Variante bindet 5678 zusätzlich an 127.0.0.1, das ist ebenso in Ordnung. Ein "5678:5678" ohne Adresse dagegen öffnet den Port nach außen und an der Ubuntu-Firewall ufw vorbei, weil Docker eigene Regeln setzt. Diese Falle beschreibt Lokale KI mit Ollama für Port 11434.
  • N8N_WEBHOOK_URL statt WEBHOOK_URL. Der alte Name gilt seit Version 2.35.0 als veraltet, steht aber noch in mehreren offiziellen Beispielen (n8n, Webhook-Adressen). N8N_PROXY_HOPS=1 sagt n8n, dass genau ein Proxy davorsteht.
  • Der Runner-Container. Er führt den Code aus Code-Knoten aus. n8n warnt: „Task runners are the only isolation layer between user-provided code and n8n. Without them, or with internal mode, anyone who can edit a workflow could potentially read your database, encryption key, stored credentials, and environment variables.“ Für den Betrieb verlangt die Doku den externen Modus; der interne gilt ab Version 3.0 als veraltet (n8n, Task-Runner). Die Versionen von n8nio/n8n und n8nio/runners müssen gleich sein, deshalb kommen beide aus derselben Variable.
  • Telemetrie aus, öffentliche API aus. n8n sendet standardmäßig anonyme Nutzungsdaten, alle sechs Stunden etwa die Zahl der Ausführungen (n8n, Telemetrie). Die REST-API braucht nur, wer n8n von außen fernsteuert; n8n empfiehlt, sie sonst abzuschalten. Wer die Versionshinweise abschaltet, muss die Releases selbst verfolgen.
  • EXECUTIONS_DATA_MAX_AGE=336 löscht Ausführungsdaten nach 14 Tagen. Das ist der Standard, hier steht er ausdrücklich, weil jede Ausführung die Daten enthält, die durch den Ablauf geflossen sind: Mails, Namen, Rechnungen.
  • SQLite statt Postgres. Ohne Datenbank-Container nimmt n8n SQLite. n8n hält das für ein paar Nutzer und Abläufe für ausreichend und rät erst bei Dauerbetrieb mit vielen Abläufen zu Postgres (n8n, Datenbank).
Illustration: Aus der Schublade eines Servers wandert eine Sicherungsplatte zu einem zweiten Ablagekasten; dazwischen hängt ein grün leuchtender Schlüssel an einem Haken.

Nach dem ersten Start#

  1. Sofort die Adresse aufrufen und das Eigentümerkonto anlegen. Bis das passiert ist, kann jeder, der die Adresse kennt, sich als Eigentümer registrieren. Einen Weg, den Anmeldeschirm abzuschalten, gibt es seit Version 1.0 nicht mehr.
  2. Zwei-Faktor-Anmeldung einschalten, im eigenen Profil mit einer Authenticator-App (n8n, 2FA). Für alle Nutzer erzwingen lässt sie sich erst im Business-Tarif.
  3. Den kostenlosen Lizenzschlüssel holen, unter Settings → Usage and plan → „Unlock“. Er schaltet in der Community Edition Ordner, „Debug in editor“ und eigene Ausführungsdaten frei (n8n, Editionen).
  4. Den Sicherheitsbericht laufen lassen: sudo docker compose exec n8n n8n audit meldet Risiken in fünf Bereichen, von Zugangsdaten bis zu gefährlichen Knoten (n8n, Audit).

Knoten wie „Execute Command“, die Befehle auf dem Server ausführen, sind seit Version 2.0 standardmäßig gesperrt. Das bleibt so.

Backup: der Schlüssel zählt mehr als die Daten#

n8n verschlüsselt alle gespeicherten Zugangsdaten mit dem N8N_ENCRYPTION_KEY. Die Doku: „Without the encryption key from the config file, or a custom N8N_ENCRYPTION_KEY, a restored database or encrypted credential export can't be decrypted.“ (n8n, Backup). Ein Backup ohne den Schlüssel ist eine Sammlung unlesbarer Passwörter. Er gehört deshalb getrennt vom Server in einen Passwortmanager, am Tag der Installation.

Das Backup selbst hat zwei Teile:

  • Das Volume n8n_data. Darin liegen bei SQLite die Datenbank und die Konfiguration. n8n verlangt, den Dienst vorher anzuhalten. Docker stellt dem Volume den Namen des Verzeichnisses voran, bei einem Verzeichnis n8n heißt es n8n_n8n_data, docker volume ls zeigt den genauen Namen:
cd ~/n8n
sudo docker compose stop n8n
sudo docker run --rm -v n8n_n8n_data:/daten:ro -v "$PWD/sicherung":/ziel \
  alpine tar czf /ziel/n8n-$(date +%F).tar.gz -C /daten .
sudo docker compose start n8n
  • Ein Export der Abläufe und Zugangsdaten, lesbar und unabhängig von der Datenbank: sudo docker compose exec -u node n8n n8n export:workflow --backup --output=/home/node/.n8n/export/workflows/ und dasselbe mit export:credentials. Die Zugangsdaten bleiben dabei verschlüsselt, solange du nicht --decrypted angibst. Benutzer, Ausführungen und Einstellungen fehlen in diesem Export.

Das Archiv geht danach auf ein zweites System, etwa eine Hetzner Storage Box oder einen Rechner im Büro. Die täglichen Hetzner-Backups des Servers sind praktisch, ersetzen das nicht: Sie liegen beim selben Anbieter, im selben Konto, und sieben Stände sind das Maximum (Hetzner, Backups). Eine Rücksicherung, die nie geprobt wurde, ist kein Backup.

Updates#

n8n veröffentlicht fast jede Woche eine neue Version und rät, mindestens einmal im Monat zu aktualisieren, die Release Notes auf Änderungen zu prüfen, die etwas kaputt machen, und vorher eine vollständige Sicherung zu ziehen (n8n, Update). Mit festgeschriebener Version heißt das: in .env die neue Nummer eintragen, Backup ziehen, dann

sudo docker compose pull
sudo docker compose up -d

Die feste Nummer statt latest hat einen Grund: Ein Update ist dann eine Entscheidung mit Backup davor, kein Zufall beim nächsten Neustart. Bei kritischen Sicherheitshinweisen wartet man nicht bis zum Monatsende. Die Liste steht unter Security Advisories, mit „Watch“ → „Security alerts“ kommt jede neue per Mail.

Lizenz und DSGVO#

Lizenz. n8n steht unter der Sustainable Use License, nicht unter einer Open-Source-Lizenz. Erlaubt ist die Nutzung „for your own internal business purposes“, auch Abläufe für Kunden zu bauen und dafür Geld zu nehmen, solange die Kunden sie nicht selbst bearbeiten können. Nicht erlaubt ist, n8n als Dienst anzubieten, in dem Kunden eigene Abläufe bauen (n8n, Lizenz-FAQ).

DSGVO. Bei der eigenen Installation ist n8n laut eigener Doku „neither a Controller nor a Processor“, weil die n8n GmbH keine Daten sieht. Auftragsverarbeiter ist dann der Hoster: Mit Hetzner schließt du den Auftragsverarbeitungsvertrag im Konto unter accounts.hetzner.com/account/dpa per Häkchen ab (Hetzner, Datenschutz-FAQ). Was der Vertrag regeln muss, steht in Was ist ein Auftragsverarbeitungsvertrag?.

Der Server in Nürnberg löst aber nur einen Teil. Jeder Ablauf, der Daten an OpenAI, Google oder einen anderen Dienst schickt, braucht für diesen Dienst wieder eine eigene Prüfung: Vertrag, Speicherort, Training. Selbst gehostet ist die Plattform, nicht der Datenfluss. Die Reihenfolge der Fragen dazu steht in KI DSGVO-konform einsetzen, die Verträge der großen KI-Anbieter in Auftragsverarbeitungsvertrag mit KI-Anbietern. Wer die Sprachmodelle ebenfalls im Haus halten will, bindet in n8n ein lokales Modell über Ollama an.

Was nicht hilft#

Port 5678 offen lassen, „nur zum Testen“. Dann spricht der Browser n8n ohne HTTPS an, und das Sitzungs-Cookie geht im Klartext durchs Netz. n8n setzt es standardmäßig nur über HTTPS (N8N_SECURE_COOKIE=true); wer das zum Testen abschaltet, vergisst es später.

latest und ein Werkzeug, das Container nachts automatisch aktualisiert. Ein ungetestetes Update mit Änderungen an der Datenbank, ohne Backup davor, ist genau der Fall, für den die Release Notes warnen.

Der Schlüssel nur auf dem Server. Ist der Server weg, sind alle Zugangsdaten in jedem Backup wertlos.

Den Code-Knoten für alle freigeben. Wer Abläufe bearbeiten darf, kann Code ausführen. Konten in n8n bekommt nur, wer Abläufe tatsächlich bauen soll.

Was kostet n8n? Cloud, selbst gehostet oder betrieben#

Drei Wege, drei Preisschilder, und das teuerste steht auf keiner Preisseite:

WegWas es kostetWas dazukommt
n8n Cloudab 20 € im Monat bei jährlicher Zahlung (n8n, Preise), Server in Frankfurtnichts zu warten; Grenzen bei Ausführungen je Tarif
Selbst gehostetSoftware kostenlos unter der Sustainable Use License; Server bei Hetzner ab 5,49 € netto im Monat plus 0,50 € für die IPv4-Adresse, Backups 20 % obendraufdie Stunde im Monat für Updates und Rücksicherung, siehe unten
Betrieb durch cyberscaleEinrichtung als Teil eines fertigen Ablaufs für 1.900 €, danach Betreuung 99 € im Monat je Ablauf (KI-Automatisierung, Pakete)Serverkosten laufen über dich; Modellgebühren des KI-Anbieters direkt an ihn

Die Softwarekosten sind bei allen drei Wegen klein. Was ein Ablauf im Monat wirklich kostet, sind die Gebühren des KI-Anbieters je Anfrage und die Stunden, die jemand mit Prüfen und Nachjustieren verbringt; wie man das vorher rechnet, steht in Was kostet KI-Automatisierung?.

Wann sich selbst hosten lohnt#

Der eigene Server ist billiger als die Cloud, aber nur, wenn jemand die Updates tatsächlich einspielt und die Rücksicherung einmal geprobt hat. Für einen Betrieb ohne eigene Technik ist das eine Stunde im Monat, die jemand fest im Kalender braucht. Wer die Einrichtung samt Härtung prüfen lassen will, findet den Sicherheits-Check unter Security, wer erst klären will, welcher Ablauf sich überhaupt lohnt, den KI-Check unter KI-Automatisierung.

Stand 07.10.2026. Befehle und Konfiguration am 05.10.2026 gegen die Dokumentation von n8n, Docker, Ubuntu, Caddy und Hetzner geprüft; Image-Versionen n8n 2.41.6 und Caddy 2.11.6 auf Docker Hub nachgesehen. Hetzner-Preise netto ohne Umsatzsteuer.

Weiterlesen