Server‑Setup für n8n

Einrichtung einer eigenen n8n‑Instanz auf einem dedizierten oder virtuellen privaten Server (VPS).

Voraussetzungen und Empfehlungen

  • Empfohlener Anbieter: Hetzner
  • Betriebssystem: Ubuntu
  • Firewall‑Regeln über Hetzner verwalten; kein ufw auf dem Server (Konflikte mit Docker‑Portweiterleitungen vermeiden)
  • SSH‑Schlüsselpaar bei Setup hinterlegen; dadurch wird kein Root‑Passwort angelegt
  • Tägliche Backups aktivieren

Firewall‑Ports

  • Eingehend erlauben: 22 (SSH), 80 (HTTP), 443 (HTTPS)
  • Ausgehenden Verkehr komplett erlauben

Hinweis zu SMTP‑Ports

Die SMTP‑Ports 465 und 587 sind bei Hetzner standardmäßig gesperrt. Wenn Sie E‑Mails darüber versenden möchten, schalten Sie diese frei: Hetzner: SMTP freischalten

Hinweis zur DSGVO

Wenn Sie n8n auf Ihrem eigenen Server betreiben, ist die Nutzung grundsätzlich DSGVO‑konform – vorausgesetzt, Ihr VPS liegt in Deutschland und Ihre Workflows senden keine sensiblen Kundendaten an externe Dienste.

DNS‑Eintrag (empfohlen)

Legen Sie nach dem Erstellen des VPS einen A‑Record auf eine Subdomain an, die auf die öffentliche IP des Servers zeigt, z. B. „n8n.ihre‑domain.eu“.

SSH‑Zugang einrichten

Sicheres SSH‑Schlüsselpaar erzeugen:

bash
ssh-keygen -t ed25519

Hinweis: Hinterlegen Sie den öffentlichen Schlüssel (.pub) bei Hetzner und nutzen Sie den privaten Schlüssel, um auf den Server zuzugreifen.

Mit dem Server verbinden:

bash
ssh -i ~/.ssh/<ssh-key> root@<ip-or-domain>

Setup‑Skript ausführen

Das folgende Skript installiert Docker, startet n8n mit automatischen Updates & Restarts und richtet einen Reverse‑Proxy (Caddy) mit automatischer SSL‑Erneuerung ein. Passen Sie vor dem Ausführen DomainName und ggf. Timezone an.

Setup-Skriptbash
#################################################################
# Adjust the Domain name before executing this script on your VPS

DomainName="n8n.deine-domain.eu"
Timezone="Europe/Berlin"

DockerVolumeName="n8n_data"
DockerContainerName="n8n"
UpdateScriptFilename="/root/update-vps.bash"

#################################################################

# Note for security: This script assumes that the Hetzner provided firewall functionality is used.
# Thefore a firewall setup is not part of this setup script

#################################################################

# Disable ssh password login
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d_%H%M%S)
sudo sed -i 's/^#?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#?ChallengeResponseAuthentication .*/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#?KbdInteractiveAuthentication .*/KbdInteractiveAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#?PermitRootLogin .*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sudo systemctl reload ssh || sudo service ssh reload

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get -y install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

# install docker packages
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# setup n8n docker container
docker volume create $DockerVolumeName

# run image as container with automatic restarts (so contianer will run after reboot)
docker run -d --restart=always  --name $DockerContainerName  -p 5678:5678  -e GENERIC_TIMEZONE="$Timezone"  -e TZ="$Timezone"  -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true  -e N8N_RUNNERS_ENABLED=true  -e N8N_EDITOR_BASE_URL="https://$DomainName"  -e WEBHOOK_URL="https://$DomainName"  -e N8N_PROXY_HOPS=1  -v $DockerVolumeName:/home/node/.n8n  docker.n8n.io/n8nio/n8n

#################################################################

# install reverse proxy with automatic ssl renews (Caddy)

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

# create a caddyfile with a domain and configure it as a reverse proxy for :5678 (n8n docker container port)
sudo cat > /etc/caddy/Caddyfile <<BASH
$DomainName

reverse_proxy :5678
BASH

# run caddy (handles creating new user on its own and already handles ssl renews)
sudo systemctl enable --now caddy
sudo systemctl reload caddy

#################################################################

# create weeekly cronjob to update vps (runs on sunday morning at 02:00)

cat > "$UpdateScriptFilename" <<BASH
# update n8n docker container
docker pull docker.n8n.io/n8nio/n8n
docker stop $DockerContainerName
docker rm $DockerContainerName
docker run -d --restart=always  --name $DockerContainerName  -p 5678:5678  -e GENERIC_TIMEZONE="$Timezone"  -e TZ="$Timezone"  -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true  -e N8N_RUNNERS_ENABLED=true  -e N8N_EDITOR_BASE_URL="https://$DomainName"  -e WEBHOOK_URL="https://$DomainName"  -e N8N_PROXY_HOPS=1  -v $DockerVolumeName:/home/node/.n8n  docker.n8n.io/n8nio/n8n


# install Ubuntu package updates
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get -y   -o Dpkg::Options::=--force-confdef   -o Dpkg::Options::=--force-confold full-upgrade

# restart caddy
sudo systemctl reload caddy
BASH

chmod +x "$UpdateScriptFilename"

(crontab -l 2>/dev/null; echo "0 2 * * 0 $UpdateScriptFilename") | crontab -