morz-infoboard/docs/PROVISIONIERUNGSKONZEPT.md
2026-03-22 13:35:41 +01:00

314 lines
7.4 KiB
Markdown

# Info-Board Neu - Provisionierungskonzept
## Ziel
Neue Displays sollen aus dem Admin-Backend heraus technisch in Betrieb genommen werden koennen.
Der Workflow soll mindestens leisten:
- neuen Screen fachlich anlegen
- initiale Verbindung per IP und Bootstrap-Zugang herstellen
- SSH-Key fuer dauerhafte Verwaltung hinterlegen
- noetige Komponenten installieren
- Screen-spezifische Konfiguration ausrollen
- Display in lauffaehigen Zustand versetzen
Das Konzept ist ausdruecklich nicht auf 9 Monitore begrenzt. Es muss auch kuenftige Einzelanzeigen wie Vertretungsplan-Displays sauber abbilden.
## Grundprinzip
Die Admin-Oberflaeche ist der Einstiegspunkt, aber die eigentliche Ausbringung erfolgt reproduzierbar ueber einen serverseitigen Provisionierungsjob.
Technische Leitlinie:
- GUI sammelt Eingaben und zeigt Fortschritt
- Backend erzeugt Provisionierungsjob
- Jobrunner fuehrt SSH-/Ansible-Schritte aus
- Ergebnis wird protokolliert und in der UI sichtbar gemacht
Verbindliche Betriebsannahme:
- der Provisionierungs-Worker muss das Zielgeraet per SSH erreichen koennen
- falls die Player in getrennten Netzen stehen, ist ein Jumphost- oder Routing-Konzept erforderlich
- die Provisionierung wird so gebaut, dass ein separater Worker oder Jumphost unterstuetzt wird
## Eingaben fuer einen neuen Screen
Mindestens erforderlich:
- `display_id` bzw. `screen_slug`
- Anzeigename
- Ziel-IP-Adresse
- Bootstrap-Benutzer, Default `root`
- Bootstrap-Passwort oder alternativer Initial-Key
- gewuenschte Orientierung
- optionale Rotation
- Screen-Klasse oder Geraetetyp
- Tenant-Zuordnung, falls direkt bekannt
Optional sinnvoll:
- Aufloesung
- Fallback-Verzeichnis
- Snapshot-Intervall
- Zugehoerigkeit zu Gruppen
- Standortbeschreibung
## Orientierung und Rotationsmodell
Die Ausrichtung ist von Anfang an ein Pflichtfeld.
### Fachliche Orientierung
- `portrait`
- `landscape`
### Technische Rotation
- `0`
- `90`
- `180`
- `270`
Grundregel:
- die Orientierung ist die fachliche Voreinstellung fuer Templates und Layouts
- die Rotation ist die technische Ableitung fuer den Display-Stack auf dem Geraet
Beispiele:
- Infowand-Displays: typischerweise `portrait`
- Vertretungsplan-Displays: typischerweise `landscape`
Diese Werte muessen in Provisionierung, Player-Konfiguration und Kampagnenlogik gleichermassen sichtbar sein.
## Screen-Klassen
Um skalierbar zu bleiben, sollte die Provisionierung mit Klassen oder Profilen arbeiten.
Empfohlene Startklassen:
- `info_wall_display`
- `single_info_display`
- `vertretungsplan_display`
Diese Klassen koennen Defaults liefern fuer:
- Orientierung
- Rotation
- Aufloesung
- Gruppenmitgliedschaften
- Fallback-Verzeichnis
- spezielle UI- oder Template-Voreinstellungen
## Provisionierungsablauf
### 1. Fachliches Anlegen
Im Admin-Backend wird der Screen angelegt mit:
- Name
- ID
- Klasse
- Orientierung
- Tenant-Zuordnung
- Standort
### 2. Start des Provisionierungsjobs
Der Admin gibt die technischen Zugangsdaten fuer die Erstverbindung an.
Wichtig:
- Passwort nur fuer den aktuellen Job verwenden
- keine dauerhafte Klartextspeicherung
### 3. Verbindungsaufbau
Der Jobrunner versucht per SSH die Verbindung herzustellen.
Pruefpunkte:
- Erreichbarkeit
- SSH-Port
- gueltige Zugangsdaten
- Architektur und Betriebssystem grob erkennen
### 4. Bootstrap
Auf dem Zielsystem werden vorbereitet:
- Verwaltungsschluessel installieren
- optional dedizierten Verwaltungsbenutzer anlegen
- Basisverzeichnisse anlegen
- Systemvoraussetzungen pruefen
### 5. Basisinstallation
Installiert werden mindestens:
- noetige Systempakete
- X11-Minimalstack
- Chromium
- Player-Agent
- Player-UI oder deren Artefakte
- systemd-Units
### 6. Screen-Konfiguration
Ausgerollt werden mindestens:
- `screen_id`
- Server-URL
- MQTT-Parameter
- Orientierung und Rotation
- Snapshot-Intervall
- Fallback-Verzeichnis
- Gruppen oder Zielprofile
### 7. Verifikation
Der Job prueft mindestens:
- Dienste laufen
- lokaler Player-Endpunkt ist erreichbar
- Agent registriert sich am Server
- Heartbeat kommt an
- Screenshot oder Statusmeldung funktioniert
### 8. Abschluss
Der Provisionierungsjob wird als erfolgreich markiert und der Screen ist regulär verwaltbar.
## Sicherheitsmodell
### Bootstrap-Geheimnisse
Regeln:
- Root-Passwoerter nicht dauerhaft im Klartext speichern
- wenn Speicherung noetig ist, nur kurzlebig und stark geschuetzt
- besser: nur Referenz auf temporären Secret-Speicher
Verbindliche v1-Loesung:
- separate kurzlebige Secret-Verwaltung
- verschluesselte Speicherung mit App-Key
- automatische Loeschung nach Jobabschluss oder TTL-Ablauf
### Verwaltung nach Erstinstallation
Nach erfolgreicher Provisionierung gilt:
- weitere Verwaltung nur noch per SSH-Key
- der Screen besitzt eine technische Geraeteidentitaet
- API- und MQTT-Zugangsdaten sind geraetebezogen
### Protokollierung
Jeder Provisionierungslauf muss auditierbar sein.
Mindestens sichtbar:
- wer den Job gestartet hat
- wann er gestartet wurde
- fuer welchen Screen
- gegen welche Ziel-IP
- welche Stage aktiv war
- ob Fehler auftraten
## Skalierung ueber die bestehende Wand hinaus
Das Modell muss von Anfang an mit mehreren Geraetetypen umgehen koennen.
### Heute
- 9 Displays in der Infowand, Hochformat
### Perspektivisch
- mindestens 4 zusaetzliche Vertretungsplan-Anzeigen, Querformat
- eventuell weitere Einzelanzeigen
Konsequenz:
- Provisionierung darf nicht implizit von einer 3x3-Wand ausgehen
- Gruppen, Klassen, Orientierung und technische Defaults muessen explizit modelliert werden
## Ansible-Rolle `signage_provision`
Die Provisionierung sollte auf einer eigenen Rolle oder einem eigenen Playbook aufbauen.
Sinnvolle Teilbereiche:
- `bootstrap`
- `base`
- `display`
- `player`
- `verify`
Damit bleibt die Erstinstallation klar getrennt von spaeteren Updates.
## Fehlerfaelle
Der Jobrunner soll Fehler moeglichst frueh und verstaendlich melden.
Typische Fehlerfaelle:
- Host nicht erreichbar
- falsches Passwort
- SSH blockiert
- unpassendes Betriebssystem
- Paketinstallation fehlgeschlagen
- Chromium oder X11 startet nicht
- Player-Agent registriert sich nicht
## Verbindliche Vorgabe fuer den Betrieb
Vor der produktiven Einfuehrung ist umzusetzen oder zu klaeren:
- ob der Server selbst in allen relevanten Player-Netzen steht
- ob ein dedizierter Provisionierungs-Worker in einem passenden Netz benoetigt wird
- ob spaeter mehrere Standorte oder VLANs zu erwarten sind
Zu jedem Fehler soll sichtbar sein:
- Stage
- kurzer Fehlertext
- ob Retry sinnvoll ist
## Zielbild im Admin-Backend
Die UI fuer neue Screens sollte mindestens enthalten:
- Screen anlegen
- Klasse waehlen
- Orientierung waehlen
- Rotation festlegen oder automatisch vorbelegen
- Tenant zuordnen
- IP und Bootstrap-Zugang angeben
- Provisionierungsjob starten
- Fortschritt live oder halb-live sehen
- Erfolg/Fehler mit Details sehen
## Spaetere Erweiterungen
Moegliche Ausbaustufen:
- Provisionierung ohne Passwort nur mit Bootstrap-Key
- Zero-touch-Registrierung ueber vorbereitete Images
- automatische Gruppenzuordnung nach Klasse
- Massenprovisionierung mehrerer Screens
- Neu-Provisionierung oder Rebuild eines bestehenden Screens
## Fazit
Provisionierung ist nicht nur Deployment, sondern ein eigener fachlicher Workflow.
Wesentliche Grundpfeiler sind:
- Admin-gesteuerter Start
- Ansible-/SSH-basierte reproduzierbare Ausbringung
- explizite Orientierung und Rotation pro Screen
- Unterstuetzung fuer Wand-Screens und Einzelanzeigen
- sichere Umstellung von Bootstrap-Zugang auf dauerhafte schluesselbasierte Verwaltung