Self-Hosted Large Language Model (LLM) mit Ollama hinter einem Auth-Proxy

Inhalt
Das Übertragen vertraulicher Unternehmensdokumente, Kundendaten und Quellcodes an öffentliche Large-Language-Model-APIs (LLM) wie OpenAI, Anthropic oder Google Gemini birgt gravierende Datenschutzrisiken und potenzielle DSGVO-Verstöße. Das Hosting offener KI-Modelle – wie Llama 3.1, Mistral oder CodeLlama – auf firmeneigener Server-Hardware garantiert absolute Datenhoheit. Da der populäre Inferenzserver Ollama seine REST-API standardmäßig auf Port 11434 völlig ohne native Authentifizierung bereitstellt, erfordert der sichere Betrieb im Unternehmensnetzwerk eine geschützte Architektur: einen Nginx-Reverse-Proxy zur Durchsetzung strenger API-Token-Authentifizierung und TLS-Verschlüsselung.
1. Architektur-Grundlagen: Sichere Edge-Inferenz-Pipeline
Ein professionelles, lokales LLM-Deployment entkoppelt die Modellausführung von der Netzwerkfreigabe durch die Schichtung dreier isolierter Dienste innerhalb einer Container-Umgebung:
- Ollama-Inferenz-Backend: Führt offene LLM-Gewichte unter Nutzung von NVIDIA-GPU-Beschleunigung (via NVIDIA Container Toolkit) oder CPU-Quantisierung aus und ist ausschließlich an interne Container-Netzwerkschnittstellen gebunden.
- Nginx-Authentifizierungs- & TLS-Proxy: Agiert als zentraler Einlasspunkt, abfängt sämtliche HTTP-Anfragen, terminiert SSL/TLS-Zertifikate und validiert Bearer-Token oder HTTP-Basic-Auth-Zugangsdaten, bevor Anfragen an Ollama weitergeleitet werden.
- OpenAI-kompatibles Frontend / Skripte: Interne Web-Oberflächen (wie Open WebUI) oder automatisierte Python-Skripte kommunizieren über standardisierte OpenAI-SDK-Syntaxen mit dem abgesicherten Endpunkt, ohne den Sicherheits-Proxy zu umgehen.
2. Schritt-für-Schritt-Container- & GPU-Bereitstellung
Um Ollama zusammen mit einem dedizierten Nginx-Reverse-Proxy zu betreiben, wird die folgende produktionsreife docker-compose.yml für GPU-Passthrough und isoliertes Networking bereitgestellt:
services:
ollama:
image: ollama/ollama:latest
container_name: enterprise_ollama
restart: always
environment:
- OLLAMA_HOST=0.0.0.0
- OLLAMA_ORIGINS=*
volumes:
- ./ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
networks:
- llm_internal
auth_proxy:
image: nginx:alpine
container_name: ollama_auth_proxy
restart: always
ports:
- "8443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
- ./htpasswd:/etc/nginx/.htpasswd:ro
depends_on:
- ollama
networks:
- llm_internal
networks:
llm_internal:
driver: bridge
3. Schritt-für-Schritt-Konfiguration des Nginx-Auth-Proxys
Um den API-Zugriff ausschließlich auf autorisierte Unternehmensanwendungen zu beschränken, wird Nginx mit HTTP Basic Authentication oder API-Token-Abfragen konfiguriert. Das folgende nginx.conf-Skript erzwingt die Authentifizierung und verlängert Timeouts für langandauernde Streaming-Inferenz-Antworten:
events {
worker_connections 1024;
}
http {
upstream ollama_backend {
server ollama:11434;
}
server {
listen 443 ssl;
server_name llm.internal.domain;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Erzwingung von HTTP Basic Auth (Erstellung via: htpasswd -c ./htpasswd api_user)
auth_basic "Enterprise LLM Secure Gateway";
auth_basic_user_file /etc/nginx/.htpasswd;
# Obligatorische Timeout-Erweiterungen für langes Inferenz-Streaming
proxy_read_timeout 600s;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
location / {
proxy_pass http://ollama_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Streaming-Unterstützung für Server-Sent Events (SSE)
proxy_buffering off;
proxy_cache off;
}
}
}
4. Schritt-für-Schritt-Verifizierung mit Skripten & Web UI
Sobald der Proxy aktiv ist, lässt sich die Inferenz-Engine sicher über Skripte abfragen oder in Chat-Oberflächen anbinden:
- Modell-Download: Der initiale Modell-Download erfolgt direkt im Container über das CLI:
docker exec -it enterprise_ollama ollama run llama3.1 - Python-API-Verifizierung: Versand einer authentifizierten HTTPS-REST-Anfrage an den Proxy unter Angabe der Basic-Auth-Zugangsdaten:
curl -k -u "api_user:SecretPassword123" https://localhost:8443/api/generate -d '{"model": "llama3.1", "prompt": "Zusammenfassung der Datenschutzrichtlinie.", "stream": false}' - Anbindung an Open WebUI: Bereitstellung des
open-webui-Docker-Containers im selben Netzwerk unter Konfiguration der Endpunkt-Umgebungsvariable:OLLAMA_BASE_URL=https://api_user:SecretPassword123@auth_proxy:443
5. Zusammenfassung & Mehrwert
Was sich damit erreichen lässt: Die erfolgreiche Bereitstellung eines selbstgehosteten, GPU-beschleunigten Inferenz-Servers für offene LLMs mit Ollama, abgesichert durch einen Nginx-Authentifizierungs- und SSL/TLS-Reverse-Proxy.
Resultierender Mehrwert: Ein privates, leistungsstarkes „ChatGPT“-Äquivalent steht für interne Unternehmensabläufe, Software-Skripte und Mitarbeiter-Benutzeroberflächen zur Verfügung, ohne dass sensible Daten an externe KI-Anbieter abfließen. Die absolute Datenhoheit und vollständige DSGVO-Konformität sind gewährleistet, während obligatorische Authentifizierungsmechanismen unbefugte Zugriffe auf die Rechenressourcen verhindern.