# Betrieb: Watchdog-Überwachung & LicenseLabrador-Lizenzierung Beide Integrationen sitzen im `Predictalytics.WinFormsHost` (dem Produktiv-Host) und binden zwei eigenständige Schwester-Projekte an: | Projekt | Pfad | Rolle | |---|---|---| | Watchdog | `J:\Softwareprojekte\WatchDog` | PHP/MySQL-Server auf `watchdog.mhdf.de`, empfängt Heartbeats | | LicenseLabrador | `J:\Softwareprojekte\LicenseLabrador` | PHP-Lizenzserver auf `license.mhdf.de` + C#-SDK | --- ## 1. Watchdog (Dead-Man's-Switch) `Services/WatchdogHeartbeatService.cs` sendet alle *n* Sekunden einen `POST /api/heartbeat` an den Watchdog. Bleiben die Heartbeats aus — weil die App abgestürzt ist oder die ganze Maschine weg ist — schlägt der Watchdog Alarm. Beim regulären Schließen geht ein `POST /api/event` mit `kind=stopping` raus, damit ein geplantes Beenden nicht als Crash alarmiert wird. **Wichtig:** Ein Ausfall des Watchdogs darf Predictalytics nie beeinträchtigen. Alle Aufrufe sind best effort; der erste Fehlschlag wird als Warnung geloggt, Folgefehler nur noch auf Debug-Level (keine Log-Flut). ### Konfiguration (PropertyGrid im Host, Kategorie „Watchdog") | Feld | Default | Bedeutung | |---|---|---| | `Enabled` | `true` | Heartbeats an/aus | | `Server URL` | `https://watchdog.mhdf.de` | Basis-URL | | `API Key` | *(leer)* | `X-Watchdog-Key` — Shared Key **oder** Agent-Token. Ohne Key passiert nichts. | | `Source` | `predictalytics` | Monitor-Name im Dashboard (Auto-Registrierung beim ersten Beat) | | `Instance` | `default` | falls mehrere Instanzen laufen | | `Interval (Sekunden)` | `60` | Sende-Takt; Alarm nach ca. `Intervall × 1,5 + 30 s` | Der Key landet in der `settings.json` neben der Exe (nicht im Git). ### PolyTrader-Maschine mit überwachen Der Heartbeat aus Predictalytics deckt nur *diesen* Prozess ab. Damit auch die Maschine überwacht wird, auf der PolyTrader läuft, gehört dort zusätzlich der OS-Agent hin: `WatchDog\agents\windows\watchdog-agent.ps1` als Scheduled Task (inkl. Shutdown-Hook), bzw. `agents/linux/watchdog-agent.sh` per systemd-Timer. --- ## 2. LicenseLabrador (Kopierschutz) `Services/LicenseGuard.cs` prüft beim Start, ob eine nutzbare Lizenz vorliegt (`Program.Main` bricht sonst ab, bevor die MainForm überhaupt entsteht). Ohne gültige Lizenz erscheint `Services/LicenseDialog.cs` zur Key-Eingabe. Produkt-Slug, Endpoint und der Ed25519-Public-Key sind **bewusst einkompiliert** und nicht konfigurierbar — ein einstellbarer Endpoint würde erlauben, die App auf einen gefälschten Lizenzserver zu zeigen. - **Produkt-Slug:** `predictalytics` - **Offline-Gnadenfrist:** 168 h (7 Tage) — danach ist Serverkontakt nötig - **Revalidierung zur Laufzeit:** alle 12 h; bei Widerruf/Ablauf beendet sich die App - **Härtung:** `VerifyChecksum` (HMAC über State + Key + Hardware-ID) gegen Memory-Patches; Nonce-Reflexion und Signaturprüfung übernimmt das SDK ### Einmalige Server-Schritte 1. Im Admin-Backend von `license.mhdf.de` das Produkt mit Slug **`predictalytics`** anlegen (ohne den Eintrag liefert der Server `not_found`). 2. Lizenzschlüssel ausstellen und beim ersten Start im Dialog eingeben. 3. Prüfen, dass der einkompilierte Public Key in `LicenseGuard.PublicKeyBase64` dem `signing.pub` des Servers entspricht. ### Deaktivierung bei PC-Wechsel `LicenseClient.DeactivateAsync()` gibt die Aktivierung wieder frei. Aktuell nicht in der UI verdrahtet — bei Bedarf als Menüpunkt ergänzen.