n8n Setup-Guide

n8n Self-Hosting auf Hetzner VPS – Der komplette Setup-Guide 2026

Von der Hetzner-Bestellung bis zum laufenden n8n-System: Docker-Setup mit rxchi1d/n8n-ffmpeg, nginx Reverse Proxy, SSL, fail2ban und automatisches Backup. DSGVO-konform und produktionsreif.

E
Emre Hayta
· · 15 Min. Lesezeit
n8n Docker Hetzner nginx SSL fail2ban DSGVO Österreich
Inhaltsverzeichnis

Warum n8n selbst hosten?

n8n ist ein leistungsstarkes Open-Source-Workflow-Automatisierungstool. Die Cloud-Version kostet ab ca. 20 €/Monat, ein eigener VPS bei Hetzner hingegen schon ab 4,55 €/Monat – bei voller Datenkontrolle. Für österreichische KMUs, die DSGVO-konform arbeiten müssen, ist Self-Hosting oft die bessere Wahl.

Praxishinweis: Ich betreibe n8n für mehrere Kunden auf dedizierten Hetzner-VPS unter eigenen Subdomains. Das Ergebnis: keine externen Datenzugriffe, volle Kontrolle über Workflows und Logs, und deutlich günstigere Kosten gegenüber der Cloud-Version.

Vorteile des Self-Hostings auf einen Blick:

  • DSGVO-Konformität: Daten verlassen nie den eigenen Server, kein Drittanbieter-Zugriff
  • Kosteneffizienz: Ein CPX21 (4,55 €/Monat) reicht für mehrere n8n-Instanzen
  • Flexibilität: Unbegrenzte Workflows, Executions und Custom Nodes
  • Eigene Integrationen: Direkter Zugriff auf lokale Netzwerke und interne APIs

Voraussetzungen

Für diesen Guide benötigst du:

  • Einen Hetzner Cloud Account (Anmeldung kostenlos, Zahlung nach Nutzung)
  • Eine Domain bzw. Subdomain (z.B. n8n.yourdomain.at)
  • Grundkenntnisse in Linux/SSH (Befehle ausführen, Dateien editieren)
  • Ca. 30–60 Minuten Zeit

1. Hetzner VPS einrichten

Server erstellen

Im Hetzner Cloud Console einen neuen Server anlegen:

  • Location: Nürnberg oder Falkenstein (EU, DSGVO-konform)
  • Image: Ubuntu 22.04 LTS
  • Type: CPX21 (3 vCPU, 4 GB RAM – ideal für n8n)
  • SSH Key: Deinen öffentlichen SSH-Key eintragen (kein Passwort-Login)

Nach der Erstellung bekommst du eine IP-Adresse. Trag diese direkt als DNS A-Record für deine Subdomain ein:

DNS
n8n.yourdomain.at.  IN  A  <DEINE-SERVER-IP>

System aktualisieren

Bash
# System aktualisieren
apt update && apt upgrade -y

# Automatische Sicherheitsupdates aktivieren
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

Brauchst du Unterstützung bei der Umsetzung?

30-Min Call — kostenlos, unverbindlich, konkret.

Termin buchen →

2. Grundlegende Sicherheit (UFW + fail2ban)

Bevor wir irgendwas installieren, kommt die Absicherung. Immer.

UFW Firewall konfigurieren

Bash
# Standardregeln setzen
ufw default deny incoming
ufw default allow outgoing

# Erlaubte Ports
ufw allow ssh          # Port 22 (oder deinen Custom SSH-Port)
ufw allow 80/tcp       # HTTP (für Certbot-Validierung)
ufw allow 443/tcp      # HTTPS

# Firewall aktivieren
ufw enable

# Status prüfen
ufw status verbose

fail2ban installieren

Bash
# fail2ban installieren
apt install fail2ban -y

# Lokale Konfiguration erstellen (nicht die Originaldatei ändern!)
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5
backend  = systemd

[sshd]
enabled = true
mode    = aggressive

[nginx-limit-req]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log
maxretry = 10
EOF

systemctl enable fail2ban
systemctl restart fail2ban

# Status prüfen
fail2ban-client status

3. Docker installieren

Bash
# Docker offiziell installieren (empfohlene Methode)
curl -fsSL https://get.docker.com | sh

# Docker-Dienst starten und aktivieren
systemctl enable docker
systemctl start docker

# Installation prüfen
docker --version
docker compose version

4. n8n mit Docker Compose

Ich verwende das Image rxchi1d/n8n-ffmpeg:latest – ein Community-Build, das n8n mit ffmpeg-Unterstützung kombiniert. Das ist besonders nützlich wenn Workflows Medien verarbeiten (Video-Thumbnails, Audio-Konvertierung, etc.).

Verzeichnisse anlegen

Bash
# Datenverzeichnisse erstellen
mkdir -p /opt/n8n/{data,files,logs}

# Berechtigungen setzen (n8n läuft als UID 1000)
chown -R 1000:1000 /opt/n8n

docker-compose.yml erstellen

YAML
# /opt/n8n/docker-compose.yml
version: '3.8'

services:
  n8n:
    image: rxchi1d/n8n-ffmpeg:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"   # Nur localhost – nginx proxied nach außen
    environment:
      # Basis-Konfiguration
      - N8N_HOST=n8n.yourdomain.at
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.yourdomain.at/
      - GENERIC_TIMEZONE=Europe/Vienna

      # Authentifizierung (Basic Auth als erste Schutzschicht)
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=HIER_SICHERES_PASSWORT_EINSETZEN

      # Logging
      - N8N_LOG_LEVEL=info
      - N8N_LOG_OUTPUT=console,file
      - N8N_LOG_FILE_LOCATION=/home/node/.n8n/logs/n8n.log

      # Performance
      - EXECUTIONS_DATA_SAVE_ON_ERROR=all
      - EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
      - EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=720   # 30 Tage

    volumes:
      - /opt/n8n/data:/home/node/.n8n
      - /opt/n8n/files:/files
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
Bash
# n8n starten
cd /opt/n8n
docker compose up -d

# Status prüfen
docker compose ps
docker compose logs -f

5. nginx Reverse Proxy einrichten

Bash
# nginx installieren
apt install nginx -y

# Konfigurationsdatei erstellen
nano /etc/nginx/sites-available/n8n
nginx
# /etc/nginx/sites-available/n8n

# HTTP → HTTPS Redirect
server {
    listen 80;
    listen [::]:80;
    server_name n8n.yourdomain.at;
    return 301 https://$host$request_uri;
}

# HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name n8n.yourdomain.at;

    # SSL (wird von Certbot befüllt)
    ssl_certificate     /etc/letsencrypt/live/n8n.yourdomain.at/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.yourdomain.at/privkey.pem;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header Referrer-Policy "strict-origin-when-cross-origin";

    # Für größere Dateien und lange Workflows
    client_max_body_size 100M;
    proxy_read_timeout   300s;
    proxy_send_timeout   300s;

    location / {
        proxy_pass         http://127.0.0.1:5678;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;

        # WebSocket-Support (wichtig für n8n Editor!)
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
    }
}
Bash
# Site aktivieren
ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/

# Konfiguration prüfen
nginx -t

# nginx starten
systemctl enable nginx
systemctl start nginx

6. SSL mit Let's Encrypt

Bash
# Certbot installieren
apt install certbot python3-certbot-nginx -y

# SSL-Zertifikat für die Domain ausstellen
# (Domain muss bereits auf den Server zeigen!)
certbot --nginx -d n8n.yourdomain.at \
  --non-interactive \
  --agree-tos \
  --email dein@email.at

# Auto-Renewal testen
certbot renew --dry-run

# Zertifikat-Details prüfen
certbot certificates

Certbot richtet automatisch einen Cronjob für die Erneuerung ein. Das Zertifikat wird alle 90 Tage erneuert, bei Ablauf erscheint eine E-Mail-Warnung.

7. Backup-Strategie

n8n speichert Workflows, Credentials und Execution-History in /opt/n8n/data. Dieses Verzeichnis muss regelmäßig gesichert werden.

Bash
#!/bin/bash
# /opt/scripts/backup-n8n.sh

BACKUP_DIR="/opt/backups/n8n"
N8N_DATA="/opt/n8n/data"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/n8n_backup_$DATE.tar.gz"
RETENTION_DAYS=14

mkdir -p "$BACKUP_DIR"

# n8n kurz stoppen für konsistentes Backup
docker stop n8n 2>/dev/null

# Backup erstellen
tar -czf "$BACKUP_FILE" -C "$(dirname $N8N_DATA)" "$(basename $N8N_DATA)"

# n8n wieder starten
docker start n8n 2>/dev/null

# Alte Backups bereinigen
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

echo "[$(date)] Backup: $BACKUP_FILE ($(du -sh $BACKUP_FILE | cut -f1))"
Bash
# Skript ausführbar machen
chmod +x /opt/scripts/backup-n8n.sh

# Cronjob einrichten: täglich um 02:30 Uhr
echo "30 2 * * * root /opt/scripts/backup-n8n.sh >> /var/log/n8n-backup.log 2>&1" \
  > /etc/cron.d/n8n-backup

# Backup sofort testen
/opt/scripts/backup-n8n.sh
Tipp: Zusätzlich empfehle ich Hetzner Cloud Snapshots (0,0119 €/GB/Monat). Einmal täglich oder vor größeren Änderungen einen Snapshot erstellen – damit kannst du den gesamten Server innerhalb von Minuten wiederherstellen.

8. n8n Grundkonfiguration

Erster Login und Setup

Rufe https://n8n.yourdomain.at auf. Du wirst nach einem Admin-Account gefragt. Setze ein starkes Passwort und aktiviere MFA (Two-Factor Authentication) unter Settings → Security.

Wichtige Umgebungsvariablen

Nützliche Ergänzungen zur docker-compose.yml:

YAML
# SMTP für E-Mail-Benachrichtigungen
- N8N_EMAIL_MODE=smtp
- N8N_SMTP_HOST=smtp.yourprovider.at
- N8N_SMTP_PORT=587
- N8N_SMTP_USER=n8n@yourdomain.at
- N8N_SMTP_PASS=SMTP_PASSWORT
- N8N_SMTP_SENDER=n8n@yourdomain.at

# Externe Hooks für Monitoring
- N8N_EXTERNAL_HOOK_FILES=/files/hooks.js

# Custom Nodes aus eigenem Verzeichnis
- N8N_CUSTOM_EXTENSIONS=/files/custom-nodes

9. Praxisbeispiel: File-Server mit n8n

Ein konkretes Beispiel aus der Praxis: Ein Kunde nutzt n8n als automatisierten File-Processing-Server. Eingehende Dateien werden per Webhook empfangen, mit ffmpeg verarbeitet (Video-Thumbnails, Audio-Extraktion) und dann in definierten Verzeichnissen abgelegt.

Das Volume /opt/n8n/files:/files macht genau das möglich: n8n hat direkten Zugriff auf das Host-Dateisystem und kann mit dem integrierten ffmpeg Mediendateien prozessieren – ohne externe Services.

Ein einfacher Workflow dafür sieht so aus:

  1. Webhook-Trigger → empfängt Upload via HTTP POST
  2. Execute Command Node → ruft ffmpeg zur Thumbnail-Erstellung auf
  3. Move Binary Data → speichert Ergebnis in /files/output/
  4. HTTP Response → gibt die Thumbnail-URL zurück

10. Troubleshooting

n8n nicht erreichbar nach Neustart?

Bash
docker compose -f /opt/n8n/docker-compose.yml ps
docker compose -f /opt/n8n/docker-compose.yml logs --tail=50
systemctl status nginx

WebSocket-Verbindungsfehler im n8n Editor?
Überprüfe die nginx-Konfiguration: Die Upgrade und Connection Header müssen korrekt gesetzt sein (siehe oben).

SSL-Zertifikat abgelaufen?

Bash
certbot renew --force-renewal
systemctl reload nginx

Berechtigungsfehler beim Starten?

Bash
chown -R 1000:1000 /opt/n8n/data
docker compose restart n8n

Fazit

Mit diesem Setup hast du eine produktionsreife n8n-Installation auf Hetzner, die:

  • DSGVO-konform in der EU läuft
  • Durch fail2ban und UFW abgesichert ist
  • SSL-verschlüsselt über nginx erreichbar ist
  • Täglich automatisch gesichert wird
  • ffmpeg-Unterstützung für Medienverarbeitung mitbringt

Die laufenden Kosten: ca. 4,55 €/Monat für den VPS + Domain-Kosten. Verglichen mit n8n Cloud (ab ~20 €/Monat ohne Datenhoheit) ein klares Argument für Self-Hosting.

Hast du Fragen zur Konfiguration oder willst du n8n für deinen Betrieb professionell einrichten lassen? Schreib mir gerne.

n8n professionell einrichten lassen?

Du möchtest n8n für deinen Betrieb nutzen, aber der Setup soll professionell und wartbar sein? Ich richte n8n für dich ein, inkl. erster Workflows, Monitoring und Support.

Weitere Artikel