177 lines
7.8 KiB
Markdown
177 lines
7.8 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:
|
|
|
|
```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.
|