n8n Setup-Guide: Von Light bis Pro (SQLite, PostgreSQl, Supabase)
Du kennst das: n8n ist dein Ticket in die Welt der Workflow-Automation, aber die Installation kann mehr Kopfzerbrechen bereiten als ein IKEA-Regal ohne Anleitung. Deshalb haben wir bei AIscream den Setup-Prozess in drei Geschmacksrichtungen für dich aufbereitet.
Vom einfachen SQLite-Setup für deine ersten Schritte bis zur ausgewachsenen PostgreSQL-Installation für ernsthaftes Business. Die Entscheidung, welche für dich passt, ist wie beim Eisessen – es kommt auf deinen Appetit (und deine Zukunftspläne) an.
Voraussetzungen – Das brauchst du
Für alle Varianten benötigst du:
- Einen Hetzner Cloud Server (Mindestens CPX11, für produktive Umgebungen besser CPX21)
- Ubuntu 20.04 LTS oder neuer
- Docker und Docker Compose
- Eine Domain mit DNS-Konfiguration
Klingt nach viel? Ist es nicht. Der Aufwand lohnt sich – versprochen.
Variante 1: Die SQLite-Edition (Für Einsteiger und Minimalisten)
Diese Variante ist der VW Käfer unter den Installationen: Zuverlässig, einfach zu warten, aber kein Rennwagen.
Was steckt drin?
- n8n: Dein Workflow-Werkzeug (im Container)
- Caddy: Sorgt für HTTPS-Verschlüsselung (im Container)
- SQLite: Datenbank direkt im n8n-Container
So sieht die Verzeichnisstruktur aus
/opt/n8n/
├── data/ # Hier liegen deine Daten
│ ├── caddy_config/ # Caddy braucht das
│ │ └── Caddyfile # Hier steht, wohin der Traffic geht
│ └── local_files/ # Dateien, die n8n verwenden kann
└── docker-compose.yml # Das Herzstück deiner Installation
└── .env # Deine Umgebungsvariablen
Lass die Magie beginnen
1. Verzeichnisse anlegen (kopieren, einfügen, fertig):
mkdir -p /opt/n8n/data/caddy_config
mkdir -p /opt/n8n/data/local_files
2. Docker Volumes erstellen:
docker volume create caddy_data
docker volume create n8n_data
3. Konfigurationsdateien erstellen:
Jetzt wird’s spannend. Lass uns erst die Docker-Compose-Datei anlegen:
services:
caddy:
container_name: caddy
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- caddy_data:/data
- ${DATA_FOLDER}/caddy_config:/config
- ${DATA_FOLDER}/caddy_config/Caddyfile:/etc/caddy/Caddyfile
networks:
- n8n-network
n8n:
container_name: n8n
image: docker.n8n.io/n8nio/n8n
restart: always
ports:
- 5678:5678
environment:
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
volumes:
- n8n_data:/home/node/.n8n
- ${DATA_FOLDER}/local_files:/files
networks:
- n8n-network
volumes:
caddy_data:
external: true
n8n_data:
external: true
networks:
n8n-network:
driver: bridge
Die .env-Datei für all die geheimen Sachen:
DOMAIN_NAME=aiscream.de # Deine Domain
SUBDOMAIN=demo # Deine Subdomain für n8n
DATA_FOLDER=/opt/n8n/data # Wo die Daten liegen
GENERIC_TIMEZONE=Europe/Berlin # Zeitzone - weil du nicht in GMT leben willst
N8N_BASIC_AUTH_ACTIVE=true # Zugriffskontrolle - keine Party ohne Einladung
N8N_BASIC_AUTH_USER=admin # Dein Benutzername
N8N_BASIC_AUTH_PASSWORD=**** # Dein Passwort (bitte nichts Simples nehmen!)
N8N_ENCRYPTION_KEY=**** # Verschlüsselungsschlüssel (mindestens 32 Zeichen lang)
Die Caddyfile (einfacher geht’s nicht):
demo.aiscream.de {
reverse_proxy n8n:5678 {
flush_interval -1
}
}
4. Die Maschine starten:
cd /opt/n8n
docker compose up -d
Herzlichen Glückwunsch! Du kannst jetzt unter https://demo.aiscream.de (oder wie auch immer deine Domain lautet) auf n8n zugreifen.
Limitierungen der SQLite-Version
Diese Version ist wie ein Kompaktwagen: Zuverlässig für den Alltag, aber nicht für Hochleistung gebaut.
- Funktioniert gut bei max. 5.000-10.000 täglichen Workflow-Ausführungen
- Verträgt 10-15 gleichzeitige Workflows
- Datenbank sollte unter 5 GB bleiben
- SQLite mag keine gleichzeitigen Schreibvorgänge (wie die meisten von uns)
Variante 2: Die PostgreSQL-Edition (Für Wachstumsunternehmen)
Du bist gewachsen und brauchst mehr Power? Zeit für PostgreSQL. Diese Variante ist wie ein SUV – mehr Kraft, mehr Platz, mehr Möglichkeiten.
Was ist neu?
Statt SQLite kommt jetzt PostgreSQL ins Spiel – eine richtige, ausgewachsene Datenbank, die mit dir wachsen kann.
So bringst du sie zum Laufen:
1. Verzeichnisse und Volumes anlegen:
mkdir -p /opt/n8n/data/caddy_config
mkdir -p /opt/n8n/data/local_files
cd /opt/n8n
docker volume create caddy_data
docker volume create n8n_data
docker volume create postgres_data
2. Die Docker-Compose-Datei:
services:
caddy:
container_name: caddy
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- caddy_data:/data
- ${DATA_FOLDER}/caddy_config:/config
- ${DATA_FOLDER}/caddy_config/Caddyfile:/etc/caddy/Caddyfile
networks:
- n8n-network
n8n:
container_name: n8n
image: docker.n8n.io/n8nio/n8n
restart: always
ports:
- 5678:5678
environment:
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
# PostgreSQL-Konfiguration
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE}
- DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n
- ${DATA_FOLDER}/local_files:/files
depends_on:
- postgres
networks:
- n8n-network
postgres:
container_name: postgres
image: postgres:13
restart: always
environment:
- POSTGRES_USER=${DB_POSTGRESDB_USER}
- POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD}
- POSTGRES_DB=${DB_POSTGRESDB_DATABASE}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- n8n-network
volumes:
caddy_data:
external: true
n8n_data:
external: true
postgres_data:
external: true
networks:
n8n-network:
driver: bridge
3. .env-Datei erweitern:
DOMAIN_NAME=aiscream.de
SUBDOMAIN=demo
DATA_FOLDER=/opt/n8n/data
GENERIC_TIMEZONE=Europe/Berlin
# Authentifizierung
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=**** # Wähle ein sicheres Passwort!
N8N_ENCRYPTION_KEY=**** # Mindestens 32 Zeichen, komplex und einzigartig
# PostgreSQL-Konfiguration
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=**** # Separates DB-Passwort, auch sicher wählen!
DB_POSTGRESDB_DATABASE=n8n
4. Caddyfile bleibt gleich:
demo.aiscream.de {
reverse_proxy n8n:5678 {
flush_interval -1
}
}
5. Container starten:
docker compose up -d
Vorteile der PostgreSQL-Edition:
- Bessere Unterstützung für gleichzeitige Zugriffe
- Höhere Zuverlässigkeit bei umfangreichen Datenmengen
- Bessere Performance bei hohen Workloads
- Unterstützung für Team-Funktionen (mehrere Nutzer)
- Verarbeitet bis zu 50.000 tägliche Workflows
Variante 3: Die Supabase-Edition (Für Outsourcing-Freunde)
Keine Lust, dich um die Datenbank zu kümmern? Supabase übernimmt das für dich. Das ist wie ein Chauffeurdienst – du genießt die Fahrt, ohne ans Steuer zu müssen.
Vorbereitende Schritte:
1. Supabase-Konto einrichten und Projekt anlegen
-
Registriere dich bei Supabase und erstelle ein neues Projekt
-
Beim Erstellen deines ersten Projekts musst du ein Datenbank-Passwort festlegen – merk dir dieses gut, du brauchst es später!
-
Nach der Projekterstellung brauchst du zwei wichtige Informationen:
- Den Connection String im Session Pooler Format
- Das SSL-Zertifikat
-
So findest du den Connection String:
- Klicke oben in der Menüleiste auf “Connect”
- Im sich öffnenden Popup scrollst du nach unten zum Abschnitt “Session Pooler”
- Kopiere den angezeigten Connection String (sieht etwa so aus:
postgresql://postgres.jhauaeagtyyroyjvtzsh:[YOUR-PASSWORD]@aws-0-eu-central-1.pooler.supabase.com:5432/postgres
)
-
So findest du das SSL-Zertifikat:
- Gehe zu “Project Settings”
- Dann bei “Configuration” auf “Database”
- Unter “SSL Configuration” kannst du das SSL-Zertifikat herunterladen
2. Verzeichnisstruktur auf dem Server anlegen:
mkdir -p /opt/n8n/data/caddy_config
mkdir -p /opt/n8n/data/certs
mkdir -p /opt/n8n/data/local_files
cd /opt/n8n
3. SSL-Zertifikat auf den Server übertragen:
Das heruntergeladene SSL-Zertifikat musst du auf deinen Server in das Verzeichnis /opt/n8n/data/certs/
übertragen.
4. Docker Volumes erstellen:
docker volume create caddy_data
docker volume create n8n_data
Konfigurationsdateien:
1. Analysiere den Connection String:
Nehmen wir den Beispiel-String:
postgresql://postgres.jhauaeagtyyroyjvtzsh:[YOUR-PASSWORD]@aws-0-eu-central-1.pooler.supabase.com:5432/postgres
Daraus extrahierst du folgende Werte:
- User:
postgres.jhauaeagtyyroyjvtzsh
(alles zwischen://
und:
) - Passwort: Das Passwort, das du bei der Projekterstellung festgelegt hast
- Host:
aws-0-eu-central-1.pooler.supabase.com
(alles zwischen@
und:5432
) - Port:
5432
- Datenbank:
postgres
(alles nach dem letzten/
)
2. .env-Datei erstellen:
# Domain und Pfade
DOMAIN_NAME=aiscream.de
SUBDOMAIN=demo
DATA_FOLDER=/opt/n8n/data
GENERIC_TIMEZONE=Europe/Berlin
# Authentifizierung
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=**** # Wähle ein sicheres Passwort!
N8N_ENCRYPTION_KEY=**** # Mindestens 32 Zeichen, sicher und einzigartig
# Supabase PostgreSQL-Konfiguration
DB_POSTGRESDB_DATABASE=postgres
DB_POSTGRESDB_HOST=aws-0-eu-central-1.pooler.supabase.com
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_USER=postgres.jhauaeagtyyroyjvtzsh # Deine Projekt-ID von Supabase
DB_POSTGRESDB_PASSWORD=**** # Das Passwort, das du bei der Projekterstellung festgelegt hast
DB_POSTGRESDB_SCHEMA=public
3. Docker-Compose-Datei erstellen:
services:
caddy:
container_name: caddy
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- caddy_data:/data
- ${DATA_FOLDER}/caddy_config:/config
- ${DATA_FOLDER}/caddy_config/Caddyfile:/etc/caddy/Caddyfile
networks:
- n8n-network
n8n:
container_name: n8n
image: docker.n8n.io/n8nio/n8n
restart: always
ports:
- 5678:5678
environment:
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
# Supabase PostgreSQL-Konfiguration
- DB_TYPE=postgresdb
- DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE}
- DB_POSTGRESDB_HOST=${DB_POSTGRESDB_HOST}
- DB_POSTGRESDB_PORT=${DB_POSTGRESDB_PORT}
- DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD}
- DB_POSTGRESDB_SCHEMA=${DB_POSTGRESDB_SCHEMA}
- DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=true
volumes:
- n8n_data:/home/node/.n8n
- ${DATA_FOLDER}/local_files:/files
- ${DATA_FOLDER}/certs:/opt/custom-certificates
networks:
- n8n-network
volumes:
caddy_data:
external: true
n8n_data:
external: true
networks:
n8n-network:
driver: bridge
4. Caddyfile erstellen:
demo.aiscream.de {
reverse_proxy n8n:5678 {
flush_interval -1
}
}
5. Container starten:
docker compose up -d
6. Logs prüfen:
docker compose logs -f
Achte auf Fehlermeldungen bezüglich der Datenbankverbindung. Wenn alles korrekt konfiguriert ist, sollte n8n erfolgreich starten und sich mit der Supabase-Datenbank verbinden.
WICHTIG: Aktiviere die automatischen Backups direkt in deinem Supabase-Dashboard unter “Project Settings” → “Database” → “Backups”!
Welche Version passt zu dir?
Variante | Für wen? | Workload | Vorteile | Nachteile |
---|---|---|---|---|
SQLite | Einsteiger, Kleinunternehmen | Bis 10k Workflows/Tag | Einfach, schnell eingerichtet | Begrenzte Skalierbarkeit |
PostgreSQL | Wachsende Unternehmen | Bis 50k Workflows/Tag | Zuverlässiger bei hoher Last, teamfähig | Höherer Ressourcenbedarf |
Supabase | Unternehmen ohne DB-Expertise | Bis 50k Workflows/Tag | Keine DB-Wartung nötig, managed Service | Externe Abhängigkeit, Kosten |
Wartung: Updates und Pflege
Container aktualisieren (für alle Varianten):
cd /opt/n8n
docker compose pull
docker compose down
docker compose up -d
Logs überwachen:
# Alle Container-Logs
docker compose logs
# Nur n8n-Logs
docker compose logs n8n
# Nur Caddy-Logs
docker compose logs caddy
Fehlersuche: Die üblichen Verdächtigen
Container startet nicht:
docker compose logs
Verschlüsselungsschlüssel-Probleme:
Wenn du Fehler wie “Mismatching encryption keys” siehst:
docker compose down
docker volume rm n8n_data
docker volume create n8n_data
docker compose up -d
ACHTUNG: Dies löscht deine Konfiguration! Workflows solltest du vorher exportieren.
Berechtigungsprobleme:
Wenn Berechtigungswarnungen für Konfigurationsdateien erscheinen, prüfe ob in den Umgebungsvariablen steht:
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
Fazit: Automation ist eine Reise, kein Ziel
Was auch immer du heute wählst – dein Bedarf wird sich ändern. Fang klein an, wenn du unsicher bist. Mit unseren Anleitungen kannst du jederzeit upgraden. Das Schöne an n8n: Es wächst mit dir.
Der SQLite-Start ist die einfachste Variante zum Ausprobieren, aber spätestens wenn deine Automatisierungen produktiv werden, solltest du über PostgreSQL nachdenken. Und wenn du wirklich keinen Bock auf Datenbank-Administration hast, ist Supabase dein Freund – aber mit externen Abhängigkeiten und Kosten.
Und falls du Hilfe bei der Entscheidung oder Umsetzung brauchst – wir bei AIscream sind nur eine Nachricht entfernt. Weil Automatisieren zwar Spaß macht, aber gemeinsam noch mehr.