morz-infoboard/TECH-STACK.md
2026-03-22 13:06:31 +01:00

4.7 KiB

Info-Board Neu - Tech Stack

Ziel

Dieses Dokument zieht die Technologieentscheidungen verbindlich zusammen, damit sie nicht nur verteilt in Plan und Todo-Liste stehen.

Leitlinien:

  • moeglichst wenige Laufzeitabhaengigkeiten
  • gute Portabilitaet zwischen Raspberry Pi OS und Debian
  • einfache Verteilung per Ansible
  • robuste Offline-Faehigkeit
  • moeglichst wenig Ballast auf den Playern

Verbindliche Entscheidungen

Betriebssysteme

  • Player: aktuelles Raspberry Pi OS Lite auf Debian-13-Basis
  • Server: Debian-artiges System, bevorzugt mit Docker Compose betrieben

Display-Stack auf dem Player

  • Version 1 basiert auf X11
  • keine volle Desktop-Umgebung
  • kein LXDE, kein LightDM als Pflichtbestandteil
  • Chromium laeuft im Kiosk-Modus gegen eine lokale Player-Oberflaeche

Begruendung:

  • X11 ist fuer Chromium-Kiosk auf Raspberry Pi aktuell konservativer und besser vorhersehbar als Wayland
  • weniger Ueberraschungen bei Screenshot-Erzeugung, Display-Steuerung und Watchdog-Verhalten

Programmiersprachen

  • Go ist die bevorzugte Sprache fuer systemnahe Komponenten
  • Go ist die Standardwahl fuer den player-agent
  • Go ist die bevorzugte Sprache fuer das Server-Backend, solange keine zwingenden Gruende dagegensprechen
  • Browser-Oberflaechen werden mit einem normalen Web-Frontend-Stack umgesetzt

Begruendung:

  • statische oder weitgehend selbstgenuegsame Binaries
  • geringe Laufzeitabhaengigkeiten
  • gute Cross-Compile- und Deploy-Eigenschaften
  • passend fuer Debian- und Raspberry-Pi-Umgebungen

Frontend-Stack

  • Admin-UI: Web-Anwendung
  • Tenant-/Monitor-UI: Web-Anwendung
  • Player-UI: lokale Web-Anwendung fuer den Renderer

Noch offen, aber bewusst klein zu halten:

  • Framework-Auswahl fuer Server-UIs, bevorzugt leichtgewichtig
  • keine unnötig schwere Fullstack-Plattform nur aus Gewohnheit

Server-Betrieb

  • zentrale Komponenten bevorzugt in Docker Compose
  • getrennte Services fuer Backend, Datenbank, MQTT und Reverse Proxy
  • persistente Daten ausserhalb fluechtiger Container-Dateisysteme
  • Provisionierungsjobs laufen serverseitig ueber einen dedizierten Worker oder Jobrunner

Player-Betrieb

  • keine Voll-Containerisierung des Grafikpfads in Version 1
  • native systemd-Dienste fuer player-agent und Browser-Startlogik
  • lokale Verzeichnisse fuer Cache, Medien, Status und Logs

Provisionierung und Deployment

  • die technische Erstinstallation neuer Screens wird ueber SSH + Ansible umgesetzt
  • das Admin-Backend ist die steuernde Oberflaeche, aber nicht der Ort fuer eigentliche Shell-Logik
  • Root-Passwoerter dienen nur als Bootstrap-Mittel und sollen nicht dauerhaft gespeichert werden
  • nach der Erstinstallation erfolgt die weitere Verwaltung schluesselbasiert

Zielkomponenten

Player

  • player-agent in Go
  • player-ui als lokale Web-Oberflaeche
  • Chromium als Renderer
  • Xorg-Minimalstack
  • systemd fuer Start, Neustart und Watchdog-Integration

Server

  • Backend-API in Go
  • Admin-UI als Web-Frontend
  • Tenant-UI als Web-Frontend
  • PostgreSQL
  • MQTT-Broker, bevorzugt Mosquitto
  • Reverse Proxy
  • Dateispeicher fuer Uploads, Caches und Screenshots

Kommunikationsstack

  • HTTPS fuer API, Upload, Download, Authentifizierung und Screenshots
  • MQTT fuer Heartbeat, Status, Kommandos und Acknowledgements

Nicht vorgesehen:

  • Medienuebertragung ueber MQTT
  • permanente Spezial-Streams fuer den Regelbetrieb

Laufzeit-Minimum auf dem Player

Anzustreben sind nur diese grossen Bausteine:

  • Raspberry Pi OS Lite
  • Xorg-Minimalstack
  • Chromium
  • eigenes Go-Binary fuer den Agenten
  • systemd

Moeglichst zu vermeiden:

  • komplette Desktop-Umgebungen
  • mehrere externe Viewer wie feh, vlc, wmctrl, xdg-open
  • umfangreiche Python- oder Node-Laufzeitstapel direkt auf dem Player

Build- und Deployment-Richtung

  • Go-Binaries sollen zentral gebaut und per Ansible verteilt werden koennen
  • Konfiguration soll dateibasiert und gut templatisierbar sein
  • Frontend-Artefakte sollen versioniert und reproduzierbar baubar sein

Architekturfolgen aus diesen Entscheidungen

  • der Player bleibt moeglichst nah an einem Appliance-Modell
  • Browserfehler duerfen nicht direkt die eigentliche Logik bestimmen
  • Renderer und Systemlogik bleiben getrennt
  • Serverlogik ist zentralisiert, Playerlogik minimal und robust

Bewusst vertagte Entscheidungen

  • moeglicher spaeterer Wechsel auf Wayland
  • exakte Frontend-Framework-Wahl
  • genaue Auspraegung des Build-Systems fuer Frontend-Artefakte
  • eventuelle Objekt-Storage-Einfuehrung statt einfachem Dateispeicher

Aktueller technischer Grundsatz

Wenn zwei Varianten funktional gleichwertig sind, wird die Variante mit weniger Laufzeitabhaengigkeiten, einfacherem Deployment und besserem Offline-Verhalten bevorzugt.