Add LLM compose stack for phy-srv-gpu01 (not deployed yet)

Follows the homelab pattern: ironicbadger.docker_compose_generator v2
renders services/<host>/NN-<stack>/compose.yml templates into
~/docker/compose.yaml on the host.

- 01-vllm: chat model, fixed --gpu-memory-utilization
- 02-embeddings: second vLLM instance (--task embed) rather than a
  separate toolchain, so SM120 support only has to be solved once
- 03-openwebui: Open WebUI + pgvector (not chroma — corpus size)
- 99-network: shared bridge; leading comment keeps networks: top-level
- pin docker_compose_generator to 2.0.1 — galaxy tags mix v1/v2 formats
- group_vars: stack config incl. LDAP placeholders still to be filled

The role only writes the compose file; starting the stack stays manual.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-03 14:53:59 +02:00
co-authored by Claude Opus 4.8
parent 75296ce58c
commit b6b242196d
9 changed files with 280 additions and 12 deletions
@@ -93,24 +93,33 @@ GPU-Server nötig). Zu erheben:
Ergebnis bestimmt: Korpus-Umfang (→ §1-Trigger), OCR-Pipeline ja/nein,
Index-Größe (→ Storage-Check §2.3), Erst-Indexierungsdauer.
**Ergebnis (Lauf 2026-07-14, Skript `scripts/share-analysis.ps1` auf `D:` des
Fileservers Z-FILESERVER):**
**Ergebnis (Lauf 2026-09-03, Skript `scripts/share-analysis.ps1` auf `D:` des
Fileservers Z-FILESERVER; Zahlen ggü. dem Erstlauf 2026-07-14 leicht gewachsen):**
| Kennzahl | Wert | Konsequenz |
|---|---|---|
| Gesamt | **3.322.175 Dateien, 2.224 GB** | Scan lief über `D:` gesamt, nicht je Share → Obergrenze, enthält evtl. nicht freigegebene Daten |
| `office` (extrahierbar) | **1.258.642 Dateien, 587 GB** | **12× über der §1-Schwelle** → Eingrenzung zwingend (§2.6) |
| `other` (unklassifiziert) | 1.575.752 Dateien, 934 GB | größter Block, **noch unidentifiziert**`D-file-types.csv` auswerten |
| Gesamt | **3.338.643 Dateien, 2.231 GB** | Scan lief über `D:` gesamt, nicht je Share → Obergrenze, enthält evtl. nicht freigegebene Daten |
| `office` (extrahierbar) | **1.271.467 Dateien, 591 GB** | **12× über der §1-Schwelle** → Eingrenzung zwingend (§2.6) |
| `other` (unklassifiziert) | 1.576.747 Dateien, 919 GB | größter Block, **noch unidentifiziert**`D-file-types.csv` auswerten |
| Bilder / CAD / Archive / Medien | 403k / 60k / 12,6k / 6,2k Dateien | nicht extrahierbar → Erwartungsmanagement |
| PDFs | **924.076**, davon ~**18 % ohne Textlayer** (Stichprobe 200) | ≈ **166.000 Scan-PDFs → OCR**; eigener Zeit-/GPU-Aufwand, konkurriert mit vLLM |
| PDFs | **935.186**, davon ~**22 % ohne Textlayer** (Stichprobe 200) | ≈ **200.000 Scan-PDFs → OCR**; eigener Zeit-/GPU-Aufwand, konkurriert mit vLLM |
| Änderungsrate | 94 % älter als 1 Jahr; nur ~158k in den letzten 365 Tagen | Sync-Frequenz unkritisch; **Alter ≠ Irrelevanz** (Datenblätter, Normen) → Filter primär ordner-/inhaltsbasiert, Aktualität nur sekundär |
| Duplikat-/Altversions-Muster | 33.179 Dateien | Filterregeln |
| Pfade > 240 Zeichen | 25.169 | Extraktions-Toolchain gezielt testen |
| Nicht-ASCII-Dateinamen | 126.111 | UTF-8 durchgängig (CIFS-Mount-Optionen → Extraktion → Index) |
| Duplikat-/Altversions-Muster | 33.378 Dateien | Filterregeln |
| Pfade > 240 Zeichen | 25.866 | Extraktions-Toolchain gezielt testen |
| Nicht-ASCII-Dateinamen | 126.899 | UTF-8 durchgängig (CIFS-Mount-Optionen → Extraktion → Index) |
**Noch auszuwerten** (CSVs liegen auf dem Fileserver, noch nicht gesichtet):
`D-toplevel-folders.csv` (Größe/Anzahl je Top-Level-Ordner — die Grundlage für
die Include-/Exclude-Liste) und `D-file-types.csv` (Auflösung der `other`-Kategorie).
**Bug im Erstlauf:** Beim Lauf über `D:` wurden **keine CSVs geschrieben**
(`Export-Csv` scheiterte an `D:` im Dateinamen). Behoben am 2026-09-03; für die
Ordner-Aufschlüsselung neu laufen lassen mit:
```powershell
.\share-analysis.ps1 -Paths "D:" -OutDir .\file-analysis -FolderDepth 2
```
`-FolderDepth 2` liefert Größe/Anzahl je `Abteilungen\<Share>` — genau die
Granularität der Freigaben (s. §2.7) und die Grundlage für die Include-/
Exclude-Liste. Ebenfalls auszuwerten: `D-file-types.csv` zur Auflösung der
`other`-Kategorie (1,58 Mio. Dateien, größter unidentifizierter Block).
### 2.2 Mit dem Kunden zu klären (Checkliste) — Stand 2026-09-03
@@ -206,6 +215,36 @@ lautete sinngemäß „unsere Dokumente auslesen". Realistisch ist „ein kurati
Teil unserer Dokumente, dafür mit guten Antworten". Das früh sagen — nicht erst,
wenn der Vollindex schlechte Treffer liefert.
### 2.7 Freigaben-Inventar (Stand 2026-09-03)
`scripts/list-shares.ps1` auf Z-FILESERVER: **30 Freigaben, alle unterhalb `D:`**,
kein DFS. Vorschlag als *Gesprächsgrundlage* — die Zuordnung der Kürzel muss der
Kunde bestätigen, ebenso die endgültige Auswahl:
| Freigabe | Pfad | Vorschlag | Begründung |
|---|---|---|---|
| QM | `D:\Abteilungen\QM` | **rein** | Qualitätsmanagement — Normen, Prüfvorschriften: Kern der Wissensbasis |
| Arbeitssicherheit | `D:\Arbeitssicherheit` | **rein** | Vorschriften, Betriebsanweisungen |
| Competence Center | `D:\Abteilungen\Competence Center` | **rein** | Name deutet auf kuratiertes Wissen |
| EDV | `D:\Abteilungen\EDV` | **rein** | IT-Doku |
| Produktion | `D:\Produktion` | **prüfen** | vermutlich groß; ggf. nur Unterordner mit Doku |
| Projekte | `D:\Projekte` | **prüfen** | vermutlich der größte Block; nur mit Unterordner-Filter sinnvoll |
| Lagerlogistik, Marketing, Kalkulationen, Controlling, Immobilie | div. | **prüfen** | fachlich abhängig, eher zweite Welle |
| AA, AZ, BU, EE, EF, EK, ME, MF, MM, PL, SG, VT | `D:\Abteilungen\*` | **klären** | Abteilungskürzel — Bedeutung und Inhalt vom Kunden bestätigen lassen |
| Zeichnungen | `D:\Abteilungen\Zeichnungen` | **raus** | CAD/Zeichnungen — nicht extrahierbar (s. `cad`/`image` in §2.1) |
| Datenbank | `D:\Datenbank` | **raus** | Datenbank-Dateien, kein Fließtext |
| Tempwork | `D:\Tempwork` | **raus** | temporär, per Definition kein Wissensbestand |
| Benutzer | `D:\Benutzer` | **raus** | persönliche Ablagen — Datenschutz, kein geteiltes Wissen |
| **Personal** | `D:\Abteilungen\Personal` | **raus** | **HR — explizit ausgeschlossen** (§0: „alle sehen alles" gilt nur ohne Personaldaten) |
| **GF** | `D:\Abteilungen\GF` | **raus** | Geschäftsführung — vertraulich |
| **BR** | `D:\Abteilungen\BR` | **raus (klären)** | falls Betriebsrat: besonders schutzwürdig, auf keinen Fall indizieren |
⚠️ **Wichtig:** Weil alle Nutzer alles sehen (§0), ist jede indizierte Freigabe für
alle 25 Nutzer lesbar — unabhängig von den NTFS-Rechten auf dem Fileserver. Die
Ausschlüsse oben sind deshalb keine Kosmetik, sondern die einzige Zugriffskontrolle.
`list-shares.ps1` gibt die NTFS-Gruppen je Freigabe mit aus: Alles, was heute nur
einem eingeschränkten Personenkreis offensteht, gehört **nicht** in den Index.
## 3. Phasen ab Server-Lieferung
| Phase | Inhalt | Ergebnis/Abnahme |