n8n ist ein leistungsstarkes Workflow- und Automatisierungs-Tool. In dieser Anleitung beschreibe ich, wie wir n8n ohne Docker auf einem Ubuntu-Server installiert und betrieben haben – mit Apache als Reverse Proxy und PostgreSQL als Datenbank. Ziel ist, dass n8n dauerhaft als Service läuft und stabil über eine Domain erreichbar ist.
1. Voraussetzungen
Bevor ich starte, stelle ich sicher, dass Folgendes vorhanden ist:
- Ubuntu-Server mit SSH-Zugriff und sudo-Rechten
- Eine Domain/Subdomain (z. B. n8n.meine-domain.tld), die per DNS auf den Server zeigt
- Apache installiert (inkl. Proxy-Module) und HTTPS ist möglich (Let’s Encrypt)
- PostgreSQL installiert oder installierbar
- Node.js (LTS) + npm
2. Benutzer und Verzeichnisse für n8n anlegen
Ich lege einen eigenen System-User für n8n an, damit der Dienst nicht als root läuft:
sudo adduser --system --home /opt/n8n --group n8n
Dann erstelle ich das n8n-User-Home für Persistenz (Credentials, Settings, etc.):
sudo mkdir -p /opt/n8n/.n8n sudo chown -R n8n:n8n /opt/n8n
3. Node.js (LTS) installieren
Auf Ubuntu installiere ich Node.js LTS über NodeSource:
curl -fsSL deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get update sudo apt-get install -y nodejs
Danach prüfe ich die Versionen:
node -v npm -v
4. n8n per npm installieren
Wir installieren n8n global über npm:
sudo npm install -g n8n
Optional prüfe ich kurz, ob n8n grundsätzlich startet:
n8n --version n8n
Anschließend beende ich es wieder (CTRL+C), weil es als systemd-Service laufen soll.
5. PostgreSQL einrichten (DB + User)
Falls PostgreSQL noch nicht installiert ist:
sudo apt-get install -y postgresql
Dann lege ich Datenbank und Benutzer für n8n an (Passwort anpassen):
sudo -u postgres psql
CREATE USER n8n WITH PASSWORD 'SEHR_STARKES_PASSWORT'; CREATE DATABASE n8n OWNER n8n; \q
6. n8n Konfiguration (Environment-Datei)
Wir konfigurieren n8n über eine Environment-Datei, die systemd später lädt:
sudo nano /opt/n8n/n8n.env
Beispiel-Konfiguration (Domain/Passwörter anpassen):
# Basis NODE_ENV=production N8N_HOST=n8n.meine-domain.tld N8N_PORT=5678 N8N_PROTOCOL=https # Wichtig, damit Webhooks/Links korrekt sind (hinter Apache Reverse Proxy) WEBHOOK_URL=https://n8n.meine-domain.tld/ # Persistenz N8N_USER_FOLDER=/opt/n8n/.n8n # Sicherheit (empfohlen) N8N_BASIC_AUTH_ACTIVE=true N8N_BASIC_AUTH_USER=admin N8N_BASIC_AUTH_PASSWORD=SEHR_STARKES_PASSWORT # Sehr wichtig: Verschlüsselung der Credentials N8N_ENCRYPTION_KEY=HIER_EINEN_LANGEN_RANDOM_KEY_EINTRAGEN # PostgreSQL DB_TYPE=postgresdb DB_POSTGRESDB_HOST=127.0.0.1 DB_POSTGRESDB_PORT=5432 DB_POSTGRESDB_DATABASE=n8n DB_POSTGRESDB_USER=n8n DB_POSTGRESDB_PASSWORD=SEHR_STARKES_PASSWORT
Dann sperre ich die Datei (enthält Secrets):
sudo chown root:root /opt/n8n/n8n.env sudo chmod 600 /opt/n8n/n8n.env
Hinweis: Den N8N_ENCRYPTION_KEY unbedingt sicher ablegen. Wenn der Key verloren geht oder geändert wird, sind gespeicherte Credentials nicht mehr lesbar.
7. systemd Service für n8n erstellen
Damit n8n nach Reboots automatisch startet, richten wir einen systemd-Service ein:
sudo nano /etc/systemd/system/n8n.service
Service-Datei (ggf. ExecStart-Pfad anpassen, je nach Installation):
[Unit] Description=n8n workflow automation After=network.target postgresql.service Wants=postgresql.service [Service] Type=simple User=n8n Group=n8n EnvironmentFile=/opt/n8n/n8n.env WorkingDirectory=/opt/n8n ExecStart=/usr/bin/n8n Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Danach aktiviere und starte ich den Service:
sudo systemctl daemon-reload sudo systemctl enable n8n sudo systemctl start n8n
Status und Logs prüfen:
sudo systemctl status n8n --no-pager
sudo journalctl -u n8n -f
8. Apache als Reverse Proxy konfigurieren
Damit n8n über die Domain erreichbar ist, konfigurieren wir Apache als Reverse Proxy auf den lokalen n8n-Port 5678.
Zuerst stelle ich sicher, dass die benötigten Module aktiv sind:
sudo a2enmod proxy proxy_http proxy_wstunnel rewrite headers ssl sudo systemctl restart apache2
Dann erstelle ich eine Apache VirtualHost-Konfiguration (Beispielname):
sudo nano /etc/apache2/sites-available/n8n.conf
Beispiel (HTTP; HTTPS kommt im nächsten Schritt über Let’s Encrypt):
<VirtualHost *:80>
ServerName n8n.meine-domain.tld
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "http"
ProxyPass / 127.0.0.1
ProxyPassReverse / 127.0.0.1
# WebSocket Support (für n8n UI/Realtime)
ProxyPass /ws/ ws://127.0.0.1:5678/ws/
ProxyPassReverse /ws/ ws://127.0.0.1:5678/ws/
</VirtualHost>
Site aktivieren und Apache neu laden:
sudo a2ensite n8n.conf sudo apache2ctl configtest sudo systemctl reload apache2
9. HTTPS (Let’s Encrypt) aktivieren
Ich installiere Certbot für Apache und hole mir ein Zertifikat:
sudo apt-get update sudo apt-get install -y certbot python3-certbot-apache sudo certbot --apache -d n8n.meine-domain.tld
Certbot ergänzt/erstellt dann typischerweise automatisch den HTTPS-VHost. Wichtig ist, dass n8n selbst weiterhin lokal auf 127.0.0.1:5678 läuft und Apache nach außen HTTPS terminiert.
Nach dem HTTPS-Setup stelle ich sicher, dass der Forwarded-Proto Header korrekt ist (oft setzt Certbot das schon). Falls nötig, ergänze ich im SSL-VHost:
RequestHeader set X-Forwarded-Proto "https"
10. Funktionstest
Zum Abschluss teste ich:
- UI erreichbar: n8n.meine-domain.tld
- Basic Auth greift (falls aktiviert)
- Webhooks funktionieren (Test-Workflow mit Webhook-Node)
- Service läuft stabil:
- sudo systemctl status n8n
- sudo journalctl -u n8n -f
Fazit
Unsere n8n-Installation auf Ubuntu ohne Docker besteht im Wesentlichen aus:
- ✅ Node.js LTS installieren
- ✅ n8n per npm installieren
- ✅ PostgreSQL DB/User anlegen und n8n darauf konfigurieren
- ✅ Betrieb als systemd-Service
- ✅ Apache als Reverse Proxy + Let’s Encrypt für HTTPS
Sei der Erste, der kommentiert!