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>
75 lines
3.4 KiB
Markdown
75 lines
3.4 KiB
Markdown
# 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.
|