Nur noch, was zum Installieren und Betreiben von TESM noetig ist
Entfernt: Tests, Architekturdokumentation und die Serverhaelfte des Lizenzprotokolls. Beides liegt im Entwicklungsrepository alientim/TESM-DEV. Das Lizenzprotokoll ist geteilt. TESM braucht nur die gemeinsame Haelfte (tesm-licensing): Lizenzen verifizieren, Status bewerten, Anfragen stellen, Antworten pruefen. Ausstellen, erneuern, Antworten signieren und Schluesselerzeugung liegen jetzt in tesm-licensing-server und damit ausschliesslich beim Lizenzserver -- ein Client soll den Code zum Ausstellen nicht einmal mitbringen. Nachgeprueft: kein Modul von TESM oder tesm-core importiert eine der verschobenen Funktionen. install.sh installiert entsprechend je Anwendung nur die noetigen Pakete und bricht mit klarer Meldung ab, wenn die verlangte Anwendung nicht im Baum liegt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -5,11 +5,26 @@ Portsteuerung, Neustart (PoE, SSH, RPC), DHCP ueber Kea, Dateifreigaben,
|
||||
Wartung ueber SSH, Protokolle, Papierkorb, verschluesselte Ein- und Ausfuhr und
|
||||
ein SSH-Terminal im Browser.
|
||||
|
||||
Der Lizenzserver liegt in einem eigenen Repository:
|
||||
[alientim/tesm-license](https://gitea.int.eertmoed.net/alientim/tesm-license).
|
||||
Beide teilen sich den Kern (`packages/tesm-core`) und das Lizenzprotokoll
|
||||
(`packages/tesm-licensing`); diese Pakete sind hier mit enthalten, damit sich
|
||||
das Repository allein installieren laesst.
|
||||
**Dieses Repository enthaelt genau das, was zum Installieren und Betreiben von
|
||||
TESM gebraucht wird** -- nichts darueber hinaus:
|
||||
|
||||
```
|
||||
apps/tesm die Anwendung
|
||||
packages/tesm-core gemeinsamer Kern (Anmeldung, Rechte, Sicherung, nginx, ...)
|
||||
packages/tesm-licensing Lizenzprotokoll, Clientseite
|
||||
deploy/ install.sh, update.sh, release.sh, systemd, privilegierter Helfer
|
||||
docs/ Betrieb und Sicherheit
|
||||
```
|
||||
|
||||
Die Serverhaelfte des Lizenzprotokolls (`tesm-licensing-server`: ausstellen,
|
||||
erneuern, Antworten signieren) liegt **nicht** hier. TESM verifiziert Lizenzen
|
||||
und stellt Anfragen; den Code zum Ausstellen soll ein Client nicht einmal
|
||||
mitbringen.
|
||||
|
||||
| Wo sonst noch | |
|
||||
|---|---|
|
||||
| [alientim/tesm-license](https://gitea.int.eertmoed.net/alientim/tesm-license) | der Lizenzserver |
|
||||
| [alientim/TESM-DEV](https://gitea.int.eertmoed.net/alientim/TESM-DEV) | Entwicklung: beide Anwendungen, Tests, Architekturdoku |
|
||||
|
||||
## Zweige
|
||||
|
||||
@@ -20,7 +35,7 @@ das Repository allein installieren laesst.
|
||||
|
||||
---
|
||||
|
||||
## Installation auf einem Server
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
sudo bash deploy/install.sh --app tesm --https
|
||||
@@ -64,41 +79,7 @@ Rollback.
|
||||
|
||||
---
|
||||
|
||||
## Release bauen
|
||||
|
||||
```bash
|
||||
git tag -a v2.0.0 -m "TESM 2.0.0" && git push origin v2.0.0
|
||||
bash deploy/release.sh v2.0.0
|
||||
```
|
||||
|
||||
Heraus kommt `tesm-v2.0.0.tar.gz` samt SHA-256. Der Name kommt aus dem
|
||||
Repository, nicht aus einer festen Zeichenkette.
|
||||
|
||||
---
|
||||
|
||||
## Entwicklung
|
||||
|
||||
```bash
|
||||
python -m venv .venv && . .venv/bin/activate
|
||||
pip install -e packages/tesm-licensing -e packages/tesm-core -e apps/tesm
|
||||
pip install pytest
|
||||
pytest tests -q
|
||||
```
|
||||
|
||||
Ohne gesetzte Umgebungsvariablen legt die Anwendung ihre Daten unter
|
||||
`instance/tesm/` im Arbeitsverzeichnis an -- kein Zugriff auf `/srv` oder
|
||||
`/var/log` noetig.
|
||||
|
||||
```bash
|
||||
TESM_DEBUG=1 flask --app tesm run
|
||||
```
|
||||
|
||||
Im Debug-Modus wird `COOKIE_SECURE` abgeschaltet, sonst kaeme das
|
||||
Sitzungscookie ueber `http://127.0.0.1` nie an.
|
||||
|
||||
---
|
||||
|
||||
## Verwaltung von der Kommandozeile
|
||||
## Betrieb von der Kommandozeile
|
||||
|
||||
```bash
|
||||
sudo -u tesm tesm-admin status # Zustand der Installation
|
||||
@@ -114,13 +95,13 @@ Ein Export des Vorgaengers laesst sich uebersetzen und dann ueber den normalen
|
||||
Import einlesen -- Clients, Switche, Zugangsdaten und die DHCP-Konfiguration:
|
||||
|
||||
```bash
|
||||
tesm-admin convert-legacy tesm_export_20260813_195455.json --dry-run
|
||||
sudo -u tesm tesm-admin convert-legacy tesm_export_20260813_195455.json --dry-run
|
||||
```
|
||||
|
||||
`--dry-run` zeigt nur den Bericht. Ohne die Option entsteht eine Datei im
|
||||
neuen Format, die unter *Verwaltung -> Sicherung* eingelesen wird. Der Bericht
|
||||
nennt ausdruecklich, was **nicht** uebersetzt werden kann (lokale Konten, Rechte,
|
||||
Verzeichnisdienst, Webserver) -- das ist von Hand nachzuziehen.
|
||||
nennt ausdruecklich, was **nicht** uebersetzt werden kann (lokale Konten,
|
||||
Rechte, Verzeichnisdienst, Webserver) -- das ist von Hand nachzuziehen.
|
||||
|
||||
Die Passphrase gehoert an die verdeckte Eingabeaufforderung. `--passphrase`
|
||||
existiert nur fuer Automatisierung: es schreibt sie in Shell-Historie und
|
||||
@@ -128,30 +109,27 @@ Prozessliste.
|
||||
|
||||
---
|
||||
|
||||
## Release bauen
|
||||
|
||||
```bash
|
||||
git tag -a v2.0.0 -m "TESM 2.0.0" && git push origin v2.0.0
|
||||
bash deploy/release.sh v2.0.0
|
||||
```
|
||||
|
||||
Heraus kommt `tesm-v2.0.0.tar.gz` samt SHA-256. Der Name kommt aus dem
|
||||
Repository, nicht aus einer festen Zeichenkette.
|
||||
|
||||
---
|
||||
|
||||
## Dokumentation
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| [docs/ARCHITEKTUR.md](docs/ARCHITEKTUR.md) | Aufbau, Schnitte und die Gruende dafuer |
|
||||
| [docs/SICHERHEIT.md](docs/SICHERHEIT.md) | Anmeldung, Sitzungen, CSRF, Geheimnisse, Rechtetrennung |
|
||||
| [docs/BETRIEB.md](docs/BETRIEB.md) | Installation, Update, HTTPS, Sicherung, Fehlersuche |
|
||||
| [docs/SICHERHEIT.md](docs/SICHERHEIT.md) | Anmeldung, Sitzungen, CSRF, Geheimnisse, Rechtetrennung |
|
||||
|
||||
---
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
pytest tests -q
|
||||
```
|
||||
|
||||
Dazu ein Skript, das **auf dem Zielhost gegen die laufende Installation**
|
||||
spricht -- ueber nginx, gunicorn und echtes TLS. Es wird nicht mitinstalliert
|
||||
(`install.sh` laesst `tests/` aus); bei Bedarf dorthin kopieren. Jeder Lauf legt
|
||||
eigene Datensaetze an, ist also beliebig oft wiederholbar:
|
||||
|
||||
```bash
|
||||
python3 tests/e2e_smoke.py https://host admin 'Passwort'
|
||||
```
|
||||
Aufbau und Entwurfsentscheidungen stehen in `docs/ARCHITEKTUR.md` im
|
||||
Entwicklungsrepository, ebenso die Tests.
|
||||
|
||||
---
|
||||
|
||||
@@ -167,10 +145,10 @@ anders geloest ist. Die wichtigsten:
|
||||
* **Rechte werden serverseitig geprueft**, nicht nur im Template ausgeblendet.
|
||||
* **Die nginx-Site wird bei jedem Lauf inhaltlich verglichen und erneuert.** Ein
|
||||
falscher `alias`-Pfad ueberlebte im Vorgaenger jahrelang jedes Update.
|
||||
* **Jede erzeugte Konfiguration wird vor dem Uebernehmen geprueft** -- nginx wie
|
||||
Kea. Eine fehlerhafte Datei faellt beim Schreiben auf, nicht erst beim
|
||||
naechsten Start des Dienstes.
|
||||
* **Kein Hostname im Lizenz-Fingerabdruck.** Umbenennen brach die Bindung.
|
||||
* **Zwei Installationen stoeren sich nicht** -- eigener `SITE_KEY` fuer
|
||||
nginx-Site, netplan, logrotate, Zertifikate und Sitzungscookie.
|
||||
* **Verschachtelte Datenbankverbindungen sind ein Fehler**, kein Deadlock.
|
||||
* **Jede Konfiguration wird vor dem Uebernehmen geprueft** -- nginx wie Kea.
|
||||
Eine fehlerhafte Datei faellt beim Schreiben auf, nicht erst beim naechsten
|
||||
Start des Dienstes.
|
||||
|
||||
Reference in New Issue
Block a user