Tropic Host

n8n: Was es ist und wie man es mit Docker Compose auf einem VPS installiert

9 Min Lesezeit
Tropic
n8n: Was es ist und wie man es mit Docker Compose auf einem VPS installiert

n8n auf einem VPS: die eigene Automatisierungsplattform ohne manuelle Routinearbeit

Eine Anfrage geht über die Website ein. n8n prüft die Daten, sucht nach Duplikaten, legt einen Vorgang an, erstellt mithilfe von KI einen Antwortentwurf und benachrichtigt den zuständigen Mitarbeiter per Telegram. Ein Mensch greift nur dort ein, wo eine Entscheidung erforderlich ist – nicht, um Daten zwischen Browser-Tabs zu übertragen.

Im Folgenden sehen wir uns an, wie n8n funktioniert und wie Sie es mit Docker Compose, PostgreSQL, HTTPS und isolierter Codeausführung auf einem VPS installieren.

n8n in sieben Schritten

Der minimale Startplan:

  1. Erstellen Sie einen VPS und richten Sie eine Subdomain darauf aus, zum Beispiel n8n.example.com.
  2. Installieren Sie Docker und Docker Compose.
  3. Starten Sie n8n mit PostgreSQL, einem externen Task Runner und Caddy.
  4. Öffnen Sie die Oberfläche über HTTPS und erstellen Sie das Eigentümerkonto.
  5. Verbinden Sie Telegram, ein CRM, E-Mail oder eine beliebige externe API.
  6. Konfigurieren Sie die Fehlerbehandlung und die Aufbewahrungsdauer der Ausführungsdaten.
  7. Automatisieren Sie Backups der Datenbank, der Daten und des Verschlüsselungsschlüssels.

Für eine kleine produktive Installation ist ein Einstieg mit 2 vCPU und 4 GB RAM sinnvoll. Für Tests reichen häufig 2 GB, doch PostgreSQL, Docker und parallele Prozesse verbrauchen die verbleibenden Reserven schnell.

Was n8n ist und wie es funktioniert

n8n ist eine Plattform zur Automatisierung von Workflows. Ein Ablauf wird aus Nodes zusammengesetzt: Einer startet den Prozess, die folgenden rufen Daten ab und verarbeiten sie, und der letzte führt eine Aktion aus.

Ein einfacher Workflow sieht so aus:

Webhook → Datenprüfung → CRM → Telegram → Antwort an die Website

Die Kette kann durch einen Webhook, einen Zeitplan, eine E-Mail, eine Nachricht oder ein Ereignis eines externen Dienstes ausgelöst werden. Zwischen den Nodes stehen Bedingungen, Schleifen, Filter, Wartezeiten und Fehlerbehandlung zur Verfügung.

Eine Stärke von n8n besteht darin, dass die Automatisierung nicht auf fertige Integrationen beschränkt ist. Jeder Dienst mit einer API kann über HTTP Request angesprochen werden, während sich individuelle Logik in einem Code node mit JavaScript oder Python schreiben lässt. Damit liegt n8n zwischen einem einfachen No-Code-Baukasten und selbst entwickeltem serverseitigem Code.

Warum es um mehr als die Weiterleitung von Daten geht

n8n ist besonders nützlich, wenn ein Prozess mehrere Systeme durchläuft und eine Entscheidung erfordert:

Formular → Prüfung → Duplikatsuche → KI-Bewertung → Freigabe durch den Mitarbeiter → CRM

Der Mensch kann auf einen einzigen Kontrollpunkt beschränkt werden. So erstellt die KI beispielsweise eine Antwort, die jedoch erst nach der Freigabe durch einen Mitarbeiter an den Kunden gesendet wird.

Typische Szenarien:

  • Vertrieb und Support: Anfragen erfassen, Leads verteilen und Vorgänge anlegen;
  • Content und KI: Entwürfe erstellen, Anfragen klassifizieren und nach Freigabe veröffentlichen;
  • DevOps: Störungsmeldungen, Webhooks aus Git und API-Prüfungen;
  • interne Abläufe: Tabellen, E-Mail, Kalender und Unternehmenssysteme synchronisieren.

Eine selbst gehostete Installation gibt Ihnen Kontrolle über den Prozess und die Datenbank, macht externe Dienste jedoch nicht lokal. Daten, die an Telegram, ein CRM oder ein cloudbasiertes KI-Modell gesendet werden, verlassen den VPS.

n8n Cloud oder eigener Server

Parametern8n Cloudn8n auf einem VPS
StartKeine ServerkonfigurationDomain, Docker und HTTPS erforderlich
UpdatesWerden von n8n durchgeführtWerden vom Eigentümer durchgeführt
Datenbank und DateienIn der Infrastruktur des DienstesAuf dem ausgewählten Server
SkalierungNach den Bedingungen des Cloud-TarifsEigenständig konfigurierbar
VerantwortungWeniger AdministrationsaufwandBackups, Schutz und Monitoring liegen beim Eigentümer
Geeignet fürSchneller Start ohne DevOpsKontrolle, Anpassung und dauerhaft laufende Prozesse

Die Community Edition kann kostenlos selbst gehostet und für persönliche sowie interne Geschäftsprozesse verwendet werden. n8n wird jedoch nicht unter einer klassischen Open-Source-Lizenz, sondern im Fair-Code-Modell unter der Sustainable Use License vertrieben. Sie erlaubt die interne Nutzung und Modifikation, gestattet es aber nicht, n8n einfach bereitzustellen, mit dem eigenen Logo zu versehen und den Zugang als eigenständiges SaaS zu verkaufen. Für ein solches Produkt müssen die Lizenzbedingungen gesondert geprüft werden.

Serveranforderungen von n8n

Die Last hängt von Datenmenge, Parallelität und Art der Vorgänge ab. Dateien, lange Listen, Code nodes und Workflows mit KI benötigen mehr Arbeitsspeicher als das Übertragen kleiner JSON-Daten zwischen APIs.

SzenarioEinstiegskonfiguration
Tests und persönliche textbasierte Workflows1 vCPU, 2 GB RAM, 20 GB NVMe
Kleine produktive Installation2 vCPU, 4 GB RAM, 25–40 GB NVMe
Parallele Prozesse, KI oder Dateien4 vCPU, 8 GB RAM oder mehr
Mehrere Worker-Prozesse im queue modeAuslegung nach Anzahl der Ausführungen

SQLite eignet sich zum Kennenlernen und für eine kleine Einzelinstanz. Für den produktiven Einsatz ist PostgreSQL praktischer: Backups sind einfacher, und ein späterer Wechsel in den queue mode ist leichter möglich.

So installieren Sie n8n auf einem VPS

In diesem Beispiel kommen Ubuntu 24.04, PostgreSQL, Caddy und ein externer Task Runner zum Einsatz. Ersetzen Sie n8n.example.com und die Zeitzone durch Ihre eigenen Werte.

1. DNS einrichten und Server vorbereiten

Erstellen Sie einen DNS-A-Eintrag, der auf die IPv4-Adresse des VPS verweist, und verbinden Sie sich anschließend per SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Installieren Sie Docker Engine und das Compose-Plugin aus dem offiziellen Repository:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

Öffnen Sie ausschließlich SSH, HTTP und HTTPS:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Schließen Sie die aktuelle SSH-Sitzung erst, wenn Sie geprüft haben, dass eine neue Verbindung funktioniert.

2. Umgebungsvariablen erstellen

Bereiten Sie das Verzeichnis vor:

mkdir -p /opt/n8n
cd /opt/n8n

Erstellen Sie .env. Die folgenden Befehle erzeugen sofort unterschiedliche zufällige Geheimnisse für PostgreSQL, die n8n-Verschlüsselung und den Task Runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

Für den ersten Start ist das Tag stable praktisch. Nach der Überprüfung der Installation sollten Sie eine konkrete n8n-Version festlegen, damit ein künftiges Image-Update nicht unerwartet erfolgt.

N8N_ENCRYPTION_KEY darf nicht verloren gehen. Mit diesem Schlüssel verschlüsselt n8n gespeicherte Passwörter, Tokens und andere Zugangsdaten. Wenn nur PostgreSQL ohne den Schlüssel wiederhergestellt wird, bleiben die Einträge zwar in der Datenbank, n8n kann sie jedoch nicht lesen.

3. Docker Compose erstellen

Erstellen Sie die Datei compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: "5432"
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_HOST: ${N8N_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

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

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

Der externe Task Runner führt Code getrennt vom Hauptprozess von n8n aus. Das ist sicherer als der interne Modus und verhindert, dass ein Fehler in einem Code node so leicht den Editor und die Verarbeitung von Webhooks beeinträchtigt.

4. HTTPS anbinden

Erstellen Sie die Datei Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

Caddy bezieht automatisch ein TLS-Zertifikat, wenn DNS bereits auf den VPS verweist und die Ports 80 und 443 erreichbar sind. Der interne Port 5678 wird nicht im Internet veröffentlicht: Von außen sind nur 80 und 443 erreichbar, während Caddy über das Docker-Netzwerk auf n8n zugreift.

Die Variablen N8N_WEBHOOK_URL und N8N_PROXY_HOPS sind erforderlich, damit der Editor korrekte öffentliche Webhook-Adressen erzeugt und den Headern eines Reverse Proxys vertraut.

5. n8n starten

Prüfen Sie die endgültige Konfiguration und starten Sie die Container:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

Öffnen Sie:

https://n8n.example.com

Erstellen Sie das Eigentümerkonto. Geben Sie dessen Passwort nicht an Kollegen weiter: Verwenden Sie für die Zusammenarbeit getrennte Konten und gewähren Sie nur die jeweils benötigten Rechte.

Der erste nützliche Workflow

Ein guter Test ist die Verarbeitung einer Anfrage von der Website:

  1. Fügen Sie einen Webhook-Node mit der Methode POST hinzu.
  2. Behalten Sie mit Edit Fields nur Name, E-Mail-Adresse und Quelle bei.
  3. Lehnen Sie mit einem If-Node Anfragen ohne Pflichtangaben ab.
  4. Legen Sie einen Vorgang im CRM an oder senden Sie über HTTP Request eine Anfrage.
  5. Fügen Sie eine Benachrichtigung in Telegram hinzu.
  6. Beenden Sie die Kette mit einem Respond to Webhook-Node.
  7. Aktivieren Sie den Workflow nach dem Test und ersetzen Sie den Test-Webhook durch die produktive URL.

Dieses Beispiel prüft unmittelbar Domain, HTTPS, eingehende Anfragen, Zugangsdaten und die externe Integration. Anschließend sollten Sie einen separaten Error Workflow hinzufügen, der über einen Ausfall der Hauptkette informiert.

Sicherheit von n8n nach der Installation

Ein installiertes n8n ist noch kein zuverlässiges n8n. Prüfen Sie nach dem Start, ob:

  • der Editor ausschließlich über HTTPS erreichbar ist;
  • .env die Rechte 600 besitzt und nicht in Git landet;
  • externe API-Schlüssel nur die minimal erforderlichen Rechte haben;
  • Webhooks die Signatur oder das Geheimnis der Quelle prüfen;
  • der Ausführungsverlauf automatisch bereinigt wird;
  • Fehler kritischer Workflows an den Administrator gesendet werden.

Community nodes werden als Pakete installiert und können Zugriff auf Workflow-Daten und den Server erhalten. Fügen Sie keine unbekannten Nodes ohne Prüfung hinzu. Wenn Sie sie nicht benötigen, deaktivieren Sie sie mit N8N_COMMUNITY_PACKAGES_ENABLED=false.

Starten Sie die integrierte Prüfung:

docker compose exec n8n n8n audit

Sie hilft dabei, ungeschützte Webhooks, riskante Nodes und Probleme mit Zugangsdaten zu erkennen, ersetzt jedoch keine manuelle Kontrolle.

Ausführungsverlauf und personenbezogene Daten

n8n speichert Ein- und Ausgabedaten zur Fehlersuche. Zusammen mit ihnen können E-Mails, Telefonnummern, Dokumente und API-Antworten in der Datenbank verbleiben.

In der oben gezeigten Konfiguration werden Ausführungen nach sieben Tagen gelöscht und ihre Anzahl auf 10.000 begrenzt. Bei sensiblen Prozessen sollte die Frist nach der Richtlinie zur Datenaufbewahrung gewählt und unnötige Felder sollten vor Abschluss des Workflows entfernt werden.

Backups und Updates

Für eine Wiederherstellung benötigen Sie einen PostgreSQL-Dump, das Volume n8n_data, die Konfigurationsdateien und .env mit N8N_ENCRYPTION_KEY. Stoppen Sie vor dem Kopieren die verarbeitenden Container, während PostgreSQL weiterläuft. Dadurch entsteht eine kurze Unterbrechung der Workflows:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

Das Archiv mit .env enthält Geheimnisse: Verschlüsseln Sie es und bewahren Sie es außerhalb des VPS auf. Überprüfen Sie die Kopie regelmäßig durch eine testweise Wiederherstellung.

Erstellen Sie vor einem Update ein Backup und lesen Sie die Versionshinweise:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

Task Runner und Hauptcontainer müssen dasselbe Versions-Tag verwenden.

Wann eine Skalierung erforderlich wird

Beginnen Sie nicht mit Redis und mehreren Workern, bevor eine reale Last besteht. Eine einzelne Instanz mit PostgreSQL lässt sich einfacher verwalten und reicht für kleine interne Prozesse in der Regel aus.

Der queue mode wird benötigt, wenn lang laufende Aufgaben Webhooks verzögern, viele Workflows gleichzeitig starten oder die Dateiverarbeitung regelmäßig den gesamten Arbeitsspeicher belegt. Dann nimmt die Hauptinstanz Ereignisse entgegen, Redis verteilt die Aufträge und Worker führen sie parallel aus. Alle Komponenten müssen mit derselben PostgreSQL-Datenbank verbunden sein und denselben N8N_ENCRYPTION_KEY verwenden.

Welcher VPS für n8n geeignet ist

Für die Kombination aus n8n, PostgreSQL, Caddy und Task Runner ist ein Einstieg mit 2 vCPU, 4 GB RAM und einem NVMe-Laufwerk sinnvoll. Bei tropic.host entspricht dies dem Tarif Light: 2 vCPU, 4 GB RAM und 25 GB NVMe. Das reicht für die ersten produktiven Workflows ohne aufwendige Dateiverarbeitung.

Für Dokumente, große Datenmengen und zahlreiche parallele Workflows mit KI sind 8 GB RAM die bessere Wahl. Auch ein stabiles Netzwerk ist wichtig: Webhooks, OAuth-Rückrufe und geplante Aufgaben müssen dauerhaft erreichbar bleiben.

Fazit

n8n verwandelt wiederkehrende Arbeitsschritte in übersichtliche Abläufe: Fertige Nodes beschleunigen den Start, HTTP Request bindet nahezu jede API an, und ein Code node ermöglicht eigene Logik.

Die selbst gehostete Version bietet Kontrolle über Server und Datenbank, erfordert jedoch HTTPS, eingeschränkte Schlüssel, die Bereinigung des Verlaufs und geprüfte Backups. Bewahren Sie N8N_ENCRYPTION_KEY zusammen mit PostgreSQL auf: Ohne ihn lassen sich wiederhergestellte Zugangsdaten nicht entschlüsseln.

FAQ

Kann n8n kostenlos verwendet werden?

Ja. Die Community Edition kann für persönliche und interne Prozesse kostenlos auf dem eigenen Server bereitgestellt werden. Der Weiterverkauf eines gehosteten n8n als eigenständiges SaaS wird durch die Fair-Code-Lizenz eingeschränkt.

Kann n8n ohne Domain installiert werden?

Für einen lokalen Test ja. Für öffentliche Webhooks und OAuth sollten Sie eine Domain und HTTPS verwenden.

Wie viel Arbeitsspeicher benötigt n8n?

Für einfache persönliche Workflows reichen häufig 2 GB RAM. Für n8n mit PostgreSQL, Caddy und Task Runner sind 4 GB sinnvoller; Dateien und parallele Ausführungen können 8 GB oder mehr erfordern.

Bleiben alle Daten innerhalb des VPS?

Nur die Daten, die der Workflow nicht nach außen sendet. Datenbank und Ausführungsverlauf liegen auf dem VPS, doch Nodes für Telegram, CRM oder ein externes KI-Modell übertragen die ausgewählten Daten an den jeweiligen Dienst.

Was gehört in ein n8n-Backup?

Ein PostgreSQL-Dump, das Volume n8n_data, compose.yaml, Caddyfile und .env mit N8N_ENCRYPTION_KEY. Bewahren Sie die Kopie verschlüsselt außerhalb des VPS auf und prüfen Sie sie durch eine Wiederherstellung.