Zwei der nützlichsten Self-Hosted-Tools kombiniert: n8n für Workflow-Automatisierung und Ollama für lokale LLMs. Das Ergebnis ist ein AI-Automatisierungsstack, der vollständig unter deiner Kontrolle läuft — keine Tokens, keine Datenweitergabe, keine API-Kosten.
Das Setup
Beide Dienste laufen per Docker. Ein gemeinsames Netzwerk erlaubt n8n, direkt mit der Ollama-API zu kommunizieren:
services:
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=sicherespasswort
- WEBHOOK_URL=https://n8n.deinedomain.de
volumes:
- n8n_data:/home/node/.n8n
networks:
- ai-stack
ollama:
image: ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama_data:/root/.ollama
networks:
- ai-stack
# GPU einkommentieren wenn vorhanden:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
networks:
ai-stack:
volumes:
n8n_data:
ollama_data:
docker compose up -d
# Modell vorabladen
docker exec -it ollama-ollama-1 ollama pull llama3.2
n8n ist unter http://localhost:5678 erreichbar.
n8n mit Ollama verbinden
n8n hat seit Version 1.x einen nativen Ollama-Node. Unter Settings → Credentials → New Credential → Ollama:
- Base URL:
http://ollama:11434(interner Docker-Hostname)
Alternativ nutzt du den HTTP Request-Node direkt gegen die Ollama-API — mehr Kontrolle über Parameter wie Temperatur und System-Prompt.
Workflow-Beispiele
1. E-Mail-Zusammenfassung
Neue E-Mails per IMAP holen, den Inhalt durch ein LLM schicken und eine Zusammenfassung in ein Notion-Dokument oder Slack-Kanal schreiben.
Trigger: IMAP E-Mail (alle 5 Minuten)
→ Set Node: E-Mail-Body extrahieren + kürzen (max. 4000 Zeichen)
→ Ollama Chat Model: "Fasse diese E-Mail in 3 Sätzen zusammen auf Deutsch: {{$json.body}}"
→ Slack / Notion / Telegram: Zusammenfassung posten
System Prompt-Tipp: Gib dem Modell eine klare Rolle:
Du bist ein präziser Assistent, der E-Mails zusammenfasst.
Antworte immer auf Deutsch. Nutze maximal 3 Sätze.
Hebe wichtige Fristen oder Anfragen am Ende hervor.
2. Monitoring-Alert-Klassifizierung
Wenn dein Monitoring (Grafana, Prometheus, Zabbix) einen Alert auslöst, bewertet das LLM automatisch die Dringlichkeit und entscheidet, ob der Oncall-Dienst geweckt werden muss.
Trigger: Webhook (von Grafana Alertmanager)
→ HTTP Request: Letzte Metriken aus Prometheus holen
→ Code Node: Alert-Details + Metriken zusammenstellen
→ Ollama: "Klassifiziere diesen Alert als KRITISCH, WARNUNG oder INFO:
Alert: {{$json.alertname}}
Wert: {{$json.value}}
Schwellwert: {{$json.threshold}}
Kontext der letzten Stunde: {{$json.metrics}}"
→ Switch Node: KRITISCH → PagerDuty, WARNUNG → Slack, INFO → Nur loggen
Das LLM beurteilt, ob ein Spike um 3 Uhr morgens ein echter Vorfall ist oder reguläres Batch-Verhalten. Weniger False-Positive-Wakeups, besserer Schlaf.
3. Log-Zusammenfassung für den Tagesbericht
Täglich um 08:00 Uhr alle Fehler-Logs der letzten 24 Stunden aggregieren und eine lesbare Zusammenfassung erstellen.
Trigger: Schedule (08:00 Uhr täglich)
→ HTTP Request: Loki oder Elasticsearch nach ERROR-Level-Logs fragen
→ Code Node: Logs auf 8000 Zeichen kürzen + deduplizieren
→ Ollama: "Analysiere diese Server-Logs und erstelle einen Tagesbericht:
- Häufigste Fehler (Top 3)
- Neue Fehler die gestern nicht auftraten
- Empfohlene Maßnahmen
Logs: {{$json.logs}}"
→ E-Mail / Slack: Bericht versenden
4. Dokumenten-Klassifizierung
Eingehende Dokumente (Rechnungen, Verträge, Tickets) automatisch kategorisieren und in den richtigen Ordner ablegen.
Trigger: FTP/SFTP Watch oder Nextcloud Webhook
→ Read Binary File: Datei lesen
→ HTTP Request: Ollama mit PDF-Text
Body: {
"model": "llama3.2",
"prompt": "Klassifiziere dieses Dokument: RECHNUNG, VERTRAG, TICKET, SONSTIG.
Antworte nur mit der Kategorie, ohne Erklärung.\n\n{{$json.content}}"
}
→ Switch: Je nach Antwort in anderen Ordner verschieben
Modellwahl
Nicht jedes Modell passt zu jedem Task:
| Use-Case | Empfohlenes Modell | RAM |
|---|---|---|
| Textzusammenfassung | llama3.2:3b oder gemma3:4b | 4 GB |
| Klassifizierung | gemma3:4b | 4 GB |
| Strukturierte Ausgabe (JSON) | mistral:7b | 8 GB |
| Code-Analyse | qwen2.5-coder:7b | 8 GB |
| Komplexe Analyse | llama3.1:8b | 10 GB |
Für Automatisierungen ohne Nutzerinteraktion bevorzuge ich kleinere Modelle: schneller, weniger RAM, und für klar definierte Tasks wie Klassifizierung genauso gut wie große Modelle.
Structured Output für zuverlässige Workflows
Das größte Problem mit LLMs in Automatisierungen: die Ausgabe ist unvorhersehbar. Ein Modell antwortet mal mit “KRITISCH”, mal mit “Das ist ein kritischer Fehler”. Der Switch-Node in n8n versteht nur eine Form.
Lösung: Ollama unterstützt strukturierte Ausgabe per JSON-Schema:
{
"model": "llama3.2",
"prompt": "Klassifiziere diesen Alert: ...",
"format": {
"type": "object",
"properties": {
"severity": { "type": "string", "enum": ["CRITICAL", "WARNING", "INFO"] },
"reason": { "type": "string" },
"wakeOncall": { "type": "boolean" }
},
"required": ["severity", "reason", "wakeOncall"]
}
}
Das Modell gibt garantiert valides JSON in dieser Struktur zurück. Im n8n Code-Node lässt sich das direkt parsen:
const result = JSON.parse($input.first().json.response);
return [{ json: result }];
Tipps für den Produktivbetrieb
Timeout beachten: Kleinere Modelle brauchen auf CPU 10–60 Sekunden. n8n’s Standard-HTTP-Timeout ist 30 Sekunden. Bei längeren Anfragen im HTTP Request-Node den Timeout erhöhen oder stream: false setzen.
Kontext begrenzen: LLMs arbeiten mit einem Kontextfenster. Lange Logs oder E-Mails vor dem Senden kürzen — $json.text.slice(0, 4000) ist ein pragmatischer Anfang. Zu lange Eingaben verlangsamen das Modell und bringen weniger gute Ergebnisse.
Retry-Logik: Modell-Timeouts passieren. Im n8n Error-Workflow einen Retry mit exponential backoff einbauen.
Modell vorwärmen: Ollama lädt Modelle bei der ersten Anfrage in den RAM. Bei zeitkritischen Workflows empfiehlt sich ein Warmup-Ping beim Start: ollama run llama3.2 "".
Logging: Jeden Ollama-Call mit Eingabe, Ausgabe und Dauer in eine Tabelle (Airtable, Notion, Postgres) schreiben. Hilft beim Debuggen und beim Tuning der Prompts über Zeit.