Selbst gehosteter, S3-kompatibler Objektspeicher für Backups: MinIO hinter einem Nginx-Proxy, dazu ein rclone-basierter Backup-Agent mit versionierten Buckets. Ihre Offsite-Backups ohne Cloud-Rechnung
Ein vollständiges Muster von Lab bis Produktion: k3s in Docker mit eingebettetem etcd, Rancher für das Management, MetalLB für Layer-2-LoadBalancer-IPs, replizierter Longhorn-Speicher und Traefik-Ingr
LLMs auf eigener GPU-Hardware: Ollama als Serving-Engine, Open WebUI als Frontend im ChatGPT-Stil und LiteLLM als OpenAI-kompatibler Router davor — lokale Modelle und externe APIs bleiben dadurch austauschbar.
Ein Deployment-Guide mit lauffähigen Beispielen — kein herunterladbares Produkt. Alles unten ist die tatsächlich eingesetzte Konfiguration, gekürzt auf das, worauf es ankommt.
services:
ollama:
image: ollama/ollama:${OLLAMA_VERSION:-0.5.9}
container_name: ollama
restart: unless-stopped
volumes:
- ollama_models:/root/.ollama
- ./config/ollama:/etc/ollama:ro
ports:
- ${OLLAMA_PORT:-11434}:11434
environment:
- OLLAMA_HOST=0.0.0.0
- OLLAMA_KEEP_ALIVE=${OLLAMA_KEEP_ALIVE:-5m}
- OLLAMA_NUM_PARALLEL=${OLLAMA_NUM_PARALLEL:-2}
- OLLAMA_MAX_LOADED_MODELS=${OLLAMA_MAX_LOADED_MODELS:-3}
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities:
- gpu
healthcheck:
test:
- CMD
- curl
- -f
- http://localhost:11434/api/tags
interval: 30s
timeout: 10s
retries: 3
networks:
- ai_network
litellm:
image: ghcr.io/berriai/litellm:${LITELLM_VERSION:-main-v1.16.18}
container_name: litellm
restart: unless-stopped
depends_on:
ollama:
condition: service_healthy
volumes:
- ./config/litellm/proxy_config.yaml:/app/proxy_config.yaml:ro
ports:
- ${LITELLM_PORT:-4000}:4000
environment:
- LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY:?LITELLM_MASTER_KEY is required}
- DATABASE_URL=${LITELLM_DB_URL:-}
- LITELLM_MODE=${LITELLM_MODE:-proxy}
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
command:
- --config
- /app/proxy_config.yaml
- --port
- "4000"
healthcheck:
test:
- CMD
- curl
- -f
- http://localhost:4000/health/liveliness
interval: 30s
timeout: 10s
retries: 3
networks:
- ai_network
Auszug — ollama, litellm aus der Compose-Datei. Die übrigen Services (proxies, init jobs, exporters) folgen demselben Muster und binden ihre Konfiguration aus einem config/-Verzeichnis ein.
Kopieren Sie .env.example zu .env und setzen Sie mindestens:
OLLAMA_VERSION=latest
OLLAMA_PORT=11434
OLLAMA_HOST=0.0.0.0
OLLAMA_KEEP_ALIVE=10m
OLLAMA_NUM_PARALLEL=2
OLLAMA_MAX_LOADED_MODELS=4
.env setzen — niemals die Beispielwerte übernehmenDie VRAM-Rechnung ist einfach genug für eine Serviette. Modellgewichte in Q4-Quantisierung brauchen grob ein halbes Byte pro Parameter: Ein 7B-Model braucht etwa 4 GB, ein 14B-Model etwa 8, ein 32B-Model etwa 18. Obendrauf liegt der KV-Cache, der mit Kontextlänge und Konkurrenz wächst — rechnen Sie für realistische Chat-Lasten noch 1-4 GB dazu. Das ist die ganze Regel: Eine 8-GB-Karte trägt 7-8B-Modelle bequem, 16 GB öffnen 14B oder 8B mit langem Kontext, und 24 GB erreichen die 32B-Klasse. Die Durchsatz-Erwartungen skalieren entsprechend: einstellige Token pro Sekunde auf CPU, 30-80 Token pro Sekunde auf einer modernen Consumer-GPU für diese Größen — interaktiv, nicht sofort.
Fahren Sie ein Arbeitstier und einen Fallback, keinen Zoo. Das Arbeitstier ist das größte Model, das mit Kopfspiel für Kontext in den VRAM passt; der Fallback ist ein kleineres quantisiertes Model, das immer passt, damit der Stack benutzbar bleibt, während Sie experimentieren. Q4_K_M-Quantisierung ist der praktische Sweet Spot — der Perplexity-Preis gegenüber voller Präzision fällt für die meisten Aufgaben kaum ins Gewicht, die Speicherersparnis schon. Die Kontextlänge ist die versteckte Steuer: Verdoppeln heißt grob verdoppelter KV-Cache, weshalb das 32B-Model bei 4k Kontext oft besser abschneidet als ein 14B-Model, das in 32k gequetscht wird. Prompt-Qualität verschiebt Ergebnisse mehr als jede dieser Schrauben.
Welche GPU braucht man für lokale LLMs?
Der VRAM entscheidet, nicht das Modell-Marketing: Eine 8-GB-Karte trägt
7-8B-Modelle bequem in quantisierter Präzision, 16-24 GB öffnen die
13-32B-Klasse. Ollama übernimmt die Quantisierung, OLLAMA_NUM_PARALLEL
steuert, wie viele Anfragen sich die Karte teilen. Nur-CPU funktioniert für
geduldige Einzelnutzer; interaktive Nutzung will eine GPU.
Warum LiteLLM vor Ollama? LiteLLM spricht nach hinten den OpenAI-API-Dialekt — Anwendungen bekommen einen Endpoint und ein Credential-Format, egal ob das Modell auf der eigenen GPU läuft oder von einer externen API kommt. Ein Feature von lokal auf gehostet umzustellen wird zur Modellnamen-Änderung, nicht zur Code-Änderung.
Kann man lokale und Cloud-Modelle mischen? Ja — dafür existiert der Router. Sensible oder volumenstark Arbeitslasten bleiben auf lokalen Modellen, gelegentliches schweres Reasoning geht an eine externe API, und LiteLLM wendet Routing, Fallbacks und Kosten-Tracking einheitlich auf beides an.
Werden Modelle bei jeder Anfrage neu von der Platte geladen?
Nein. OLLAMA_KEEP_ALIVE hält geladene Modelle nach einer Anfrage resident
(Standard 5 Minuten, konfigurierbar), und OLLAMA_MAX_LOADED_MODELS begrenzt, wie viele gleichzeitig im VRAM bleiben. Diese beiden Stellschrauben nehmen die
Kaltstart-Pause aus der interaktiven Nutzung.
Ein Guide, kein Produkt. Diese Seite ist Deployment-Dokumentation mit lauffähigen Beispielen — kein Zip, kein Download, kein Supportvertrag. Sie adaptieren die Muster auf Ihre eigene Umgebung, und das Ergebnis gehört Ihnen.
Wenn Sie das produktionsreif in Ihrer Infrastruktur wollen: Das ist der Kern des zweitägigen Workshops Self-Hosted AI im Produktionseinsatz — Details auf der Consulting-Seite.