Bindet die beiden neuen Betriebsprojekte an: - WatchdogHeartbeatService: periodischer POST /api/heartbeat an watchdog.mhdf.de (Dead-Man's-Switch), stopping-Event beim Beenden, Konfiguration ueber AppSettings-Kategorie "Watchdog". Fehler sind best effort und beeintraechtigen die App nie. - LicenseGuard + LicenseDialog: Lizenzpruefung vor dem Start der MainForm, 12h-Revalidierung zur Laufzeit, Checksum-Haertung. Produkt-Slug/Endpoint/Public-Key sind einkompiliert. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.4 KiB
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
- Im Admin-Backend von
license.mhdf.dedas Produkt mit Slugpredictalyticsanlegen (ohne den Eintrag liefert der Servernot_found). - Lizenzschlüssel ausstellen und beim ersten Start im Dialog eingeben.
- Prüfen, dass der einkompilierte Public Key in
LicenseGuard.PublicKeyBase64demsigning.pubdes 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.