Ergaenze Player- und Serverkonzept
This commit is contained in:
parent
ceaecaa234
commit
3dc82bf4f7
6 changed files with 599 additions and 0 deletions
|
|
@ -17,6 +17,8 @@ Die Trennung von `/srv/docker/infoboard-netboot` ist sinnvoll, damit:
|
|||
- Technologieentscheidungen: `TECH-STACK.md`
|
||||
- Template-/Kampagnenkonzept: `docs/TEMPLATE-KONZEPT.md`
|
||||
- Provisionierungskonzept: `docs/PROVISIONIERUNGSKONZEPT.md`
|
||||
- Player-Konzept: `docs/PLAYER-KONZEPT.md`
|
||||
- Server-Konzept: `docs/SERVER-KONZEPT.md`
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
|
|
|
|||
8
ansible/README.md
Normal file
8
ansible/README.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# Ansible
|
||||
|
||||
Hier liegen spaeter Rollen, Playbooks und Inventories fuer:
|
||||
|
||||
- Erstinstallation neuer Screens
|
||||
- Updates bestehender Screens
|
||||
- Server-Deployment
|
||||
- Display-spezifische Konfigurationen
|
||||
299
docs/PLAYER-KONZEPT.md
Normal file
299
docs/PLAYER-KONZEPT.md
Normal file
|
|
@ -0,0 +1,299 @@
|
|||
# Info-Board Neu - Player-Konzept
|
||||
|
||||
## Ziel
|
||||
|
||||
Der Player ist eine moeglichst schlanke Display-Appliance fuer Raspberry Pi OS Lite.
|
||||
|
||||
Er soll:
|
||||
|
||||
- Bilder, Videos, PDFs und Webseiten anzeigen
|
||||
- globale Kampagnen, tenantbezogene Playlists und Fallback sauber priorisieren
|
||||
- bei Serverausfall autonom weiterlaufen
|
||||
- per MQTT steuerbar sein
|
||||
- per Ansible einfach ausrollbar sein
|
||||
- moeglichst wenige Laufzeitabhaengigkeiten haben
|
||||
|
||||
## Leitprinzip
|
||||
|
||||
Chromium ist nur Renderer, nicht Steuerzentrale.
|
||||
|
||||
Das bedeutet:
|
||||
|
||||
- Chromium zeigt nur die lokale `player-ui`
|
||||
- die `player-ui` entscheidet, was angezeigt wird
|
||||
- der `player-agent` verwaltet Sync, Cache, Kommandos und Status
|
||||
- externe URLs werden nie unkontrolliert direkt als Hauptbrowserziel verwendet
|
||||
|
||||
## Komponenten
|
||||
|
||||
### `player-agent`
|
||||
|
||||
Implementierung:
|
||||
|
||||
- bevorzugt in `Go`
|
||||
- als einzelnes Binary auslieferbar
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Registrierung beim Server
|
||||
- Abruf von Konfiguration, Playlist, Kampagne und Medienmanifest
|
||||
- lokaler Mediencache
|
||||
- MQTT-Kommunikation
|
||||
- Heartbeat und Statusmeldungen
|
||||
- Screenshot-Erzeugung
|
||||
- Ausfuehrung von Admin-Kommandos
|
||||
- Ueberwachung von Chromium und `player-ui`
|
||||
|
||||
### `player-ui`
|
||||
|
||||
Implementierung:
|
||||
|
||||
- lokale Web-Anwendung
|
||||
- von Chromium im Kiosk dargestellt
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Playlist-Logik lokal darstellen
|
||||
- Prioritaet `campaign > tenant_playlist > fallback` umsetzen
|
||||
- Bilder, Videos, PDFs und Webseiten anzeigen
|
||||
- Lade-Timeouts und Fehlerpfade umsetzen
|
||||
- Offline-/Degraded-Overlay anzeigen
|
||||
- Renderer-seitige Healthchecks liefern
|
||||
|
||||
### Chromium
|
||||
|
||||
Aufgabe:
|
||||
|
||||
- reine Darstellung der lokalen `player-ui`
|
||||
|
||||
Vorgaben:
|
||||
|
||||
- Kiosk-Modus
|
||||
- Vollbild
|
||||
- moeglichst ohne weitere Browser-Interaktion
|
||||
- Neustart durch systemd/Watchdog erlaubt
|
||||
|
||||
## Laufzeitmodell
|
||||
|
||||
## Startreihenfolge
|
||||
|
||||
1. Basis-System bootet
|
||||
2. X11-Minimalstack startet
|
||||
3. `player-agent` startet
|
||||
4. `player-ui` ist lokal erreichbar
|
||||
5. Chromium startet auf lokaler URL
|
||||
6. Agent fuehrt ersten Sync und Registrierungsablauf aus
|
||||
|
||||
## Lokaler Zustand
|
||||
|
||||
Der Player haelt lokal vor:
|
||||
|
||||
- aktuelle Konfiguration
|
||||
- letzte gueltige Playlist
|
||||
- letzte gueltige Kampagne
|
||||
- lokales Medienmanifest
|
||||
- heruntergeladene Medien
|
||||
- Status-/Snapshot-Metadaten
|
||||
|
||||
Empfohlene Pfade:
|
||||
|
||||
- `/etc/signage/config.yml`
|
||||
- `/var/lib/signage/cache/`
|
||||
- `/var/lib/signage/media/`
|
||||
- `/var/lib/signage/state/`
|
||||
- `/var/log/signage/`
|
||||
|
||||
## Inhaltsprioritaet
|
||||
|
||||
Die Anzeigeentscheidung erfolgt immer in dieser Reihenfolge:
|
||||
|
||||
1. aktive globale Kampagne fuer diesen Screen
|
||||
2. normale tenantbezogene Playlist
|
||||
3. lokaler Fallback aus dem konfigurierten Verzeichnis
|
||||
|
||||
### Kampagnenmodus
|
||||
|
||||
Wenn eine gueltige Kampagne fuer den Screen aktiv ist:
|
||||
|
||||
- zeigt der Player nur den Kampagneninhalt
|
||||
- der Firmencontent wird temporär uebersteuert
|
||||
- nach Ablauf oder Deaktivierung springt der Player automatisch zurueck
|
||||
|
||||
### Tenant-Playlist-Modus
|
||||
|
||||
Wenn keine Kampagne aktiv ist:
|
||||
|
||||
- wird die tenantbezogene Playlist ausgewertet
|
||||
- nur aktive und zeitlich gueltige Elemente werden angezeigt
|
||||
|
||||
### Fallback-Modus
|
||||
|
||||
Wenn weder Kampagne noch gueltige Playlist-Inhalte verfuegbar sind:
|
||||
|
||||
- werden alle Dateien aus dem Fallback-Verzeichnis nacheinander angezeigt
|
||||
|
||||
## Medientypen
|
||||
|
||||
### Bild
|
||||
|
||||
- lokal oder aus Cache
|
||||
- Anzeige fuer definierte Dauer
|
||||
|
||||
### Video
|
||||
|
||||
- lokal oder aus Cache
|
||||
- entweder feste Dauer oder bis Medienende
|
||||
|
||||
### PDF
|
||||
|
||||
- lokal oder aus Cache
|
||||
- Anzeige ueber Browser/PDF-Renderer
|
||||
|
||||
### Webseite
|
||||
|
||||
- live geladen oder kontrolliert zwischengespeichert
|
||||
- immer mit `load_timeout`
|
||||
- nie rohe Browser-Fehlerseite dauerhaft stehen lassen
|
||||
|
||||
## Fehlerverhalten
|
||||
|
||||
### Grundregeln
|
||||
|
||||
- Fehler eines einzelnen Items duerfen den Player nicht blockieren
|
||||
- jeder Fehler fuehrt zu `retry`, `skip` oder `fallback`
|
||||
- haengende Browserfehlerseiten muessen aktiv verhindert werden
|
||||
|
||||
### Typische Fehlerfaelle
|
||||
|
||||
- Medium fehlt lokal
|
||||
- externe URL nicht erreichbar
|
||||
- PDF fehlerhaft
|
||||
- Video unlesbar
|
||||
- Webseite liefert 404/500 oder timeout
|
||||
|
||||
### Reaktion
|
||||
|
||||
- Fehler loggen
|
||||
- Status aktualisieren
|
||||
- ggf. Overlay auf `degraded`
|
||||
- zum naechsten Element wechseln oder definierte Retry-Logik ausfuehren
|
||||
|
||||
## Offline-Verhalten
|
||||
|
||||
Offline-Betrieb ist Standardfall, nicht Sonderfall.
|
||||
|
||||
Wenn der Server nicht erreichbar ist:
|
||||
|
||||
- laeuft die Wiedergabe lokal weiter
|
||||
- letzte gueltige Daten bleiben aktiv
|
||||
- Overlay zeigt den Verbindungszustand an
|
||||
- Heartbeats und Status koennen lokal zwischengespeichert oder spaeter aktualisiert werden
|
||||
|
||||
## Overlay-Konzept
|
||||
|
||||
Das Overlay soll klein und unaufdringlich sein.
|
||||
|
||||
Zustaende:
|
||||
|
||||
- `online`
|
||||
- `degraded`
|
||||
- `offline`
|
||||
|
||||
Moegliche Anzeige:
|
||||
|
||||
- kleines Symbol in Ecke
|
||||
- optional Text wie `offline - letzter Sync vor 2h`
|
||||
|
||||
## Orientierung und Display-Konfiguration
|
||||
|
||||
Jeder Screen hat:
|
||||
|
||||
- fachliche Orientierung: `portrait` oder `landscape`
|
||||
- technische Rotation: `0`, `90`, `180`, `270`
|
||||
|
||||
Diese Werte beeinflussen:
|
||||
|
||||
- Chromium-Startkonfiguration
|
||||
- X11-/Display-Setup
|
||||
- Asset-Auswahl bei Kampagnen
|
||||
- Darstellung in der `player-ui`
|
||||
|
||||
## Watchdogs
|
||||
|
||||
### Agent-Watchdog
|
||||
|
||||
- systemd Restart-Strategie
|
||||
- eigener Healthcheck fuer Sync und Broker-Verbindung
|
||||
|
||||
### Renderer-Watchdog
|
||||
|
||||
- Ueberwachung von Chromium
|
||||
- Erkennung haengender Darstellungen
|
||||
- geordneter Neustart bei Freeze oder Crash
|
||||
|
||||
## Screenshots und Status
|
||||
|
||||
Der Player erzeugt Screenshots:
|
||||
|
||||
- bei Item-Wechsel
|
||||
- zyklisch
|
||||
- auf Admin-Anforderung
|
||||
|
||||
Der Player meldet Status:
|
||||
|
||||
- aktuelles Item
|
||||
- Quelle (`campaign`, `tenant_playlist`, `fallback`)
|
||||
- Fehlerstatus
|
||||
- letzter Sync
|
||||
- Heartbeat
|
||||
|
||||
## MQTT-Kommandos auf dem Player
|
||||
|
||||
Mindestens zu unterstuetzen:
|
||||
|
||||
- `reload`
|
||||
- `restart_player`
|
||||
- `reboot`
|
||||
- `display_on`
|
||||
- `display_off`
|
||||
- `refresh_snapshot`
|
||||
- `clear_cache`
|
||||
|
||||
## Minimaler Paketbedarf
|
||||
|
||||
Auf dem Player anzustreben:
|
||||
|
||||
- Raspberry Pi OS Lite
|
||||
- Xorg-Minimalstack
|
||||
- Chromium
|
||||
- eigenes Go-Binary
|
||||
- systemd
|
||||
|
||||
Vermeiden:
|
||||
|
||||
- LXDE/LXQt
|
||||
- LightDM, wenn nicht zwingend noetig
|
||||
- mehrere externe Viewer
|
||||
- schwergewichtige Laufzeitstapel auf dem Geraet
|
||||
|
||||
## Zielstruktur im Repo
|
||||
|
||||
Empfohlene Unterstruktur fuer den Player:
|
||||
|
||||
- `player/agent/`
|
||||
- `player/ui/`
|
||||
- `player/systemd/`
|
||||
- `player/config/`
|
||||
- `player/scripts/`
|
||||
|
||||
## Testfaelle fuer den Player
|
||||
|
||||
- lokaler Start ohne Server
|
||||
- späterer Verbindungsaufbau zum Server
|
||||
- Wechsel zwischen Kampagne, Playlist und Fallback
|
||||
- kurzer Netzverlust
|
||||
- kaputte Web-URL
|
||||
- defektes PDF
|
||||
- Neustart von Chromium
|
||||
- Screenshot-Erzeugung
|
||||
- Rotation/Portrait/Landscape
|
||||
269
docs/SERVER-KONZEPT.md
Normal file
269
docs/SERVER-KONZEPT.md
Normal file
|
|
@ -0,0 +1,269 @@
|
|||
# Info-Board Neu - Server-Konzept
|
||||
|
||||
## Ziel
|
||||
|
||||
Der Server ist die zentrale Steuer- und Verwaltungsinstanz der Plattform.
|
||||
|
||||
Er soll:
|
||||
|
||||
- Benutzer, Firmen und Screens verwalten
|
||||
- Medien und Playlists bereitstellen
|
||||
- globale Templates und Kampagnen steuern
|
||||
- Provisionierung neuer Screens ausloesen
|
||||
- Status, Screenshots und Heartbeats sammeln
|
||||
- MQTT und HTTPS sauber trennen
|
||||
|
||||
## Grundprinzip
|
||||
|
||||
Der Server ist die Quelle der fachlichen Wahrheit.
|
||||
|
||||
Der Player bleibt trotzdem lauffaehig, wenn der Server temporaer nicht erreichbar ist.
|
||||
|
||||
Das bedeutet:
|
||||
|
||||
- Server verwaltet Konfiguration und Inhalte zentral
|
||||
- Player fuehrt lokal und robust aus
|
||||
- Server sendet Steuerimpulse, Player synchronisiert aktiv nach
|
||||
|
||||
## Hauptkomponenten
|
||||
|
||||
### Reverse Proxy
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- TLS-Terminierung
|
||||
- Routing fuer API und Web-UIs
|
||||
- optionale Auth-/Header-Regeln
|
||||
|
||||
### Backend-API
|
||||
|
||||
Bevorzugte Sprache:
|
||||
|
||||
- `Go`
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Authentifizierung und Autorisierung
|
||||
- CRUD fuer Tenants, Users, Screens, Medien, Playlists
|
||||
- Verwaltung globaler Templates und Kampagnen
|
||||
- Player-Sync-Endpunkte
|
||||
- Speicherung von Status und Screenshots
|
||||
- Start von Provisionierungsjobs
|
||||
|
||||
### Admin-UI
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Gesamtübersicht aller Screens
|
||||
- Vorschau und Status
|
||||
- Template-/Kampagnenverwaltung
|
||||
- Kommandos und Provisionierung
|
||||
|
||||
### Tenant-UI
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Uploads und Medienverwaltung pro Firma
|
||||
- Pflege der monitorbezogenen Playlist
|
||||
- Vorschau des eigenen Screens
|
||||
|
||||
### Datenbank
|
||||
|
||||
Empfehlung:
|
||||
|
||||
- PostgreSQL
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Speicherung fachlicher Daten
|
||||
- Status, Jobs, Revisionen, Zuordnungen
|
||||
|
||||
### MQTT-Broker
|
||||
|
||||
Empfehlung:
|
||||
|
||||
- Mosquitto
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Heartbeats
|
||||
- Statusmeldungen
|
||||
- Events
|
||||
- Kommandos und ACKs
|
||||
|
||||
### Dateispeicher
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Uploads
|
||||
- Screenshots
|
||||
- ggf. serverseitig vorbereitete Medien
|
||||
|
||||
V1:
|
||||
|
||||
- Dateisystem ausreichend
|
||||
|
||||
## Fachliche Bereiche
|
||||
|
||||
## 1. Mandanten und Benutzer
|
||||
|
||||
Der Server trennt:
|
||||
|
||||
- globale Admins
|
||||
- tenantgebundene Nutzer
|
||||
|
||||
Regel:
|
||||
|
||||
- Firmen sehen nur ihren Bereich
|
||||
- Admins sehen alles
|
||||
|
||||
## 2. Screen-Verwaltung
|
||||
|
||||
Der Server kennt jeden Screen mit:
|
||||
|
||||
- ID
|
||||
- Name
|
||||
- Klasse
|
||||
- Orientierung
|
||||
- Rotation
|
||||
- Tenant-Zuordnung
|
||||
- technischem Registrierungsstatus
|
||||
|
||||
## 3. Medienverwaltung
|
||||
|
||||
Der Server verwaltet:
|
||||
|
||||
- Uploads
|
||||
- externe Medienreferenzen
|
||||
- Metadaten
|
||||
- tenant- oder screenspezifische Zuordnung
|
||||
|
||||
## 4. Playlist-Verwaltung
|
||||
|
||||
Der Server verwaltet tenantbezogene Inhalte pro Screen.
|
||||
|
||||
Wichtige Felder:
|
||||
|
||||
- Reihenfolge
|
||||
- Dauer
|
||||
- `valid_from`
|
||||
- `valid_until`
|
||||
- Fehlerstrategie
|
||||
- Cache-Politik
|
||||
|
||||
## 5. Template- und Kampagnenverwaltung
|
||||
|
||||
Der Server stellt den globalen Orchestrierungsbereich bereit.
|
||||
|
||||
Funktionen:
|
||||
|
||||
- Templates erstellen
|
||||
- Szenen pflegen
|
||||
- Zielgruppen waehlen
|
||||
- Kampagnen aktivieren/deaktivieren
|
||||
- Zeitfenster setzen
|
||||
- Uebersteuerung sichtbar machen
|
||||
|
||||
## 6. Provisionierung
|
||||
|
||||
Der Server startet Provisionierungsjobs fuer neue Screens.
|
||||
|
||||
Aufgaben:
|
||||
|
||||
- Eingaben aus Admin-UI entgegennehmen
|
||||
- Job anlegen
|
||||
- Secret-Handling absichern
|
||||
- Worker oder Jobrunner starten
|
||||
- Fortschritt speichern
|
||||
- Fehler sauber rueckmelden
|
||||
|
||||
## API-Bereiche
|
||||
|
||||
Die API soll mindestens diese Domänen haben:
|
||||
|
||||
- `auth`
|
||||
- `tenants`
|
||||
- `users`
|
||||
- `screens`
|
||||
- `media`
|
||||
- `playlists`
|
||||
- `templates`
|
||||
- `campaigns`
|
||||
- `player`
|
||||
- `commands`
|
||||
- `provisioning`
|
||||
|
||||
## Revisionsmodell
|
||||
|
||||
Der Server arbeitet mit Revisionen, damit Player effizient synchronisieren koennen.
|
||||
|
||||
Mindestens:
|
||||
|
||||
- `config_revision`
|
||||
- `playlist_revision`
|
||||
- `media_revision`
|
||||
- `campaign_revision`
|
||||
|
||||
## Status- und Vorschaukonzept
|
||||
|
||||
Der Server speichert:
|
||||
|
||||
- letzten bekannten Heartbeat
|
||||
- letzten Status
|
||||
- letzten Screenshot
|
||||
- aktuelle Inhaltsquelle pro Screen
|
||||
|
||||
Die Admin-UI soll damit erkennen:
|
||||
|
||||
- online/offline
|
||||
- normaler tenantbezogener Betrieb
|
||||
- globale Kampagnen-Uebersteuerung
|
||||
- Fallback-Betrieb
|
||||
- Fehlerzustand
|
||||
|
||||
## Provisionierungsjobrunner
|
||||
|
||||
Die Provisionierung soll nicht direkt in Web-Requests laufen.
|
||||
|
||||
Stattdessen:
|
||||
|
||||
- API legt Job an
|
||||
- dedizierter Worker/Jobrunnner arbeitet ihn ab
|
||||
- Fortschritt wird in DB gespeichert
|
||||
|
||||
## Docker-Compose-Zielbild
|
||||
|
||||
Sinnvolle Komponenten in `compose/`:
|
||||
|
||||
- `reverse-proxy`
|
||||
- `backend`
|
||||
- `postgres`
|
||||
- `mosquitto`
|
||||
- optional `worker`
|
||||
|
||||
## Sicherheitsgrundsaetze
|
||||
|
||||
- Root-Bootstrap-Geheimnisse nur kurzlebig oder referenziert speichern
|
||||
- API- und MQTT-Zugaenge getrennt behandeln
|
||||
- alle Admin-Kommandos auditieren
|
||||
- Tenant-Trennung strikt serverseitig erzwingen
|
||||
|
||||
## Zielstruktur im Repo
|
||||
|
||||
Empfohlene Unterstruktur fuer den Server:
|
||||
|
||||
- `server/backend/`
|
||||
- `server/admin-ui/`
|
||||
- `server/tenant-ui/`
|
||||
- `server/worker/`
|
||||
- `compose/`
|
||||
|
||||
## Testfaelle fuer den Server
|
||||
|
||||
- Tenant sieht nur eigene Daten
|
||||
- Admin sieht alle Daten
|
||||
- Kampagne ueberschreibt tenantbezogenen Content korrekt
|
||||
- Screen-Provisionierung legt Job sauber an
|
||||
- Player-Sync ueber Revisionen funktioniert
|
||||
- MQTT-Kommandos werden protokolliert
|
||||
- Screenshot-Upload erscheint im Admin-Dashboard
|
||||
11
player/README.md
Normal file
11
player/README.md
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
# Player
|
||||
|
||||
Hier liegen spaeter die Komponenten fuer den Screen-Client.
|
||||
|
||||
Geplant:
|
||||
|
||||
- `agent/` fuer den `player-agent`
|
||||
- `ui/` fuer die lokale `player-ui`
|
||||
- `systemd/` fuer Units
|
||||
- `config/` fuer Beispielkonfigurationen
|
||||
- `scripts/` fuer lokale Hilfsskripte
|
||||
10
server/README.md
Normal file
10
server/README.md
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Server
|
||||
|
||||
Hier liegen spaeter die zentralen Server-Komponenten.
|
||||
|
||||
Geplant:
|
||||
|
||||
- `backend/` fuer API und Fachlogik
|
||||
- `admin-ui/` fuer die Admin-Oberflaeche
|
||||
- `tenant-ui/` fuer die Firmenoberflaeche
|
||||
- `worker/` fuer Provisionierungs- und Hintergrundjobs
|
||||
Loading…
Add table
Reference in a new issue