🐳 Docker

Sichere KI-Anwendungen im Heimlabor: Container, Netzwerk & Co.

Sichere KI-Anwendungen im Heimlabor: Container, Netzwerk & Co.
⚠️ Hinweis: Alle Guides auf smoth.me dienen ausschließlich zu Informations- und Lernzwecken. Die Umsetzung erfolgt auf eigene Gefahr. Wir übernehmen keine Haftung für Schäden, Datenverluste oder Systemausfälle, die durch die Anwendung dieser Anleitungen entstehen können. → Vollständiger Haftungsausschluss

Servus, Heimlabor-Enthusiasten und Admins!

Heute tauchen wir in ein Thema ein, das gerade in aller Munde ist und auch in unseren heimischen Serverracks immer relevanter wird: Künstliche Intelligenz. Die heise-Ankündigung eines Workshops zu "Azure OpenAI – Schritt für Schritt zur sicheren KI-Anwendung" hat mich sofort gepackt. Nicht, weil wir alle direkt Azure OpenAI im Heimlabor betreiben würden – das wäre, ehrlich gesagt, etwas abwegig. Aber die Kernideen dahinter – KI-App containerisieren, sicher deployen, Security und Netzwerk isoliert umsetzen – sind absolut Gold wert für unser eigenes Setup. Genau darum geht es in diesem Guide: Wie setzen wir diese Prinzipien mit unseren bewährten Tools wie Docker, Proxmox und Nginx Proxy Manager (oder Traefik) im Heimlabor um?

In meiner Erfahrung ist es essenziell, von Anfang an auf Sicherheit und saubere Architektur zu achten, besonders wenn man mit neuen Technologien wie KI experimentiert. Nichts ist ärgerlicher, als wenn man später alles neu aufsetzen muss, weil man die Grundlagen vernachlässigt hat. Dieser Guide hilft dir, eine solide Basis für deine zukünftigen KI-Projekte zu schaffen – sei es ein lokales Sprachmodell, eine Bilderkennung oder eine Anwendung, die später mit externen APIs wie Azure OpenAI kommuniziert.

Voraussetzungen: Was du mitbringen solltest

Bevor wir loslegen, lass uns sicherstellen, dass wir auf derselben Seite sind. Dieser Guide richtet sich an dich, wenn du bereits ein grundlegendes Verständnis für Linux, die Kommandozeile und vielleicht schon erste Erfahrungen mit Docker hast. Keine Sorge, ich erkläre die Schritte ausführlich, aber ein gewisses Vorwissen hilft ungemein.

  • Ein Server im Heimlabor: Ob ein dedizierter Rechner, eine VM auf Proxmox oder ein LXC – wichtig ist, dass du Root-Zugriff hast und Docker installieren kannst. Ich persönlich nutze gerne Debian oder Ubuntu Server als Basis in einer Proxmox-VM, das hat sich bewährt.
  • Docker und Docker Compose: Die Container-Engine schlechthin und das Tool, um Multi-Container-Anwendungen zu definieren und zu verwalten. Das ist unser Fundament.
  • Nginx Proxy Manager (NPM) oder Traefik: Ein Reverse Proxy ist unerlässlich, um deine Anwendungen sicher über HTTPS zugänglich zu machen und den Traffic intelligent zu routen. Ich nutze NPM in vielen meiner Projekte wegen seiner einfachen Web-UI, aber Traefik ist eine ebenso valide und oft mächtigere Alternative.
  • Grundlegende Netzwerkkenntnisse: IP-Adressen, Ports, DNS und vielleicht ein bisschen was über Firewalls.
  • Eine Domain (optional, aber empfohlen): Um Let's Encrypt für HTTPS nutzen zu können, brauchst du eine Domain, auf die du DNS-Einträge setzen kannst. Eine Subdomain wie ai-app.deinedomain.de reicht völlig aus.

Wichtig zu wissen: Wir werden hier keine komplexe KI-Anwendung von Grund auf programmieren. Stattdessen nutzen wir eine einfache Python Flask-App als Platzhalter, um die Prinzipien der Containerisierung, des sicheren Deployments und der Netzwerkisolation zu demonstrieren. Die Konzepte kannst du dann auf jede beliebige KI-Anwendung übertragen.

Das Konzept: Warum Container, Reverse Proxy und Isolation?

Bevor wir uns in die Befehlszeile stürzen, lass uns kurz klären, warum dieser Ansatz so wichtig ist:

  • Containerisierung (Docker): Stellt sicher, dass deine Anwendung mitsamt all ihren Abhängigkeiten in einer isolierten Umgebung läuft. Das verhindert "Dependency Hell", macht das Deployment konsistent und erleichtert die Skalierung. Stell dir vor, du hast eine KI-App, die Python 3.9 braucht, und eine andere, die nur mit Python 3.7 läuft. Ohne Container wäre das ein Albtraum. Mit Docker ist jede App glücklich in ihrer eigenen Blase.
  • Reverse Proxy (Nginx Proxy Manager/Traefik): Dein Single Point of Entry für alle externen Anfragen. Er leitet Anfragen basierend auf der Domain oder dem Pfad an den richtigen internen Container weiter. Das Wichtigste: Er kümmert sich um die HTTPS-Verschlüsselung mit Let's Encrypt, sodass du dich darum in deiner Anwendung nicht kümmern musst. Zudem kann er Basis-Authentifizierung oder Rate Limiting bereitstellen.
  • Netzwerkisolation: Standardmäßig sollten deine Anwendungen nicht direkt aus dem Internet erreichbar sein. Der Reverse Proxy ist die einzige Komponente, die Ports 80 und 443 nach außen öffnet. Alle anderen Container kommunizieren über interne Docker-Netzwerke, die vom Host-System und vom Internet isoliert sind. Das minimiert die Angriffsfläche erheblich.

Wer das zum ersten Mal einrichtet, stolpert oft über die Komplexität der Netzwerk-Konfiguration. Mein Tipp: Zeichne dir die gewünschte Architektur auf. Wo kommen Anfragen her? Wo gehen sie hin? Welche Ports sind involviert? Das hilft ungemein.

Schritt für Schritt: Die sichere KI-Anwendung im Heimlabor

1. Server vorbereiten und Docker installieren

Zuerst bringen wir unser Basissystem auf Vordermann und installieren Docker. Ich gehe davon aus, du hast einen frischen Debian/Ubuntu Server am Start.

sudo apt update && sudo apt upgrade -y
sudo apt install ca-certificates curl gnupg lsb-release -y

# Docker GPG-Key hinzufügen
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Docker Repository hinzufügen
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

# Benutzer zur Docker-Gruppe hinzufügen (damit du 'docker' ohne 'sudo' nutzen kannst)
sudo usermod -aG docker $USER
newgrp docker # Oder einfach neu anmelden

Überprüfe die Installation mit docker run hello-world. Wenn alles klappt, siehst du eine Begrüßungsnachricht.

2. Die KI-Anwendung containerisieren (Beispiel: Eine simple Flask-App)

Wir erstellen eine minimale Python Flask-App, die als unsere "KI-Anwendung" dient. Stell dir vor, diese App würde später Anfragen an ein lokales LLM schicken oder eine Bildverarbeitung durchführen.

Lege ein Verzeichnis für dein Projekt an, z.B. ~/ai-app:

mkdir ~/ai-app
cd ~/ai-app

Erstelle die Datei app.py:

# app.py
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def home():
    return "Willkommen bei deiner sicheren KI-Anwendung!"

@app.route('/predict')
def predict():
    # Hier würde später deine KI-Logik stehen, z.B. Aufruf eines Modells
    return jsonify({"status": "success", "prediction": "Das ist eine Beispiel-KI-Antwort!"})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Erstelle eine requirements.txt für die Python-Abhängigkeiten:

# requirements.txt
Flask==2.2.3

Nun das Dockerfile, um unsere App zu containerisieren:

# Dockerfile
# Basis-Image
FROM python:3.9-slim-buster

# Arbeitsverzeichnis im Container
WORKDIR /app

# Abhängigkeiten kopieren und installieren
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Anwendungscode kopieren
COPY app.py .

# Port, auf dem die App lauscht
EXPOSE 5000

# Startbefehl
CMD ["python", "app.py"]

Und zu guter Letzt die docker-compose.yml, um unsere App und das Netzwerk zu definieren. Wir erstellen hier ein separates Docker-Netzwerk für unsere Anwendungen, das vom Host-Netzwerk isoliert ist.

# docker-compose.yml
version: '3.8'

services:
  ai-app:
    build: .
    container_name: ai-app
    restart: unless-stopped
    networks:
      - web

networks:
  web:
    external: true # Wir nutzen ein externes Netzwerk, das wir einmalig anlegen

Wichtig zu wissen: Hier definieren wir networks: web: external: true. Das bedeutet, wir nutzen ein Docker-Netzwerk namens web, das wir manuell erstellen und das auch von unserem Nginx Proxy Manager genutzt wird. Das sorgt für die Kommunikation zwischen den Containern über den Reverse Proxy.

Erstelle das externe Docker-Netzwerk (falls noch nicht vorhanden, z.B. wenn du NPM schon hast):

docker network create web # Überspringen, falls du es schon für NPM hast

Baue und starte deine Anwendung:

docker compose up -d --build

Überprüfe, ob der Container läuft:

docker ps

Du solltest den ai-app Container sehen.

3. Sichere Netzwerk-Konfiguration mit Nginx Proxy Manager (NPM)

Wenn du Nginx Proxy Manager noch nicht laufen hast, ist jetzt der Zeitpunkt. Ich empfehle, NPM ebenfalls mit Docker Compose zu betreiben, idealerweise in einem eigenen Verzeichnis. Hier ist ein Beispiel docker-compose.yml für NPM:

# docker-compose.yml für Nginx Proxy Manager
version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81' # Admin-UI Port
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - web # Auch NPM nutzt unser 'web' Netzwerk

networks:
  web:
    external: true

Starte NPM (falls noch nicht geschehen):

cd ~/nginx-proxy-manager # oder dein NPM Verzeichnis
docker compose up -d

Greife auf die NPM-Admin-Oberfläche zu (z.B. http://deine-server-ip:81). Standard-Login ist admin@example.com mit Passwort changeme. Ändere das sofort!

Jetzt konfigurieren wir einen Proxy Host für unsere KI-Anwendung:

  1. Gehe in NPM zu "Hosts" -> "Proxy Hosts" und klicke auf "Add Proxy Host".
  2. Details Tab:
    • Domain Names: Trage hier die Subdomain ein, über die deine App erreichbar sein soll, z.B. ai-app.deinedomain.de.
    • Scheme: http
    • Forward Hostname / IP: Hier kommt der Container-Name deiner KI-Anwendung rein, also ai-app. Wichtig: Nicht die IP des Host-Systems, sondern der Name des Docker-Containers im gemeinsamen Netzwerk!
    • Forward Port: Der Port, auf dem deine App im Container lauscht, also 5000.
    • Block Common Exploits: Aktiviere das für zusätzliche Sicherheit.
    • Websockets Support: Aktiviere das, falls deine KI-App Websockets nutzt (oft der Fall).
  3. SSL Tab:
    • SSL Certificate: Wähle "Request a new SSL Certificate".
    • Force SSL: Aktiviere das, um alle HTTP-Anfragen auf HTTPS umzuleiten.
    • Email: Gib deine E-Mail-Adresse für Let's Encrypt ein.
    • I Agree to the Let's Encrypt Terms of Service: Haken setzen.
  4. Klicke auf "Save".

Stelle sicher, dass der DNS-Eintrag für ai-app.deinedomain.de auf die öffentliche IP-Adresse deines Servers zeigt.

4. Deployment testen und HTTPS-Zugriff

Nachdem du den Proxy Host in NPM gespeichert und der DNS-Eintrag propagiert ist (das kann ein paar Minuten dauern), solltest du deine KI-Anwendung sicher über HTTPS erreichen können:

Öffne deinen Browser und navigiere zu https://ai-app.deinedomain.de.

Du solltest die Nachricht "Willkommen bei deiner sicheren KI-Anwendung!" sehen. Wenn du https://ai-app.deinedomain.de/predict aufrufst, siehst du die JSON-Antwort.

Herzlichen Glückwunsch! Du hast deine erste KI-Anwendung sicher und isoliert in deinem Heimlabor bereitgestellt. Der gesamte Traffic läuft über HTTPS und wird vom Nginx Proxy Manager an deinen isolierten Docker-Container weitergeleitet.

5. Grundlagen der Security für dein Heimlabor

Das Deployment ist nur der Anfang. Security ist ein kontinuierlicher Prozess. Hier ein paar weitere Tipps:

  • Firewall (UFW): Konfiguriere die Firewall deines Host-Systems (z.B. UFW unter Ubuntu/Debian), um nur die notwendigen Ports zu öffnen. Für NPM sind das typischerweise 80 (für Let's Encrypt Challenge) und 443 (HTTPS). Der SSH-Port (standardmäßig 22) sollte auch offen sein, aber idealerweise mit Key-Authentifizierung und IP-Whitelisting.
    sudo ufw enable
    sudo ufw allow 22/tcp # SSH
    sudo ufw allow 80/tcp # HTTP für Let's Encrypt
    sudo ufw allow 443/tcp # HTTPS
    sudo ufw status verbose
    
  • Regelmäßige Updates: Halte dein Host-System und deine Docker-Images immer auf dem neuesten Stand.
    sudo apt update && sudo apt upgrade -y
    docker compose pull && docker compose up -d # Für deine Docker-Anwendungen
    
  • Starke Passwörter und SSH-Keys: Nutze immer SSH-Keys anstelle von Passwörtern für den Serverzugriff und verwende starke, einzigartige Passwörter für alle Admin-Oberflächen (NPM, Proxmox etc.).
  • Backups: Regelmäßige Backups deiner Daten und Konfigurationen sind Pflicht! Für Proxmox-VMs ist das relativ einfach, aber denk auch an deine Docker-Volumes (z.B. das data-Verzeichnis von NPM).
  • Logging und Monitoring: Schau dir regelmäßig die Logs deiner Container und deines Reverse Proxys an. Tools wie Portainer können dir dabei helfen, einen Überblick zu behalten.

Häufige Fehler und Lösungen

Wer das zum ersten Mal einrichtet, stolpert oft über kleine Dinge. Hier sind ein paar Klassiker:

1. Container kann nicht auf den Forward Hostname zugreifen

  • Problem: Du hast in NPM als "Forward Hostname" die IP-Adresse des Host-Systems oder localhost eingetragen, aber der Container ist nicht erreichbar.
  • Lösung: Innerhalb des Docker-Netzwerks müssen Container über ihren Container-Namen kommunizieren. Wenn dein Dienst in der docker-compose.yml ai-app heißt, dann ist der Forward Hostname in NPM ebenfalls ai-app. Stelle sicher, dass sowohl NPM als auch dein ai-app Container im selben Docker-Netzwerk (hier: web) sind.

2. Let's Encrypt Zertifikat wird nicht ausgestellt

  • Problem: NPM kann kein SSL-Zertifikat von Let's Encrypt abrufen.
  • Lösung:
    • DNS-Eintrag prüfen: Zeigt deine Domain (z.B. ai-app.deinedomain.de) wirklich auf die öffentliche IP-Adresse deines Servers? Nutze dig ai-app.deinedomain.de oder einen Online-DNS-Checker.
    • Port 80/443 offen? Ist der Port 80 auf deinem Router und deiner Server-Firewall (UFW) für eingehenden HTTP-Traffic freigegeben? Let's Encrypt validiert die Domain über Port 80. Port 443 ist für den HTTPS-Zugriff.
    • Rate Limiting: Hast du in kurzer Zeit zu viele Zertifikate für dieselbe Domain angefordert? Let's Encrypt hat Limits. Warte ein paar Stunden und versuche es erneut.
    • NPM Logs: Schau in die Docker-Logs des Nginx Proxy Manager Containers: docker logs nginx-proxy-manager (oder wie dein Container heißt). Dort findest du oft detailliertere Fehlermeldungen.

3. Anwendung ist nach außen erreichbar, aber ohne HTTPS

  • Problem: Du kannst deine Anwendung über http://ai-app.deinedomain.de erreichen, aber nicht über https://, oder es gibt eine Zertifikatswarnung.
  • Lösung:
    • SSL-Zertifikat in NPM: Hast du im "SSL"-Tab des Proxy Host ein Let's Encrypt Zertifikat angefordert und gespeichert?
    • Force SSL aktiviert? Ist die Option "Force SSL" in NPM aktiviert?
    • Browser-Cache: Manchmal hilft es, den Browser-Cache zu leeren oder einen Inkognito-Modus zu verwenden, da der Browser sich alte HTTP-Verbindungen merken kann.
    • Firewall Port 443: Ist Port 443 auf deinem Router und deiner Server-Firewall (UFW) für HTTPS freigegeben?

Fazit und nächste Schritte

Du hast nun eine solide Grundlage für den sicheren Betrieb von KI-Anwendungen in deinem Heimlabor geschaffen. Die Prinzipien der Containerisierung, der isolierten Netzwerke und des sicheren Zugangs über einen Reverse Proxy sind nicht nur für KI-Apps, sondern für nahezu jede Anwendung, die du in deinem Heimlabor betreibst, von entscheidender Bedeutung. Diese Architektur ist robust, wartungsfreundlich und bietet eine gute Angriffsflächenreduzierung.

Was sind die nächsten Schritte? Nun, da die Infrastruktur steht, könntest du:

  • Deine Flask-App durch eine echte KI-Anwendung ersetzen, z.B. ein lokales Large Language Model (LLM) mit Ollama, eine Bildgenerierungs-App mit Stable Diffusion oder eine Spracherkennungssoftware.
  • Deine KI-Anwendung mit anderen Tools in deinem Heimlabor integrieren, z.B. mit n8n für automatisierte Workflows oder mit Home Assistant, um smarte Automatisierungen mit KI-Unterstützung zu realisieren.
  • Die Docker-Compose-Dateien modularisieren, um größere Projekte besser zu verwalten.
  • Dich tiefer in die Netzwerkkonfiguration von Docker einarbeiten, z.B. mit Bridge-Netzwerken oder Macvlan.

Viel Erfolg beim Experimentieren und viel Spaß in deinem sicheren KI-Heimlabor!

Weitere Guides aus "Docker"

Helm im Homelab: Kubernetes-Anwendungen effizient verwalten
Lerne, wie du Kubernetes-Applikationen mit Helm in deinem Homelab oder als Admin effizient verwaltes…
K3s im Homelab: Dein erster Kubernetes-Cluster mit Proxmox
Erfahre, wie du einen schlanken K3s Kubernetes-Cluster in deinem Homelab auf Proxmox-VMs aufsetzt. E…
LGTM im Homelab: Observability mit Grafana, Loki, Tempo, Mimir
Lerne, wie du mit Grafana, Loki, Tempo und Mimir (LGTM) deinen Homelab-Betrieb überwachst, Logs zent…
Super Productivity 18.0 im Homelab mit Docker
Ich zeige dir, wie du Super Productivity 18.0 in deinem Homelab mit Docker betreibst und seine neuen…