n8n Setup-Guide: Von Light bis Pro (SQLite, PostgreSQl, Supabase)

6. Mai 2025
5 Min. Lesezeit

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.

n8n mit SQLite, PostgresSQL oder Supabase

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

  1. Registriere dich bei Supabase und erstelle ein neues Projekt

  2. Beim Erstellen deines ersten Projekts musst du ein Datenbank-Passwort festlegen – merk dir dieses gut, du brauchst es später!

  3. Nach der Projekterstellung brauchst du zwei wichtige Informationen:

    • Den Connection String im Session Pooler Format
    • Das SSL-Zertifikat
  4. 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)
  5. 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?

VarianteFür wen?WorkloadVorteileNachteile
SQLiteEinsteiger, KleinunternehmenBis 10k Workflows/TagEinfach, schnell eingerichtetBegrenzte Skalierbarkeit
PostgreSQLWachsende UnternehmenBis 50k Workflows/TagZuverlässiger bei hoher Last, teamfähigHöherer Ressourcenbedarf
SupabaseUnternehmen ohne DB-ExpertiseBis 50k Workflows/TagKeine DB-Wartung nötig, managed ServiceExterne 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.