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:
ssh-keygen -t ed25519Hinweis: 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:
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.
#################################################################
# 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 -