tva
← Insights

n8n auf Hetzner Cloud selbst hosten: Vollständiges Docker-Setup-Tutorial

Workflow-Automatisierung ist für moderne Unternehmen unverzichtbar geworden, aber SaaS-Lösungen können mit wachsenden Teams teuer werden. Wir zeigen Ihnen, wie Sie Ihre eigene n8n-Instanz auf Hetzner Cloud für etwa 6 EUR/Monat zuzüglich Domain-Kosten (Stand: Oktober 2026) einrichten und damit unbegrenzte Workflows und vollständige Kontrolle über Ihre Automatisierungsplattform erhalten.

Was Sie einrichten werden

Am Ende dieses Tutorials haben Sie:

  • Eine vollständig funktionsfähige n8n-Installation mit HTTPS
  • Automatische SSL-Zertifikate über Let's Encrypt
  • E-Mail-Integration für Benutzerkonten
  • Automatischen Start nach Serverneustarts
  • Eine solide Basis für den professionellen Einsatz, die Sie für den Produktivbetrieb weiter absichern können

Monatliche Kosten: 5,99 EUR (CX23-Server, zzgl. USt., inkl. einer primären IPv4-Adresse, Stand: Oktober 2026) + Domain-Kosten

Voraussetzungen

  • Domainname, der auf Ihre Server-IP verweist
  • Grundlegende Kommandozeilenkenntnisse
  • Hetzner-Cloud-Konto

Schritt 1: Server-Einrichtung

Hetzner-Cloud-Server erstellen

  1. Melden Sie sich in der Hetzner Cloud Console an
  2. Erstellen Sie ein neues Projekt
  3. Fügen Sie einen Server mit diesen Spezifikationen hinzu:
    • Image: Ubuntu 24.04 LTS
    • Typ: CX23 (2 vCPU, 4 GB RAM, 40 GB Festplatte); Hetzner hat den CX11 im September 2024 für Neubestellungen eingestellt. Die Verfügbarkeit der kostenoptimierten Tarife variiert je nach Standort
    • Standort: Wählen Sie den Standort, der Ihren Nutzern am nächsten liegt
    • SSH-Key: Fügen Sie Ihren öffentlichen Schlüssel hinzu

Erste Serverkonfiguration

Verbinden Sie sich mit Ihrem Server:

ssh root@YOUR_SERVER_IP

Aktualisieren Sie das System:

apt update && apt upgrade -y

Schritt 2: Docker installieren

Installieren Sie Docker und Docker Compose:

# Install dependencies
apt install apt-transport-https ca-certificates curl software-properties-common gnupg -y

# Add Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Create Docker network for our services
docker network create proxy

Docker-Installation überprüfen:

docker --version
docker compose version

Schritt 3: Traefik als Reverse Proxy konfigurieren

Verzeichnisstruktur erstellen:

mkdir -p /opt/traefik/data
cd /opt/traefik

Traefik-Konfigurationsdatei erstellen:

nano /opt/traefik/data/traefik.yml

Folgende Konfiguration hinzufügen:

api:
  dashboard: false

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]  # Change this!
      storage: acme.json
      httpChallenge:
        entryPoint: http

Datei acme.json für SSL-Zertifikate erstellen:

touch /opt/traefik/data/acme.json
chmod 600 /opt/traefik/data/acme.json

Traefik-Docker-Compose-Datei erstellen:

nano /opt/traefik/docker-compose.yml

Folgende Konfiguration hinzufügen:

version: '3'

services:
  traefik:
    image: traefik:v3.4
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/etc/traefik/traefik.yml
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"

networks:
  proxy:
    external: true

Schritt 4: SMTP-Relay einrichten (optional, aber empfohlen)

Mailserver-Verzeichnis erstellen:

mkdir -p /opt/mailserver
cd /opt/mailserver

Docker-Compose-Datei erstellen:

nano /opt/mailserver/docker-compose.yml

Folgende Konfiguration hinzufügen:

version: '3'

services:
  mailserver:
    image: bytemark/smtp
    restart: always
    networks:
      - proxy
    environment:
      - RELAY_HOST=smtp.gmail.com  # Change to your SMTP provider
      - RELAY_PORT=587
      - [email protected]  # Change this
      - RELAY_PASSWORD=your-app-password     # Change this
      - MAILNAME=mail.yourdomain.com         # Change this

networks:
  proxy:
    external: true

Hinweis: n8n erreicht das Relay über das gemeinsame Netzwerk proxy. Das Relay veröffentlicht daher keinen Port. Von Docker veröffentlichte Ports umgehen UFW-Regeln; fügen Sie einen Port daher nur hinzu, wenn ein anderer Host über das Relay senden muss. MAILNAME legt den Mail-Hostnamen des Relays fest. Für Gmail müssen Sie:

  1. Zwei-Faktor-Authentifizierung aktivieren
  2. Ein App-Passwort generieren
  3. Das App-Passwort verwenden (nicht Ihr reguläres Passwort)

Schritt 5: n8n konfigurieren

Erstellen Sie das n8n-Verzeichnis. Der n8n-Container läuft als Benutzer node (UID 1000). Stellen Sie daher sicher, dass dieser Benutzer in den per Bind-Mount eingebundenen Ordner data schreiben kann, zum Beispiel mit mkdir -p /opt/n8n/data && chown -R 1000:1000 /opt/n8n/data:

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

Docker-Compose-Datei erstellen:

nano /opt/n8n/docker-compose.yml

Folgende Konfiguration hinzufügen:

version: '3'

services:
  n8n:
    image: n8nio/n8n:1.95.2
    restart: always
    environment:
      - N8N_HOST=n8n.yourdomain.com          # Change this!
      - NODE_ENV=production
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com  # Change this!
      
      # Email configuration
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=mailserver
      - N8N_SMTP_PORT=25
      - N8N_SMTP_SSL=false
      - N8N_SMTP_USER=
      - N8N_SMTP_PASS=
      - [email protected]  # Change this!
      
      # Important fixes for proxy setup
      - N8N_PROXY_HOPS=1
      - N8N_RUNNERS_ENABLED=true
      
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"  # Change this!
      - "traefik.http.routers.n8n.entrypoints=https"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

Schritt 6: Systemd-Dienste für automatischen Start erstellen

Traefik-Dienst

nano /etc/systemd/system/traefik-docker.service

Folgende Konfiguration hinzufügen:

[Unit]
Description=Traefik Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/traefik
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

Mailserver-Dienst

nano /etc/systemd/system/mailserver-docker.service

Folgende Konfiguration hinzufügen:

[Unit]
Description=Mailserver Docker Compose
Requires=docker.service
After=docker.service
Before=n8n-docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mailserver
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

n8n-Dienst

nano /etc/systemd/system/n8n-docker.service

Folgende Konfiguration hinzufügen:

[Unit]
Description=n8n Docker Compose
Requires=docker.service
After=docker.service traefik-docker.service mailserver-docker.service
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/n8n
ExecStartPre=/bin/bash -c 'until docker container inspect traefik > /dev/null 2>&1; do sleep 2; done'
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure
RestartSec=30
TimeoutStartSec=180

[Install]
WantedBy=multi-user.target

Dienste aktivieren und starten

# Reload systemd daemon
systemctl daemon-reload

# Enable services to start on boot
systemctl enable traefik-docker.service
systemctl enable mailserver-docker.service
systemctl enable n8n-docker.service

# Start services
systemctl start traefik-docker.service
sleep 10
systemctl start mailserver-docker.service
sleep 10
systemctl start n8n-docker.service

Schritt 7: DNS-Konfiguration

Verweisen Sie Ihre Domain auf Ihren Server:

  1. Gehen Sie zu Ihrem Domain-Registrar/DNS-Anbieter
  2. Erstellen Sie einen A-Eintrag:
    • Name: n8n
    • Typ: A
    • Wert: YOUR_SERVER_IP
    • TTL: 300 (oder das Minimum)

Warten Sie auf die DNS-Propagierung (kann bis zu 24 Stunden dauern, ist aber in der Regel deutlich schneller).

Schritt 8: Ihre Installation testen

Prüfen Sie, ob die Dienste laufen:

docker ps

Sie sollten drei laufende Container sehen: traefik, mailserver und n8n.

Besuchen Sie Ihre n8n-Instanz:

https://n8n.yourdomain.com

Sie sollten die n8n-Einrichtungsseite über HTTPS sehen, wobei Ihr Browser ein gültiges Zertifikat anzeigt.

Häufige Probleme beheben

SSL-Zertifikat funktioniert nicht

Prüfen Sie die Traefik-Logs:

docker logs traefik

Häufige Ursachen:

  • DNS verweist nicht auf den Server
  • Firewall blockiert Ports 80/443
  • Falsche Domain in der Konfiguration

n8n nicht erreichbar

Prüfen Sie die n8n-Logs:

docker logs n8n-n8n-1

Häufige Lösungen:

  • Überprüfen Sie, ob die Domain-Konfiguration in allen Dateien übereinstimmt
  • Prüfen Sie, ob alle Container im selben Netzwerk sind
  • Wenn die Logs ERR_ERL_UNEXPECTED_X_FORWARDED_FOR anzeigen, prüfen Sie, ob N8N_PROXY_HOPS=1 wie in der obigen Konfiguration gesetzt ist; n8n dokumentiert diese Einstellung für den Betrieb hinter einem Reverse Proxy

E-Mail funktioniert nicht

Prüfen Sie die Mailserver-Logs:

docker logs mailserver-mailserver-1

Überprüfen Sie SMTP-Zugangsdaten und -Einstellungen.

Dienste starten nicht nach Neustart

Prüfen Sie den Dienststatus:

systemctl status traefik-docker.service
systemctl status n8n-docker.service

Bei Bedarf neu starten:

systemctl restart traefik-docker.service
systemctl restart n8n-docker.service

Wartung und Updates

Regelmäßige Wartung

Wöchentliche Prüfungen:

# Check container status
docker ps

# Check disk space
df -h

# Check logs for errors
docker logs n8n-n8n-1 | grep -i error

Monatliche Updates:

# Update container images
cd /opt/n8n && docker compose pull && docker compose up -d
cd /opt/traefik && docker compose pull && docker compose up -d
cd /opt/mailserver && docker compose pull && docker compose up -d

# Clean up old images
docker system prune -f

Ihre Daten sichern

Erstellen Sie ein Backup-Skript. Die standardmäßig verwendete SQLite-Datenbank wird kopiert, während n8n läuft. Stoppen Sie n8n daher kurz oder führen Sie das Backup in einer Phase mit geringer Aktivität aus, um eine inkonsistente Kopie zu vermeiden. Testen Sie eine Wiederherstellung, bevor Sie sich darauf verlassen:

nano /opt/backup-n8n.sh

Folgenden Inhalt hinzufügen:

#!/bin/bash
mkdir -p /opt/backups
tar -czf /opt/backups/n8n-backup-$(date +%Y%m%d).tar.gz /opt/n8n/data
find /opt/backups -name "n8n-backup-*.tar.gz" -mtime +30 -delete

Ausführbar machen und zu Cron hinzufügen:

chmod +x /opt/backup-n8n.sh

# Add to crontab (daily backup at 2 AM)
crontab -e
# Add this line:
0 2 * * * /opt/backup-n8n.sh

Sicherheitshärtung

Firewall konfigurieren

# Install UFW
apt install ufw

# Set defaults
ufw default deny incoming
ufw default allow outgoing

# Allow SSH
ufw allow 22

# Allow HTTP/HTTPS
ufw allow 80
ufw allow 443

# Enable firewall
ufw enable

SSH absichern

SSH-Konfiguration bearbeiten:

nano /etc/ssh/sshd_config

Folgende Änderungen vornehmen:

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

SSH neu starten:

systemctl restart ssh

Fail2Ban einrichten

apt install fail2ban

# Copy default configuration
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Enable and start
systemctl enable fail2ban
systemctl start fail2ban

Kostenaufstellung

Monatliche Kosten:

  • Hetzner CX23-Server: 5,99 EUR (zzgl. USt., inkl. einer primären IPv4-Adresse, Stand: Oktober 2026)
  • Domain (jährlich, variiert): ca. 10-15 EUR/Jahr
  • Gesamt: ca. 7 EUR/Monat

Vergleich mit n8n Cloud:

  • n8n Starter: 20 EUR/Monat bei jährlicher Abrechnung (2.500 Ausführungen, Stand: Oktober 2026)
  • n8n Pro: 50 EUR/Monat bei jährlicher Abrechnung (10.000 Ausführungen)
  • Einsparungen: etwa 150–520 EUR/Jahr

Ihr Setup skalieren

Mehrere n8n-Instanzen

Sie können mehrere isolierte n8n-Instanzen für verschiedene Teams betreiben:

Erstellen Sie /opt/n8n-team2/docker-compose.yml:

version: '3'
services:
  n8n-team2:
    image: n8nio/n8n:1.95.2
    restart: always
    environment:
      - N8N_HOST=team2.yourdomain.com
      # ... rest of configuration
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n-team2.rule=Host(`team2.yourdomain.com`)"
      - "traefik.http.routers.n8n-team2.entrypoints=https"
      - "traefik.http.routers.n8n-team2.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n-team2.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

Serverressourcen aufrüsten

Wenn Sie mehr Leistung benötigen, rüsten Sie Ihren Hetzner-Server auf:

  • CX33: 4 vCPU, 8 GB RAM (8,99 EUR/Monat zzgl. USt., inkl. einer primären IPv4-Adresse, Stand: Oktober 2026)
  • CX43: 8 vCPU, 16 GB RAM (16,49 EUR/Monat zzgl. USt., inkl. einer primären IPv4-Adresse)

Fazit

Sie haben jetzt eine funktionierende n8n-Installation, die nur einen Bruchteil gehosteter Lösungen kostet und Ihnen gleichzeitig vollständige Kontrolle gibt. Das Setup umfasst automatisches HTTPS, E-Mail-Funktionalität und zuverlässige Dienstverwaltung.

Hauptvorteile dieses Ansatzes:

  • Kosteneffizient: Hunderte Euro jährlich gegenüber n8n Cloud sparen
  • Vollständige Kontrolle: Keine Ausführungskontingente; Grenzen ergeben sich aus Ihren Serverressourcen und der Sustainable Use License von n8n
  • Datenschutz: Workflow- und Ausführungsdaten bleiben auf Ihrem Server, ausgenommen Daten, die Ihre Workflows an externe Dienste senden
  • Anpassbar: Nach Bedarf modifizieren und erweitern

Wir haben diese Konfiguration im Produktivbetrieb eingesetzt. Die Beispiele für n8n und Traefik verwenden feste Image-Versionen; erhöhen Sie für ein Update diese Tags in der jeweiligen docker-compose.yml, bevor Sie die Update-Befehle ausführen. Für geschäftskritische Anwendungen sollten Sie die Wiederherstellung Ihrer Backups testen und Monitoring ergänzen.

Über tva

tva übernimmt das umfassende Infrastrukturmanagement für Datenbanksysteme, Cloud-Umgebungen und globale Lieferketten. Unser methodischer Ansatz verbindet strenge Sicherheitsprotokolle mit Leistungsoptimierung. Unsere strategische Beratung ermöglicht die präzise Koordination digitaler Fähigkeiten und physischer Ressourcen. Dabei halten wir in allen Kundenprojekten höchste Standards für betriebliche Exzellenz und Compliance ein.

Besuchen Sie tva.sg für weitere Informationen über unsere Dienstleistungen.

Weiterführende Beiträge

Weiterführende Beiträge