Schlüssel-Proxy, Server-Anforderungen und gitleaks-Regel für API-Werk
- tools/ki-proxy: setzt API-Schlüssel aus der Windows-Anmeldeinformationsverwaltung ein, nur im Speicher, ohne Header-Protokoll; Tests gegen Platzhalter-Server - docs/server-anforderungen.md für den ITM-Entwickler - .gitleaks.toml erkennt zki_/zodl_/zocr_-Schlüssel - CLAUDE.md, Plan, Tech-Stack: Schlüssel nie in .env, in der App verschlüsselt in der DB Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
6d6f8f8f27
commit
ca09d23a78
+4
-2
@@ -115,7 +115,7 @@ PW ohne KI = klassische Schätzung; PW mit Claude Code = deine Zeit, wenn Claude
|
||||
| AP0 | Klärung, Kundentermine, Statusberichte, Dokumentation | 1,0 | 0,75 | Du | laufend | – |
|
||||
| AP1 | Fundament: Umgebung ✓, Laravel/TallStackUI ✓, Mehrsprachigkeit ✓; offen: CI, Datenmodell (Mandant, Land, Projekt, PFA, Vertrag, LV, Dokument, Nachtrag, Nachtragsposition), Rollen/Rechte mit Benutzerverwaltung, privater Upload und Download inkl. Massen-Upload, Protokoll, Länderstruktur | 3,0 (+1,0 ✓) | 1,25 | Du + CC | KW 41–42 | Rollenmodell (Kunde) |
|
||||
| AP2 | Meilisearch-Test: Teil 1 mit erzeugten Vektoren, Teil 2 mit echten Vektoren und Referenzfällen | 0,5 | 0,25 | Du + CC | KW 41 / KW 46 | Teil 2: Staging, Referenzfälle |
|
||||
| AP3 | Anbindung KI-API ITM (API-Werk): Dokumentdienst mit Polling, `embed`, `rerank`, `chat` mit Streaming; Ratenbegrenzung (120/min je Schlüssel), begrenzte Wiederholung ohne Doppel-Einreichung, Verbrauchsprotokoll, Überwachung | 1,5 | 0,5 | Du + CC | KW 42 | API-Schlüssel (ITM) |
|
||||
| AP3 | Anbindung KI-API ITM (API-Werk): Dokumentdienst mit Polling, `embed`, `rerank`, `chat` mit Streaming; Ratenbegrenzung (120/min je Schlüssel), begrenzte Wiederholung ohne Doppel-Einreichung, Verbrauchsprotokoll, Überwachung; Schlüssel verschlüsselt in der Datenbank (Verwaltung, nur beschreibbar), in der Entwicklung über den Schlüssel-Proxy ✓ | 1,5 | 0,5 | Du + CC | KW 42 | API-Schlüssel (ITM) |
|
||||
| AP4 | Indexierung und Suche: LV-Positionen und Vorbemerkungen aus GAEB, Texte aus PDFs ohne GAEB → Embeddings → MySQL + Meilisearch; hybride LV-Suche mit Pflichtfilter für Rechte und Suchreihenfolge (Vertrag → PFA → Projekt); Neuaufbau des Index | 2,0 | 1,0 | Du + CC | KW 44–45 | AP3, AP5 |
|
||||
| AP5 | GAEB-Import (X86): Parser, LV-Baum, Vorbemerkungen, LV-Ansicht; PDF-Anzeige (pdf.js lokal) mit Sprung zur Position; Nachtrags-Import (Nachtrags-LV als X86, sonst PDF über OCR) | 2,5 | 1,25 | Du + CC | KW 41 (Test), KW 43–45 | Beispieldateien |
|
||||
| AP6 | Vorprüfung Stufe 1 (ohne Sprachmodell): je Nachtragsposition Fundstellen mit Reranker, Nachtragsübersicht, Prüfmaske, Feedback je Aspekt, Confidence | 2,5 | 1,25 | Du + CC | KW 46–47 | AP4, AP5 |
|
||||
@@ -203,7 +203,9 @@ PDF-Anzeige mit Sprung zur Position, Massen-Upload, Suchreihenfolge über PFAs u
|
||||
**KW 41**
|
||||
- [ ] Fragenkatalog an BauIn (fachlich, IT) und ITM schicken
|
||||
- [ ] Rückmeldung an Claude Design geben (`Rueckmeldung_an_ClaudeDesign_2026-10-02.md`): Prüfmaske v3, Projekt, Nachtrag anlegen, Suche
|
||||
- [ ] Server-Anforderungen an den ITM-Entwickler
|
||||
- [x] Server-Anforderungen an den ITM-Entwickler (`docs/server-anforderungen.md`, noch verschicken)
|
||||
- [x] Schlüssel-Proxy für die Entwicklung (`tools/ki-proxy`), Sperr-Hook für Claude Code, gitleaks-Regel für API-Werk-Schlüssel
|
||||
- [ ] API-Schlüssel in die Windows-Anmeldeinformationsverwaltung eintragen (du), Proxy starten
|
||||
- [ ] API-Schlüssel für die Entwicklung bei ITM anfordern
|
||||
- [ ] **Meilisearch-Test Teil 1** (erzeugte 4.096-dim. Vektoren, z. B. 50.000 Stück):
|
||||
Indexierungszeit, Antwortzeit mit Filtern, RAM und Platte; jeweils ohne und mit binärer Quantisierung
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
# KI-BauIN – Server-Anforderungen (Staging und Produktion)
|
||||
|
||||
Stand: 5. Oktober 2026. Für den ITM-Entwickler, der die Server aufbaut. Hintergründe stehen in
|
||||
`docs/tech-stack.md`, Termine in `docs/projektplan.md`.
|
||||
|
||||
## Überblick
|
||||
|
||||
- **Zwei Umgebungen, gleich aufgebaut:** Staging (Pilot mit BauIn, ab KW 44) und Produktion
|
||||
(ab KW 51). Getrennte Server, getrennte Datenbanken, getrennte API-Schlüssel.
|
||||
- **Ein Server je Umgebung reicht:** Anwendung, MySQL, Meilisearch und Worker laufen auf derselben VM.
|
||||
- **Betrieb nativ**, ohne Docker: Nginx, PHP-FPM, Worker unter systemd, Cron für den Scheduler.
|
||||
- **Die Versionen entsprechen der Entwicklung.** Abweichungen bitte vorher abstimmen.
|
||||
|
||||
## Ausstattung je Server (Vorschlag)
|
||||
|
||||
| | Vorschlag | Anmerkung |
|
||||
|---|---|---|
|
||||
| Betriebssystem | Ubuntu Server 24.04 LTS | Debian 12/13 geht auch |
|
||||
| CPU | 4 vCPU | |
|
||||
| RAM | 16 GB | Meilisearch hält Vektoren mit 4.096 Dimensionen; endgültig nach dem Meilisearch-Test (KW 41) |
|
||||
| Platte | 150 GB SSD, erweiterbar | Daten (MySQL, Uploads, Meilisearch) am besten auf eigenem Volume |
|
||||
| Verschlüsselung | Festplattenverschlüsselung gewünscht | Entscheidung mit BauIn offen |
|
||||
| Zeitzone | Europe/Berlin, NTP aktiv | |
|
||||
|
||||
## Software
|
||||
|
||||
| Paket | Version | Hinweise |
|
||||
|---|---|---|
|
||||
| PHP (FPM und CLI) | 8.5 | Erweiterungen: bcmath, ctype, curl, dom, fileinfo, gd, iconv, intl, mbstring, opcache, openssl, pcntl, pdo_mysql, simplexml, sodium, tokenizer, xml, xmlreader, xmlwriter, zip, zlib |
|
||||
| Composer | 2.x | |
|
||||
| Node.js mit npm | 22 LTS | nur zum Bauen der Oberfläche beim Deployment |
|
||||
| MySQL | 8.4 LTS | utf8mb4 / utf8mb4_unicode_ci, nur auf 127.0.0.1, `max_allowed_packet` mindestens 64M |
|
||||
| Meilisearch | v1.54.2 (fest) | eigener systemd-Dienst, nur auf 127.0.0.1:7700, Master-Key gesetzt, `--no-analytics` |
|
||||
| Nginx | aktuelle Version der Distribution | `client_max_body_size 200M` (ZIP mit LVs), HTTP → HTTPS |
|
||||
| poppler-utils, qpdf | Distribution | Text und Seitenzahlen aus PDFs lesen, große PDFs teilen (Grenze der KI-API: 50 MB) |
|
||||
| git, unzip | Distribution | Deployment aus Gitea |
|
||||
|
||||
## Dienste
|
||||
|
||||
- `php8.5-fpm`: Pool läuft unter einem eigenen Benutzer (Vorschlag `kibauin`).
|
||||
- `nginx`
|
||||
- `mysql`
|
||||
- `meilisearch`: eigener Benutzer, Daten auf dem Datenvolume.
|
||||
- **Worker:** zwei Instanzen `php artisan queue:work database --sleep=3 --tries=3 --max-time=3600`
|
||||
unter systemd, Benutzer `kibauin`, mit automatischem Neustart.
|
||||
- **Scheduler:** Cron-Zeile `* * * * * cd /srv/ki-bauin/current && php artisan schedule:run`.
|
||||
|
||||
Die Vorlagen für den Nginx-Server-Block, die systemd-Units, die Cron-Zeile, das Deploy-Skript und
|
||||
das Backup-Skript liefern wir bis KW 44 im Repository (`deploy/`).
|
||||
|
||||
## Netzwerk
|
||||
|
||||
- **Eingehend:** nur 443 sowie 80 für die Weiterleitung und die Zertifikatsausstellung.
|
||||
SSH nur mit Schlüssel und möglichst nur über VPN oder freigegebene IP-Adressen.
|
||||
- **Zugriff für BauIn:** offen, ob aus dem Internet mit Login und 2FA oder nur über VPN
|
||||
bzw. freigegebene IP-Adressen (Fragenkatalog B2).
|
||||
- **Ausgehend:**
|
||||
- `https://api-werk.de` (KI-API)
|
||||
- der Gitea von ITM (Deployment)
|
||||
- SMTP für Benachrichtigungen
|
||||
- Paketquellen für Updates
|
||||
|
||||
Die Anwendung selbst lädt nichts von fremden Servern.
|
||||
- **MySQL und Meilisearch** sind nur lokal erreichbar.
|
||||
|
||||
## Verzeichnisse
|
||||
|
||||
```
|
||||
/srv/ki-bauin/
|
||||
├── releases/<zeitstempel>/ je Deployment ein Verzeichnis
|
||||
├── current -> releases/… aktive Version (Symlink)
|
||||
└── shared/
|
||||
├── .env Rechte 0600, Besitzer kibauin
|
||||
└── storage/ u. a. storage/app/private = Uploads (nie über Nginx ausliefern)
|
||||
```
|
||||
|
||||
## Konfiguration und Geheimnisse
|
||||
|
||||
- **In `shared/.env`** stehen `APP_KEY`, das Datenbank-Passwort, der Meilisearch-Master-Key und
|
||||
die Mail-Zugangsdaten.
|
||||
- **Die Schlüssel der KI-API stehen nicht in der `.env`.** Sie werden in der Anwendung unter
|
||||
Verwaltung → Einstellungen eingetragen und verschlüsselt in der Datenbank gespeichert. Danach
|
||||
sind sie nur noch beschreibbar, nicht mehr lesbar.
|
||||
- **Der `APP_KEY` muss zusätzlich sicher außerhalb des Servers aufbewahrt werden**, z. B. im
|
||||
Passwortmanager. Ohne ihn lassen sich verschlüsselte Felder aus einem Backup nicht wiederherstellen.
|
||||
|
||||
## Backups (Vorschlag, Entscheidung mit BauIn offen)
|
||||
|
||||
- **Was:** täglich `mysqldump --single-transaction`, dazu `shared/storage/app/private` und
|
||||
`shared/.env`.
|
||||
- **Wie:** vor dem Verlassen des Servers verschlüsseln (z. B. restic), Ziel außerhalb des Servers.
|
||||
- **Aufbewahrung:** z. B. 7 tägliche, 4 wöchentliche, 6 monatliche Stände.
|
||||
- **Meilisearch** wird nicht gesichert, der Index wird aus MySQL neu aufgebaut.
|
||||
- **Restore-Test:** einmal vollständig vor dem Produktivstart (KW 3/2027).
|
||||
|
||||
## Überwachung
|
||||
|
||||
- **Lebenszeichen:** `https://<domain>/up` antwortet mit HTTP 200.
|
||||
- **Worker und Scheduler** melden Lebenszeichen, fehlgeschlagene Jobs werden gezählt. Die
|
||||
Artisan-Befehle dafür liefern wir.
|
||||
- **Alarm per Mail**, wenn die Anwendung, ein Worker oder der Scheduler ausfällt, wenn die Platte
|
||||
zu über 80 % voll ist oder wenn die KI-API nicht erreichbar ist.
|
||||
|
||||
## Deployment
|
||||
|
||||
Ablauf, als Skript geliefert:
|
||||
1. Code aus dem Gitea holen.
|
||||
2. `composer install --no-dev --optimize-autoloader`
|
||||
3. `npm ci && npm run build`
|
||||
4. `php artisan migrate --force`
|
||||
5. Konfiguration, Routen und Views cachen.
|
||||
6. `php artisan queue:restart`
|
||||
7. PHP-FPM neu laden.
|
||||
|
||||
Wer im Betrieb deployt und Updates einspielt, ist noch offen (Fragenkatalog C12).
|
||||
|
||||
## Termine
|
||||
|
||||
| Bis | Was |
|
||||
|---|---|
|
||||
| KW 43 | Staging-Server mit SSH-Zugang und Grundinstallation |
|
||||
| KW 44 | Staging fertig: Domain, Zertifikat, Dienste, erstes Deployment |
|
||||
| KW 51 | Produktionsserver fertig |
|
||||
| KW 3/2027 | Backups und Alarmierung in Produktion, Restore-Test |
|
||||
|
||||
## Offen
|
||||
|
||||
- Standort und Rechenzentrum der Server, Festplattenverschlüsselung
|
||||
- Domain(s) und Zertifikat (Let's Encrypt oder eigenes)
|
||||
- Ziel und Zuständigkeit der Backups
|
||||
- Zugriff für BauIn: Internet oder VPN
|
||||
- SMTP-Server und Absenderadresse
|
||||
+2
-1
@@ -63,10 +63,11 @@ Redis wird nicht eingesetzt: Warteschlange, Cache und Sessions laufen über die
|
||||
| Passkeys | WebAuthn über Fortify | ergänzt |
|
||||
| API-Authentifizierung | – | Sanctum vorerst nicht nötig (keine eigene API) |
|
||||
| Verschlüsselung sensibler Werte | Verschlüsselte Casts, u. a. für Zugangsdaten der KI-API | gleich |
|
||||
| Schlüssel der KI-API | Nie in `.env`: verschlüsselt in der Datenbank, in der Oberfläche nur beschreibbar; in der Entwicklung Schlüssel-Proxy mit Windows-Anmeldeinformationsverwaltung (`tools/ki-proxy`) | ergänzt |
|
||||
| Transport | HTTPS/TLS | gleich |
|
||||
| Formularschutz | CSRF, serverseitige Validierung | gleich |
|
||||
| Protokollierung | Verwaltungsaktionen (Upload, Rechte, Freigaben) und technische Logs | gleich |
|
||||
| Geheimnisse im Code | gitleaks als Pre-Commit-Hook | ergänzt |
|
||||
| Geheimnisse im Code | gitleaks als Pre-Commit-Hook, eigene Regel für API-Werk-Schlüssel (`.gitleaks.toml`) | ergänzt |
|
||||
| Keine externen Ressourcen | Test prüft alle Seiten auf fremde Hosts | ergänzt (Vorgabe „alles lokal“) |
|
||||
|
||||
Rechte werden an den Zugriffswegen und an den auslösenden Aktionen geprüft, zusätzlich bei
|
||||
|
||||
Reference in New Issue
Block a user