Files
AI-Profile-Router/docs/INSTALLATION.md
T

183 lines
8.2 KiB
Markdown

# Installation auf einem frischen Debian-Host
Der automatisierte Weg ist `install.sh`. Das Skript ist für **Debian 12/13
amd64** gedacht, installiert Docker CE, den aktuellen Compute-only-NVIDIA-Treiber
mit offenen Kernelmodulen aus dem offiziellen NVIDIA-Repository, das
NVIDIA-Container-Toolkit,
WireGuard, baut llama.cpp reproduzierbar, lädt Modelle mit SHA256-Prüfung und
startet den Stack.
## Vorher klären
1. Die Universität muss den ausgehenden WireGuard-Tunnel erlauben.
2. Heimnetz, Universitätsnetz und Docker-Netz dürfen sich nicht überschneiden.
3. In der Fritzbox eine Konfiguration für **einen einzelnen Client** exportieren.
4. Der Fritzbox-Zugang muss Heimnetz und gewünschten Internetverkehr erlauben.
5. Das private Repository muss auf dem neuen Host lesbar sein.
## Debian installieren
- Debian 13 minimal, amd64, OpenSSH-Server, kein Desktop erforderlich.
- Einen normalen Administrationsbenutzer mit sudo anlegen.
- Optional bei physischem Fremdzugriff: LUKS-Verschlüsselung.
- BIOS: Above 4G Decoding aktiv; beide GPUs sichtbar machen.
## Konfiguration
```bash
git clone <PRIVATE-REPOSITORY-URL> AI-Profile-Router
cd AI-Profile-Router
cp config/install.env.example config/install.env
chmod 600 config/install.env
editor config/install.env
```
Mindestens `ADMIN_USER`, Netzwerkschnittstellen, GPU-Zuordnung und Modellwerte
prüfen. Die Fritzbox-Datei vor dem Start root-only ablegen:
```bash
sudo install -d -m 700 /etc/mike-ai/wireguard
sudo install -m 600 fritz-athena.conf /etc/mike-ai/wireguard/fritz-athena.conf
```
Router- und WebUI-Schlüssel werden lokal erzeugt und nur unter `/etc/mike-ai`
gespeichert. Der Installer gibt keine privaten WireGuard-Werte aus.
## Installation starten
```bash
sudo ./install.sh --config config/install.env
```
Wenn erstmals ein NVIDIA-Treiber installiert wurde, endet das Skript bewusst
mit Code 20. Dann neu starten und denselben Befehl erneut ausführen. Das Skript
ist auf Wiederholung ausgelegt und löscht keine vorhandenen Modelldateien.
Beim ersten Stackstart lädt der interne Piper-Container die konfigurierte
deutsche Stimme in sein persistentes Volume. Dadurch kann seine erste
Bereitschaft je nach Internetverbindung etwas länger dauern.
Der Compose-Start wartet auf einen aktuellen WireGuard-Handshake. API-Schlüssel
werden nicht ausgegeben. Sie liegen root-only unter `/etc/mike-ai`.
## Ergebnis und Abnahme
- Open WebUI: `http://<WIREGUARD-IP>:8080`
- Router: `http://<WIREGUARD-IP>:8081`
- SSH fallback: `ssh root@<WIREGUARD-IP>` (key-only, forwarded to host sshd)
- llama.cpp-WebUI: absichtlich deaktiviert und nicht veröffentlicht
```bash
sudo systemctl status mike-ai-container-vpn-guard
sudo docker inspect -f '{{.State.Health.Status}}' mike-ai-wireguard-gateway
sudo docker compose --env-file /etc/mike-ai/stack.env \
-f /opt/mike-ai/stack/compose.yaml ps
curl http://<WIREGUARD-IP>:8081/health
ssh -o BatchMode=yes root@<WIREGUARD-IP> true
```
Der SSH-Fallback lauscht ausschließlich auf der IPv4-Adresse von `wg0` im
WireGuard-Gateway-Container. Er wird nicht als Docker-Port auf dem
Standort-Interface veröffentlicht. Das Gateway leitet die Verbindung an den
hostseitigen Gateway-Endpunkt des festen `frontend`-Netzes weiter; Anmeldung,
Schlüsselprüfung und Protokollierung erfolgen weiterhin durch den normalen
OpenSSH-Dienst des Hosts.
Die TTS-Verbindung wird für eine frische Open-WebUI-Datenbank automatisch als
OpenAI-kompatibler Audio-Endpunkt des Routers vorbelegt. Der Router reicht sie
intern an das TTS-Gateway weiter. Primär spricht XTTS-v2 mit `Annmarie Nele`
auf der RTX 3060; bei Fehlern oder Queue-Timeout übernimmt Piper auf der CPU.
Der Port 8085 wird nicht am Host veröffentlicht. Ein
Restore setzt zusätzlich die vier persistenten Audiofelder gezielt neu, damit
alte Werte wie `tts-1` oder `coral` die Compose-Vorgaben nicht überstimmen.
`TTS_CODE_SWITCH_ENABLED=false` hält gemischte Antworten als zusammenhängende
deutsche Satzblöcke. Einzelne englische Fachbegriffe werden damit zwar deutsch
ausgesprochen, die Ausgabe bleibt jedoch flüssig und verständlich. Reine
englische Texte erkennt das Gateway weiterhin automatisch. Ein Ende-zu-Ende-Test
ohne Ausgabe des API-Schlüssels:
Für die Sprachausgabe normalisiert das Gateway außerdem Datumsangaben,
Temperaturen, Prozentwerte, Postleitzahlen und Domains. Beispielsweise wird
`22° / 10°` als „Höchstwert 22 Grad, Tiefstwert 10 Grad“ und `wetter.com` als
„Wetter Punkt C O M“ gesprochen. Die deutsche Endung `.de` bleibt natürlich
gesprochen. Die sichtbare Chatantwort wird nicht verändert.
```bash
set -a; source /etc/mike-ai/stack.env; set +a
curl -fsS http://127.0.0.1:8081/v1/audio/speech \
-H "Authorization: Bearer $ROUTER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"piper","voice":"alloy","input":"Hallo von Athena.","response_format":"mp3"}' \
-o /tmp/athena-tts-test.mp3
```
Der beibehaltene API-Name `piper/alloy` ist eine Kompatibilitätsschnittstelle;
bei gesundem XTTS stammt die Ausgabe von `Annmarie Nele`. Der interne Status
des TTS-Gateways nennt `last_backend`, `primary_ready`, `fallback_ready` und
die Zahl der Piper-Rückfälle. Ein Fallback-Test stoppt ausschließlich XTTS,
erzeugt einen synthetischen Satz über denselben Router-Endpunkt und startet
XTTS anschließend wieder. OpenWebUI und Router müssen dafür nicht geändert
oder neu gestartet werden.
Zusätzlich prüfen: Standort-LAN sieht keine KI-Ports; Heimnetz erreicht beide;
gestopptes VPN-Gateway lässt KI-Container nicht ins Internet; jeder Profilwechsel
startet exakt einen llama-Container; Text, Tool Call, Bild und Sprachausgabe funktionieren.
Nach dem ersten Anlegen des OpenWebUI-Administrators werden Filter, Quick
Actions und die vier Arbeitsbereichsmodelle reproduzierbar eingespielt:
```bash
sudo /opt/mike-ai/stack/platform/openwebui/install-filters.sh
sudo /opt/mike-ai/stack/platform/openwebui/install-models.sh
```
Danach sind nur die vier benannten MikeAI-Presets sichtbar; die rohen
Router-Aliase sind ausgeblendet und Medium ist die Standardauswahl. Beide
Skripte sichern die OpenWebUI-Datenbank vor jeder Änderung. Der Modellinstaller
synchronisiert außerdem OpenWebUIs persistente OpenAI-kompatible Verbindung mit
dem internen Router und dessen aktuellem Schlüssel. Das ist erforderlich, weil
persistente Providerwerte nach einer Schlüsselrotation Vorrang vor den
Container-Umgebungsvariablen haben.
Der Modellinstaller setzt außerdem für den ermittelten OpenWebUI-Benutzer das
native Chat-Hintergrundbild `/static/midnight-aurora.svg`. Das Bild wird durch
Compose read-only eingebunden. `custom.css` verändert bewusst nicht mehr die
strukturellen Chat-Layer, damit OpenWebUIs eigene Bildfläche, Kontrast-Overlay
und Mobilansicht funktionieren. Ein bestehender Benutzer kann denselben Wert
auch unter **Einstellungen → Oberfläche → Chat Background Image** ändern.
## Werkzeug-Container
Der Installer startet Websuche automatisch in einem privaten Docker-Netz.
Weitere Bereiche werden nur aktiviert, wenn ihre root-only Konfiguration schon
vorhanden ist:
```text
/etc/mike-ai/homeassistant-admin-mcp.env
/etc/mike-ai/arr-mcp.env
/etc/mike-ai/runraid/.env
/usr/local/bin/runraid Version 0.4.2
```
Nach dem Nachreichen einer Datei genügt:
```bash
sudo /opt/mike-ai/stack/platform/mcp/install-tools.sh
```
Auf einer frischen Open-WebUI-Datenbank werden die internen MCP-Adressen über
`TOOL_SERVER_CONNECTIONS` vorbelegt. Bei einer übernommenen Datenbank müssen
die Einträge einmal unter **Admin-Einstellungen → Externe Werkzeuge** geprüft
oder importiert werden. Die Endpunkte stehen in `platform/mcp/README.md`.
Kein MCP-Port wird auf dem Host veröffentlicht. Externe Clients wie Hermes
benötigen später den authentifizierten WireGuard-Gateway und dürfen nicht
direkt auf das interne Werkzeugnetz zugreifen.
Die Standardkonfiguration lädt IQ4-MIX für Fast, IQ4_XS Pure für Medium,
Large und Ultra sowie Abliterated Q4_K_M für Uncensored aus den dokumentierten Hugging-Face-Repositories. URLs,
Dateinamen und SHA256 stehen vollständig in `config/install.env.example`.
Der Installer lädt jede identische Datei nur einmal und löscht vorhandene
Modelle nicht.
Open-WebUI-Daten liegen in einem Docker-Volume und müssen separat gesichert
werden. Geheimnisse und Chatdaten gehören nie in Git.