Watchdog-Heartbeat + LicenseLabrador-Lizenzgate im WinFormsHost
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>
This commit is contained in:
co-authored by
Claude Fable 5
parent
02c5a4d6f4
commit
3a82397651
@@ -0,0 +1,74 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user