Files
BauIN/docs/server-anforderungen.md
ChristophandClaude Opus 5.5 ca09d23a78 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>
2026-10-05 08:25:30 +02:00

133 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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