# 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 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://:8080` - Router: `http://:8081` - 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://:8081/health ``` 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 Piper weiter; 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. 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-piper-test.mp3 ``` 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 und IQ4_XS Pure für Medium, Large und Ultra 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.