Ausgelagert aus dem TESM-Hauptrepo (srv/tesm-license/, install-license.sh, update-license.sh, zugehoerige systemd-/nginx-Vorlagen) per git-filter-repo, komplette bisherige Historie erhalten. install-license.sh und update-license.sh wurden zu install.sh/update.sh (jetzt die einzigen Skripte in diesem Repo, keine Namenskollision mit TESM mehr noetig). update.sh zeigt jetzt auf dieses eigene Repo/Release-Paket (tesm-license-vX.Y.Z.tar.gz) statt auf das gemeinsame TESM-Paket. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
75 lines
3.1 KiB
Markdown
75 lines
3.1 KiB
Markdown
# TESM-Lizenzserver
|
|
|
|
Master-Lizenzserver für [TESM (TimEShepManager)](https://gitea.int.eertmoed.net/alientim/tesm) —
|
|
verwaltet Kunden und deren Lizenzen, statt Netzwerkgeräte. Ursprünglich als
|
|
Teil des TESM-Hauptrepos gebaut (gleiche Codebasis: Login/Benutzer/Gruppen,
|
|
LDAP/AD, NGINX- und Systemeinstellungen, Live-Log/Verlauf/Auditlog,
|
|
Im-/Export-Grundgerüst, das komplette Rechtesystem) und in dieses eigene
|
|
Repo ausgelagert.
|
|
|
|
**Das Projekt ist ausschließlich für Linux ausgelegt** (Zielsystem: eine
|
|
Linux-VM, identisches Deployment-Muster wie TESM selbst).
|
|
|
|
## Kernfunktionen
|
|
|
|
- **Kunden-/Lizenzübersicht** als Dashboard (Typ, Module, Ablaufdatum,
|
|
Aktivierungsstatus, letzter Heartbeat)
|
|
- **Lizenz-Ausstellung**: Trial/Standard/Custom/Enterprise, frei wählbare
|
|
Gültigkeitsdauer, bei Custom einzeln wählbare Module
|
|
- **Ed25519-signierte Lizenzdateien** (siehe `srv/tesm-license/licensing.py`)
|
|
— dieselbe Datei existiert byte-identisch im TESM-Repo, da Client
|
|
(TESM) und Master (dieses Repo) exakt dasselbe Signier-/
|
|
Verifikationsprotokoll sprechen müssen
|
|
- **Online-Aktivierung/-Deaktivierung/-Heartbeat** über eine schlanke
|
|
JSON-API (`/api/activate`, `/api/deactivate`, `/api/heartbeat`,
|
|
unauthentifiziert per Design — die Signatur der Anfrage selbst ist der
|
|
Berechtigungsnachweis)
|
|
- **Offline-Fallback**: dieselbe Aktivierungs-/Deaktivierungs-/Heartbeat-
|
|
Logik auch als manuell kopierbarer Code für Kunden ohne Netzwerkzugriff
|
|
auf den Lizenzserver
|
|
- **E-Mail-Versand** ausgestellter Lizenzen per Microsoft Graph
|
|
(Client-Credentials-Flow, keine zusätzliche Abhängigkeit) inkl.
|
|
Einrichtungsanleitung und Verbindungstest in der GUI
|
|
- Eigene Bootstrap-Lizenz des Masters selbst (`create_master_license.py`,
|
|
rein lokal, kein externer Super-Master nötig)
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
sudo ./install.sh
|
|
```
|
|
|
|
Richtet System-Pakete, die Flask-App (systemd: `tesm-license.service`)
|
|
sowie nginx als Reverse-Proxy unter `/srv/tesm-license` ein. Erkennt
|
|
selbstständig, ob dort bereits eine Installation existiert, und
|
|
aktualisiert sie entsprechend (In-Place bei unverändertem
|
|
Datenbank-Schema, sonst mit automatischem Backup + Health-Check +
|
|
Rückroll bei Fehlschlag — siehe Kommentarkopf in `install.sh`).
|
|
|
|
Nach der Erstinstallation:
|
|
|
|
```bash
|
|
sudo /srv/tesm-license/venv/bin/python3 /srv/tesm-license/create_admin.py
|
|
sudo /srv/tesm-license/venv/bin/python3 /srv/tesm-license/create_master_license.py
|
|
```
|
|
|
|
## Update (von einem bereits installierten System aus)
|
|
|
|
```bash
|
|
sudo ./update.sh
|
|
# oder für eine bestimmte Version statt "latest":
|
|
TESM_RELEASE_TAG=v1.0.0 sudo -E ./update.sh
|
|
```
|
|
|
|
Lädt das aktuelle Gitea-Release herunter und übergibt an `install.sh`.
|
|
|
|
## Zusammenspiel mit TESM
|
|
|
|
Eine TESM-Instanz aktiviert sich gegen genau einen Lizenzserver
|
|
(`master_endpoint`, in der Lizenzdatei hinterlegt). Ein Protokoll, zwei
|
|
Transportwege: online automatisch per HTTPS/JSON, offline als manuell
|
|
auszutauschender Code — beide Seiten nutzen dieselben Funktionen aus
|
|
`licensing.py`. Details zum kryptografischen Format und Ablauf siehe die
|
|
Docstrings in `srv/tesm-license/licensing.py` bzw. dem identischen Modul
|
|
im [TESM-Repo](https://gitea.int.eertmoed.net/alientim/tesm).
|