morz-infoboard/TODO.md
Jesko Anschütz 585cb83ed0 MQTT-Playlist-Push: Änderungen erreichen Client binnen 5 Sekunden
Backend published auf signage/screen/{slug}/playlist-changed nach
Playlist-Mutationen (2s Debounce). Agent subscribed und fetcht
Playlist sofort (3s Debounce). 60s-Polling bleibt als Fallback.

Neue Packages: mqttnotifier (Backend), mqttsubscriber (Agent)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 11:35:50 +01:00

184 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Info-Board Neu - Umsetzungs-Todo
## Phase 0 - Projektbasis
- [x] Projektverzeichnisstruktur unter `/srv/docker/info-board-neu` festlegen
- [x] Namenskonventionen fuer Server, Player, Rollen und Pakete definieren
- [x] Dokumentationsstruktur fuer Architektur, Betrieb und Deployment anlegen
- [x] Entscheidung fuer Server-Tech-Stack dokumentieren
- [x] Entscheidung fuer Player-Implementierung dokumentieren
- [x] Sprachentscheidung dokumentieren: `Go` als bevorzugte Sprache fuer Agent und moeglichst viele Backend-Komponenten
## Phase 1 - Fachliches Fundament
- [x] Rollenmodell fuer `admin` und monitorgebundene Nutzer final festschreiben
- [x] Datenmodell fuer `tenant`, `screen`, `user`, `media_asset`, `playlist`, `playlist_item`, `screen_status`, `screen_snapshot` definieren
- [x] Playlist-Semantik mit `duration`, `valid_from`, `valid_until`, `load_timeout`, `cache_policy`, `on_error` spezifizieren
- [x] Fallback-Regel fuer ungeplante oder leere Inhalte verbindlich definieren
- [x] Statusmodell fuer Online/Offline/Degraded/Error definieren
- [x] Kommandokatalog fuer Admin-Aktionen finalisieren
- [x] Template- und Kampagnenmodell fuer globale monitoruebergreifende Uebersteuerung finalisieren
- [x] Prioritaetsregel `campaign > tenant_playlist > fallback` verbindlich festschreiben
- [x] Entscheidung dokumentieren, dass `playlist_items.screen_id` entfernt wird
- [x] Entscheidung dokumentieren, dass Gruppen bei Kampagnen serverseitig in Einzel-Assignments expandiert werden
## Phase 2 - Technische Zielarchitektur
- [x] Server-Komponentenliste finalisieren
- [x] API-Schnittstellen grob definieren
- [x] MQTT-Topic-Struktur finalisieren
- [x] HTTPS- und MQTT-Aufgabentrennung dokumentieren
- [x] Screenshot-/Vorschaustrategie spezifizieren
- [x] Offline- und Cache-Strategie bis auf Dateiebene festlegen
- [x] Sicherheitsmodell fuer Uploads, Login und Rechte pruefen
- [x] API fuer Templates, Kampagnen, Aktivierung und Deaktivierung ausarbeiten
- [x] Provisionierungs-Workflow fuer neue Screens technisch durchplanen
- [x] Secret-Handling fuer initiale Root-Passwoerter oder Bootstrap-Zugaenge definieren
- [x] API-Fehlermodell und gemeinsame Fehlerantworten festlegen
- [x] ACK-Timeout-Strategie fuer `device_command` festlegen
- [x] `message_wall`-Rendering serverseitig verbindlich entscheiden
- [x] Netzwerktopologie fuer SSH-basierte Erstprovisionierung als Worker-/Jumphost-faehiges Modell festlegen
## Phase 3 - Player-Design
- [x] Minimalen Paketbedarf fuer den Player auf Raspberry Pi OS Debian 13 ermitteln
- [x] X11-Minimalkonzept fuer Chromium-Kiosk dokumentieren
- [x] Startmechanismus fuer Chromium ohne Desktop-Umgebung definieren
- [x] Verzeichnislayout auf dem Player festlegen
- [x] `player-agent` fachlich zuschneiden
- [x] `player-ui` fachlich zuschneiden (lokale Kiosk-Seite mit Splash + Sysinfo-Overlay)
- [ ] Watchdog-Konzept fuer Browser und Agent definieren
- [x] Offline-Overlay-Verhalten spezifizieren
- [x] Fehlerbehandlung fuer Web-Inhalte und Timeouts ausarbeiten
- [x] Display-Steuerung fuer An/Aus, Rotation und Neustart planen
- [x] Sysinfo-Overlay erweitern: load, freier RAM, IP-Adresse(n) anzeigen
## Phase 4 - Server-Design
- [x] API-Backend fachlich schneiden
- [x] Admin-Oberflaeche in Hauptbereiche aufteilen
- [ ] Firmen-/Monitor-Oberflaeche in Hauptbereiche aufteilen
- [x] Storage-Konzept fuer Uploads, Cache-Dateien und Screenshots festlegen
- [x] Authentifizierungskonzept festlegen
- [x] Mandantentrennung im Datenmodell und in den APIs absichern
- [ ] Logging- und Monitoring-Konzept definieren
- [ ] Template-Editor fuer globale Kampagnen fachlich schneiden
- [ ] Aktivierungsoberflaeche fuer saisonale oder temporäre Kampagnen planen
- [ ] Gruppierung oder Slot-Modell fuer monitoruebergreifende Layouts planen
- [x] Provisionierungs-UI fuer neue Screens fachlich und technisch schneiden
- [ ] Jobrunner-Konzept fuer Ansible-gestuetzte Erstinstallation planen
## Phase 5 - Prototyping
- [x] Minimalen Server-Prototyp bauen
- [x] Minimalen Player-Agent-Prototyp bauen
- [x] Minimale Player-UI bauen
- [ ] Lokale Test-Playlist mit Bild, Video, PDF und Webseite anlegen
- [x] **BUG**: Datei `120papag.mpg` ist als `type: image` gespeichert, muss `type: video` sein Player-UI versucht `<img>`-Laden, was fehlschlägt
- [x] Fallback-Verzeichnisbetrieb demonstrieren
- [ ] `valid_from`/`valid_until` im Prototyp pruefen
- [x] Offline-Sync mit lokalem Cache pruefen
- [x] MQTT-Topic `signage/screen/{screenSlug}/playlist-changed` spezifiziert und dokumentiert
- [ ] MQTT-Kommandos `reload`, `restart_player`, `reboot`, `display_on`, `display_off` testweise durchspielen
- [ ] globale Kampagne testen, die tenantbezogenen Content temporär ueberschreibt
- [ ] Rueckfall auf Normalbetrieb nach manueller Deaktivierung pruefen
## Phase 6 - Betriebsfaehigkeit
- [x] Docker-Compose-Setup fuer den Server anlegen
- [x] systemd-Units fuer den Player erstellen
- [x] Chromium-Kiosk-Startskript erstellen
- [ ] Screenshot-Erzeugung auf dem Player integrieren
- [x] Heartbeat- und Statusmeldungen integrieren
- [x] MQTT-Playlist-Change-Synchronisation mit Backend-Debounce (2s) und Agent-Debounce (3s) implementiert
- [ ] Fehler- und Wiederanlaufverhalten verifizieren
## Phase 7 - Ansible-Automatisierung
- [ ] Rolle `signage_base` erstellen
- [x] Rolle `signage_player` erstellen
- [x] Rolle `signage_display` erstellen
- [ ] Rolle `signage_server` erstellen
- [ ] Rolle `signage_provision` erstellen
- [x] Inventar-/Variablenmodell fuer mehrere Monitore entwerfen
- [x] Screen-spezifische Variablen wie `screen_id`, Rotation und Aufloesung abbilden
- [x] Erstinstallation eines neuen Players automatisieren
- [x] Update-Rollout eines bestehenden Players automatisieren
- [x] Bootstrap ueber Root-Passwort auf SSH-Key und dauerhafte Verwaltung umstellen
## Phase 8 - Pilotbetrieb
- [ ] Einen Referenzmonitor fuer den Pilotbetrieb auswaehlen
- [ ] Pilotmonitor neu aufsetzen
- [ ] Verbindung zum Zentralserver herstellen
- [ ] Upload- und Playlist-Pflege mit einem Testmandanten pruefen
- [ ] Admin-Funktionen am Pilotmonitor pruefen
- [ ] globale Template-Aktivierung fuer einen oder mehrere Monitore im Pilot testen
- [ ] Offline-Betrieb real testen
- [ ] Browser-/Renderer-Stabilitaet ueber laengeren Zeitraum beobachten
- [ ] komplette Neu-Provisionierung eines frischen Test-Screens aus dem Admin-Backend pruefen
## Phase 9 - Migration der Bestandsmonitore
- [ ] Migrationsreihenfolge fuer `info01` bis `info09` festlegen
- [ ] Rueckfallstrategie pro Monitor definieren
- [ ] Altinhalte in das neue Medienmodell ueberfuehren
- [ ] Playlists uebernehmen oder neu modellieren
- [ ] Monitore nacheinander umstellen
- [ ] Nach jeder Umstellung Stabilitaet und Fernsteuerung pruefen
## Phase 10 - Nacharbeiten
- [ ] Betriebsdokumentation schreiben
- [ ] Admin-Handbuch schreiben
- [ ] Kurzhandbuch fuer Firmen-Nutzer schreiben
- [ ] Backup- und Restore-Konzept dokumentieren
- [ ] Update- und Release-Prozess festlegen
- [ ] Langfristige Wayland-Neubewertung fuer spaetere Version vormerken
## UX-Verbesserungen (Gestaltungsplan)
### Hohe Prioritaet
- [x] Flash-Messages nach Aktionen in Manage-UI (Upload, Loeschen, Speichern) — Feedback fuer den Nutzer
- [x] Screen-Online/Offline-Status in Admin-Tabelle anzeigen (aus /status-Endpoint befuellen)
- [x] Playlist-Tabelle in overflow-x Wrapper einwickeln (Responsive auf kleinen Screens)
### Mittlere Prioritaet
- [x] Loesch-Bestaetigung: Bulma-Modal statt browser-nativer confirm()-Dialog
- [x] Status-Page: Sprache von Englisch auf Deutsch vereinheitlichen
- [x] Status-Page: Relative Zeitstempel statt RFC3339 ("vor 2 Minuten")
- [x] Querlinks zwischen Admin-UI und Status-Page (Navigation)
- [x] Bulma und SortableJS als lokale Assets einbetten statt CDN
- [x] Player-UI: CSS-Transitions fuer sanfte Content-Wechsel (Fade statt abrupt)
- [x] Player-UI: Erweitertes Sysinfo-Overlay (aktueller Titel, Playlist-Laenge)
- [x] Aria-Labels fuer Loesch-Buttons und Drag-Handles (Accessibility)
### Niedrige Prioritaet
- [x] Upload-Fortschrittsbalken in Manage-UI
- [x] vars.yml Download-Button in Provision-UI statt Copy-Paste
- [x] Toggle-Switch statt Ja/Nein-Select fuer Enabled-Feld
## Querschnittsthemen
- [ ] Datensicherung fuer Datenbank und Medien einplanen
- [ ] TLS-/Reverse-Proxy-Konzept festlegen
- [ ] Ressourcenverbrauch auf Raspberry Pi beobachten
- [ ] Verhalten bei grossen Videos optimieren
- [ ] Verhalten bei defekten externen Webseiten absichern
- [ ] Datenschutz- und Rechtefragen fuer Screenshots/Vorschauen pruefen
## Erste konkrete Abarbeitungsreihenfolge
- [x] 1. Projektstruktur im neuen Verzeichnis vervollstaendigen
- [x] 2. Datenmodell in eigener Datei ausformulieren
- [x] 3. API- und MQTT-Vertrag definieren
- [x] 4. Player-Minimalkonzept fuer Raspberry Pi OS Debian 13 festzurren
- [x] 5. Server-Compose-Grundgeruest erstellen
- [x] 6. Player-Prototyp mit lokalem Browser-Renderer bauen
- [x] 7. Offline-Cache und Fallback robust machen
- [x] 8. UIs fuer Admin und Firmen schrittweise aufbauen
- [x] 9. Ansible-Rollen erstellen
- [ ] 10. Pilotmonitor migrieren