1. Ziel
Ein Container („RAG-API“) stellt eine Weboberfläche bereit, über die:
-
Dokumente hochgeladen werden (PDF/DOCX/TXT/HTML),
-
die Inhalte gechunked + embedded werden,
-
die Vektoren in Qdrant gespeichert werden,
-
Nutzer anschließend Fragen stellen können (RAG-Antwort mit Quellenangaben).
2. Überlegung zur Architektur
Container/Services:
-
rag-api (FastAPI): Web-UI + REST-API (/upload, /ask, /evaluate/*, /health)
-
qdrant: Vektor-Datenbank
-
reranker: optionaler Re-Ranker für bessere Trefferqualität
-
ollama: LLM-Runtime (läuft separat im ai-chat Stack, aber via Netzwerk erreichbar)
Exponierte Ports (intern):
Externer Zugriff: über NGINX Reverse Proxy (z.B. https://homecpt/rag/…), nicht direkt auf Containerports.
3. Installation (Docker Compose)
-
/opt/RAG-Datenschutz/docker-compose.yml
-
/opt/RAG-Datenschutz/rag-api/ (FastAPI Code + Dockerfile)
-
/opt/RAG-Datenschutz/reranker/ (Reranker Code + Dockerfile)
-
/opt/RAG-Datenschutz/data/ (persistente Daten: Qdrant + State + Uploads/PDFs)
Die Compose-Datei definiert die Services und Volumes. Relevant für das Playbook sind v.a.:
-
build: ./rag-api (eigener API-Container)
-
volumes: für Persistenz (State/Uploads/Qdrant Storage)
-
ports: nur dort, wo benötigt
-
networks: Verbindung ins gemeinsame llm-net, damit rag-api Ollama per http://ollama:11434 erreicht
Warum so gewählt:
-
Persistenz: Index, Uploads, State müssen Reboots/Updates überleben.
-
Netz-Isolation: Qdrant nicht öffentlich, nur rag-api erreichbar.
-
Service-Kopplung: rag-api hängt im llm-net, um Ollama via Servicename zu erreichen.
4. Installation der Docker - Vorüberlegungen
4.1 Start eines Docker (Beispiel RAG-Datenschutz)
cd /opt/RAG-Datenschutz
docker compose up -d
docker compose ps
4.2 Nach Codeänderung
cd /opt/RAG-Datenschutz
docker compose build rag-api
docker compose up -d --force-recreate rag-api
4.3 Internes Dockernetzwerk
Damit alle Docker intern schnell und sauber kommunizieren können, habe ich ein Docker-Netz (llm-net) geschaffen
rag-api hängt im llm-net, damit OLLAMA_BASE_URL=http://ollama:11434 per DNS/Service-Name funktioniert.
Warum: kein Hardcoding von IPs, sauberer interner Service-Lookup.
5. Installation
5.1 Wenn noch alte Versionen bestehen dann:
sudo apt remove docker docker-engine docker.io containerd runc
5.2 Neue Docker einrichten
sudo apt update
sudo apt install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
und installieren:
Repository hinzufügen:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
und installieren
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
5.3 Starten und Autostart
sudo systemctl start docker
sudo systemctl enable docker
Ist alles da?
sudo systemctl status docker
5.4 NVIDIA GPU Runtime für LLM
War bei mir schon vorhanden, wenn nicht, dann folgendes durchführen
5.4.1 Toolkit installieren
sudo apt install nvidia-container-toolkit -y
5.4.2 Docker konfigurieren
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
und Test:
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
Achtung: Versionsnummer von cuda kann sich ändern.
5.4.3 Dockernetzerk aufziehen
Dazu habe in der Datei
docker-composer.yml in jedem Docker ergänzt:
networks:
llm-net:
external: true
und Testen:
docker network ls
Sollte das Netzwerk nicht auftauchen, dann:
docker network create llm-net
Sollte es immer noch nicht vorhanden sein, dann:
docker network create llm-net
docker compose up -d
5.5 Prüfen ob GPU erkannt wird
nvidia-smi
Wenn nicht, dann:
sudo apt install nvidia-container-toolkit -y
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
und testen:
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
6 Zusammenfassung
Docker wurde als Container-Orchestrierungsplattform installiert, um eine reproduzierbare, isolierte und versionierte Bereitstellung der KI- und RAG-Dienste zu ermöglichen.
Das dedizierte Docker-Netzwerk
llm-net wurde erstellt, um eine interne, dienstbasierte Kommunikation zwischen LLM (Ollama), RAG-API und Vektor-Datenbank (Qdrant) sicherzustellen, ohne direkte Exposition dieser Dienste auf Host-Ebene.
Anfänglich vergaß ich die Datei x.yml abzuspeichern und neu zu erstellen. Dann zieht er das interne Netzwerk nicht ordentlich durch und es kommt zu Fehlern, die ich anfänglich nicht erkannte, da eigentlich kein Fehler vorlag.
Es kommt immer wieder vor, dass die Docker die Verbindung zu cuda verlieren. Einfach Neustarten und es geht in der Regel wieder. Warum das so ist, habe ich bisher noch nicht herausgefunden.