Files
alientimandClaude Sonnet 5 a9fc56ff47 Eigenstaendiges Repo: install.sh/update.sh auf tesm-license umgestellt, README + .gitignore
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>
2026-08-23 10:34:53 +02:00

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).