Du brauchst Daten-Hoheit, DSGVO-Konformität und unbegrenzte Executions? Ein Self-Hosted Stack ist 15 Jahre alt (technisch stabil) und kostet weniger als Cloud monatlich.
Warum Self-Hosted?
| Grund | Nutzen |
|---|---|
| DSGVO | Kundendaten niemals verlassen dein Netzwerk |
| Kosten | >$5k/Mo Cloud → $300/Mo Hardware |
| Kontrolle | Backups, Updates, Sicherheit selbst |
| Keine Limits | Unbegrenzte Workflows, Requests, Speicher |
| Offline | Läuft auch ohne Internet |
Tradeoff: Wartung erforderlich (1-2h/Monat).
Der Stack: Komponenten
┌─────────────────────────────────────┐
│ Web-UI (Open WebUI, Chatbot) │ Port 8080
├─────────────────────────────────────┤
│ LLM Inference (Ollama, vLLM) │ Port 11434
├─────────────────────────────────────┤
│ Workflows (n8n, Activepieces) │ Port 5678
├─────────────────────────────────────┤
│ Knowledge (open-notebook, RAG) │ Port 8000
├─────────────────────────────────────┤
│ Vector DB (ChromaDB, Qdrant) │ Port 6333
├─────────────────────────────────────┤
│ Monitoring (Grafana, Prometheus) │ Port 3000
├─────────────────────────────────────┤
│ Database (PostgreSQL, SurrealDB) │ Port 5432
├─────────────────────────────────────┤
│ Hardware (GPU, CPU, RAM) │ Server
└─────────────────────────────────────┘
Du musst nicht alles deployen. Start: Ollama + Open WebUI + n8n. Das ist 80% der Nutzen.
1. LLM Inference Layer
Ollama (einfachste Option)
| Aspekt | Detail |
|---|---|
| Installation | Homebrew, Windows, Linux (jeweils 5min) |
| Models | 500+ Modelle downloadbar |
| API | OpenAI-kompatibel (localhost:11434) |
| GPU-Support | NVIDIA (CUDA), AMD (ROCm), Apple (Metal) |
| Speicher | Modelle lokal gecacht |
| VRAM-Overhead | ~500MB Basis + Model Size |
Installation (MacOS):
brew install ollama
ollama run llama2 # Startet LLM Download + Chat
Installation (Linux mit NVIDIA):
curl https://ollama.ai/install.sh | sh
sudo systemctl start ollama
ollama run neural-chat # Schnelleres Modell (7B)
API-Nutzung:
# Lokale Chat-API
curl http://localhost:11434/api/chat -d '{
"model": "neural-chat",
"messages": [{"role": "user", "content": "Hallo"}]
}'
# In n8n, Open WebUI, anderen Apps direkt verwenden
Vorinstallierte Modelle (nach Größe):
| Modell | Size | VRAM | Tokens/s (RTX 4070) | Qualität |
|---|---|---|---|---|
| Phi-3.5 (3.8B) | 2GB | 4GB | 100+ | Gut für Edge |
| Neural-Chat (7B) | 4GB | 6GB | 60+ | Schnell |
| Llama 2 (7B) | 4GB | 6GB | 50+ | Solide |
| Mistral (7B) | 4GB | 6GB | 65+ | Beste Geschwindigkeit |
| Qwen 2.5 (14B) | 9GB | 12GB | 40+ | Beste Qualität (14B) |
| Llama 2 70B (Q4) | 40GB | 42GB | 5+ | Beste Qualität (70B) |
Stärken:
- Stupidly einfach zu installieren
- Model-Switching trivial (Cmd+Backspace wechselt im Chat)
- OpenAI-API kompatibel (works mit n8n, Open WebUI, etc.)
- VRAM-optimiert (Q4_K_M default)
Schwächen:
- Nicht für Produktion bei >100 Req/s
- Kein Batching/Load-Balancing built-in
- Single-GPU nur
Best for: Startups. Kleine Teams. DSGVO-Anforderung. First Prototype.
vLLM (Produktion, schnell)
| Aspekt | Detail |
|---|---|
| Spezialisierung | High-Throughput Inference |
| Performance | 10x schneller als Ollama (bei Scale) |
| API | OpenAI-kompatibel (Port 8000) |
| GPU-Support | NVIDIA (CUDA), optimiert |
| Batching | ✅ Automatisch |
| Multi-GPU | ✅ Ja (Tensor Parallel) |
| VRAM-Saving | ✅ PagedAttention (25-30% weniger) |
Installation (Linux + NVIDIA):
pip install vllm
vllm serve meta-llama/Llama-2-7b-hf \
--max-model-len 4096 \
--port 8000 \
--tensor-parallel-size 2 # Auf 2 GPUs verteilt
Wann vLLM über Ollama:
-
50 Requests/Sekunde
- Multi-GPU Setup
- Latenzy-SLA (<200ms p95)
- Tokenizer-Komplex (lange Kontexte)
Wann Ollama:
- <10 Req/s
- Single GPU
- Einfachheit > Performance
- Non-NVIDIA (Apple Metal, AMD)
2. Web-UI Layer
Open WebUI (All-in-One Chattool)
| Aspekt | Detail |
|---|---|
| Installation | Docker (2min) |
| UI | Modern, ChatGPT-ähnlich |
| Features | Chat, RAG, Web Browsing, Agents |
| Model-Backend | Beliebig (Ollama, OpenAI, Anthropic) |
| Speicher | Chats lokal (SQLite) |
| Authentifizierung | Basic Auth oder OAuth |
Docker Compose:
version: '3'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:latest
ports:
- "8080:8080"
volumes:
- open-webui-data:/app/backend/data
environment:
OLLAMA_API_BASE_URL: http://ollama:11434
depends_on:
- ollama
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama-data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
volumes:
open-webui-data:
ollama-data:
Starten:
docker-compose up -d
# Offen in Browser: http://localhost:8080
Stärken:
- Schöne UI, einsteigerfreundlich
- RAG integriert (Knowledge Upload)
- Web-Browsing (mit Ollama-Backend)
- Multi-Model (kannst GPT-4, Claude dazuschalten)
Schwächen:
- Weniger Developer-Features als Alternatives
- RAG ist einfach (für Production: open-notebook verwenden)
Best for: Non-Technical Users. Chatbot UI. Knowledge Q&A.
SillyTavern (Rollenplay/Advanced)
| Aspekt | Detail |
|---|---|
| Spezialisierung | Character-driven Chat, Memory |
| Features | Character Cards, Multi-turn Memory, Editing |
| Wann | Wenn du Character-Roleplay oder Long-Memory brauchst |
Nicht Standard für Business — mehr für Privacy-Focused Enthusiasts.
3. Workflow Automation
n8n Self-Hosted (siehe auch: Workflow-Automation Wiki)
Docker Compose (vollständig):
version: '3'
services:
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
N8N_HOST: localhost
N8N_PORT: 5678
N8N_PROTOCOL: http
N8N_SECURE_COOKIE: "false"
DB_TYPE: postgres
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: n8n_password
DB_POSTGRESDB_DATABASE: n8n
volumes:
- n8n-data:/home/node/.n8n
depends_on:
- postgres
postgres:
image: postgres:13
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8n_password
POSTGRES_DB: n8n
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
n8n-data:
postgres-data:
Start:
docker-compose up -d
# http://localhost:5678
Integrieren mit Ollama:
n8n Node: HTTP Request
URL: http://ollama:11434/api/chat
Method: POST
Body: {
"model": "neural-chat",
"messages": [{"role": "user", "content": "{{ $json.input }}"}]
}
Activepieces (Leichtere Alternative)
Docker:
docker run -d \
-p 80:80 \
-e FRONTEND_URL=http://localhost \
-e BACKEND_URL=http://localhost/api \
-v activepieces-data:/root/.activepieces \
activepieces/activepieces:latest
Für: Einfache Workflows, weniger Feature-Rich als n8n, aber schneller zu deployen.
4. Knowledge Management (RAG)
open-notebook (ai-engineering proprietary)
Nicht Open Source, aber wenn verfügbar:
service:
open-notebook:
image: your-registry/open-notebook:latest
ports:
- "8000:8000"
environment:
OLLAMA_API_BASE: http://ollama:11434
SURREALDB_URL: surreal://surrealdb:8000
depends_on:
- ollama
- surrealdb
Features: Semantische Suche, Embeddings lokal, ähnlich Notion aber mit KI.
ChromaDB (einfache Alternative)
import chromadb
client = chromadb.Client()
collection = client.create_collection("documents")
# Add documents
collection.add(
documents=["Kundenvertrag von 2024", "Budget Excel"],
metadatas=[{"source": "legal"}, {"source": "finance"}],
ids=["doc1", "doc2"]
)
# Search
results = collection.query(
query_texts=["Zahlungsbedingungen"],
n_results=2
)
Deployment:
docker run -p 8000:8000 chromadb/chroma:latest
Stärken:
- Einfach (in-memory oder persistent)
- Python-native
- Ollama-kompatibel für Embeddings
Qdrant (Enterprise RAG)
qdrant:
image: qdrant/qdrant:latest
ports:
- "6333:6333"
volumes:
- qdrant-data:/qdrant/storage
Wann: >1M Documents, komplexe Metadaten-Filter.
5. Datenbanken
PostgreSQL (Standard)
docker run -d \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 \
postgres:15
Für: n8n State, User Credentials, strukturierte Daten.
SurrealDB (Graph + KI-freundlich)
docker run -d \
-p 8000:8000 \
surrealdb/surrealdb:latest start
Für: Knowledge Graphs, Relationships, embeddings.
6. Monitoring
Siehe: Monitoring Wiki
Minimum:
docker run -d -p 9090:9090 prom/prometheus
docker run -d -p 3000:3000 grafana/grafana
docker run -d -p 3001:3001 louislam/uptime-kuma
Hardware-Anforderungen (Budget-Breakdown)
Tier 1: Budget (€500-1000, für kleine Projekte)
Hardware:
- Laptop/Desktop mit RTX 4060 (8GB VRAM) oder Apple Silicon MacBook Pro
- 32GB RAM
- 500GB SSD
Was läuft:
- Ollama (Qwen 2.5 7B oder Mistral 7B)
- Open WebUI
- n8n (kleine Workflows)
- Nicht: vLLM, Multi-GPU, High-Throughput
Kosten/Monat: €0 (Hardware amortisiert sich in 4-6 Monaten vs. Cloud).
Tier 2: Standard (€2000-4000, für 5-30 Person Teams)
Hardware:
- Dedicated Server: RTX 4070 Super (12GB) oder RTX 4090 (24GB)
- 64GB RAM
- 1TB SSD
- 1Gbps Internet
Services:
- Ollama (Multi-GPU möglich)
- Open WebUI + RAG
- n8n (100+ Workflows)
- PostgreSQL + SurrealDB
- Monitoring (Grafana)
- Backup-Automation
Provider: Contabo, Hetzner, DigitalOcean
Kosten/Monat: €50-150 Hardware. ROI vs. Cloud: 1-2 Monate bei moderatem Volumen.
Tier 3: Production (€5000+, für Unternehmen)
Hardware:
- RTX 6000 Ada (48GB) oder H100 (80GB)
- 256GB+ RAM
- NVMe RAID
- Redundant Internet
Services:
- vLLM (Multi-GPU, Batching)
- n8n (unbegrenzte Scale)
- Qdrant (Millionen Documents)
- Kubernetes (wenn 5+ Services)
- PagerDuty Alerting
- 24/7 Monitoring
Kosten/Monat: €200-500 Hardware. ROI vs. GPT-API: 1 Monat bei >$5k/Mo Cloud Spend.
Deployment-Architektur (für Scale)
Internet ← Cloudflare Tunnel ← Reverse Proxy (Nginx)
↓
┌────────────────┬───────────┼───────────┐
↓ ↓ ↓ ↓
n8n:5678 Open WebUI:8080 Ollama:11434 Monitoring:3000
↓ ↓ ↓ ↓
└────────────────┴─────────┬─────────────┘
↓
PostgreSQL 5432
SurrealDB 8000
ChromaDB 8100
Monitoring Endpoints:
- Prometheus scrapes jeden Service alle 60s
- Grafana visualisiert
- Uptime Kuma checkt HTTP 200 response
Backup-Strategie (PFLICHT!)
Tägliche Backups
#!/bin/bash
# backup.sh
BACKUP_DIR="/backups/$(date +%Y-%m-%d)"
mkdir -p $BACKUP_DIR
# n8n Workflows (JSON)
docker exec n8n npm --prefix . run build 2>&1 | grep -i workflow > $BACKUP_DIR/n8n-workflows.json
# PostgreSQL
docker exec postgres pg_dump -U n8n n8n > $BACKUP_DIR/n8n-db.sql
# SurrealDB
docker exec surrealdb surreal export 'surreal://localhost:8000' > $BACKUP_DIR/surreal.sql
# Open WebUI Chats
docker cp open-webui:/app/backend/data/webui.db $BACKUP_DIR/
# Compress
tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR/
aws s3 cp $BACKUP_DIR.tar.gz s3://your-bucket/backups/
Cron (täglich 2am):
0 2 * * * /root/backup.sh >> /root/backup.log 2>&1
Retention: 30 Tage lokal, 90 Tage in S3.
Full Stack Docker Compose (Production-ready)
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama-data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 3
open-webui:
image: ghcr.io/open-webui/open-webui:latest
ports:
- "8080:8080"
volumes:
- open-webui-data:/app/backend/data
environment:
OLLAMA_API_BASE_URL: http://ollama:11434
depends_on:
ollama:
condition: service_healthy
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
volumes:
- n8n-data:/home/node/.n8n
environment:
N8N_HOST: localhost
N8N_PORT: 5678
DB_TYPE: postgres
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${DB_PASSWORD}
DB_POSTGRESDB_DATABASE: n8n
depends_on:
- postgres
postgres:
image: postgres:15
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: n8n
ports:
- "5432:5432"
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
uptime-kuma:
image: louislam/uptime-kuma:latest
ports:
- "3001:3001"
volumes:
- uptime-kuma-data:/app/data
volumes:
ollama-data:
open-webui-data:
n8n-data:
postgres-data:
prometheus-data:
grafana-data:
uptime-kuma-data:
Start:
export DB_PASSWORD=secure_password_here
export GRAFANA_PASSWORD=another_secure_password
docker-compose up -d
First Steps Checklist
- Hardware entschieden (Tier 1-3)
- Server gemietet oder gekauft
- Docker + Docker Compose installiert
- Ollama + Open WebUI läuft
- n8n deployt (mit PostgreSQL)
- Monitoring aktiviert (Prometheus + Grafana)
- Backup-Script geschrieben + Cron aktiviert
- Cloudflare Tunnel (optional, für externe Zugriffe)
- Dokumentation: Config Backups, Recovery-Runbook
Sources:
