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