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:
n8n.yourdomain.at. IN A <DEINE-SERVER-IP>
System aktualisieren
# 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.
2. Grundlegende Sicherheit (UFW + fail2ban)
Bevor wir irgendwas installieren, kommt die Absicherung. Immer.
UFW Firewall konfigurieren
# 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
# 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
# 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
# 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
# /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
# n8n starten
cd /opt/n8n
docker compose up -d
# Status prüfen
docker compose ps
docker compose logs -f
5. nginx Reverse Proxy einrichten
# nginx installieren
apt install nginx -y
# Konfigurationsdatei erstellen
nano /etc/nginx/sites-available/n8n
# /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";
}
}
# 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
# 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.
#!/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))"
# 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:
# 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:
- Webhook-Trigger → empfängt Upload via HTTP POST
- Execute Command Node → ruft
ffmpegzur Thumbnail-Erstellung auf - Move Binary Data → speichert Ergebnis in
/files/output/ - HTTP Response → gibt die Thumbnail-URL zurück
10. Troubleshooting
n8n nicht erreichbar nach Neustart?
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?
certbot renew --force-renewal
systemctl reload nginx
Berechtigungsfehler beim Starten?
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.