b2in/dev/displays-11-05-2026/02-deployment-live-29-05-2026.md

9.9 KiB
Raw Blame History

Display CMS – Deployment auf Live (29.05.2026)

Kurze Übersicht der Änderungen aus Commit 6c6d683 und was beim Live-Deploy zu beachten ist.


Was wurde geändert?

Mediathek

  • Videos zeigen ein Vorschaubild (Poster-Frame) statt nur eines Icons.
  • Poster werden beim Upload automatisch erzeugt (ffmpeg).
  • Neuer Artisan-Command zum Nachgenerieren bestehender Videos: display-media:generate-video-thumbnails
  • Neue Kategorie „Sonstiges“ für B2in-Medien.

B2in-Display-Modul

  • Media-Picker zeigt alle Medien (Bild + Video); der Typ wird aus der Datei abgeleitet.
  • Marke (ehem. Header): Logo und Claim frei in Ecken positionierbar; separate Schalter für Anzeige.
  • Footer global ein-/ausblendbar; unten positionierte Markenelemente nur ohne Footer.
  • Kleine Thumbnail-Vorschau vor allen Medien-URL-Feldern im Editor.

Video-Playlist-Modul

  • Video-Vorschaubilder in der Übersicht.
  • Feld „Titel“ heißt jetzt „Name“ (intern, nicht auf dem Display).
  • Vorschau im Modal zeigt bei neuen Einträgen kein falsches Video mehr.

Angebote-Modul

  • Kein Slide-Typ mehr – einheitliches Detail-Layout.
  • Jeder Inhaltsblock (Logo, Badge, Texte, Preis, QR, Kontakt …) ist pro Angebot ein-/ausblendbar.
  • Logo und Brand-Text liegen pro Slide, nicht mehr in den Modul-Meta-Einstellungen.
  • Meta-Einstellungen: nur noch Endlosschleife, Transition, Dauer.
  • Streichpreis: Originalpreis rot durchgestrichen (optional).

Display-Player (public/_cabinet/display/index.html)

  • B2in: Marke/Footer-Einstellungen werden ausgespielt.
  • Angebote: dynamisches Layout, Streichpreis, Show-Flags.
  • Bugfix: Endlosschleife bei leeren Modulen gestoppt (kein CPU-Loop mehr).

Admin-Portal (allgemein)

  • Script-Reihenfolge korrigiert: @livewireScripts vor @fluxScripts (behebt fluxModal-Fehler).
  • Stale Datei public/flux/flux.js entfernt – Flux wird nicht statisch aus public/ geladen (siehe Abschnitt „Flux UI auf Live“).
  • Livewire-Modal-Crash beim Aktualisieren von Inhalten behoben.

Flux UI auf Live (wichtig – Switcher, Modals, Dropdowns)

Diagnose (portal.b2in.eu)

curl -I "https://portal.b2in.eu/flux/flux.min.js?id=test"
# Aktuell: HTTP 404  ← Browser führt das Script NICHT aus → Switcher/Modals kaputt

curl -I "https://portal.b2in.eu/vendor/livewire/livewire.min.js?id=test"
# HTTP 200  ← Livewire funktioniert, weil Assets statisch unter public/vendor/livewire/ liegen

Ursache: Flux wird auf Live per Laravel-Route ausgeliefert, liefert dort aber HTTP 404 (trotz JS-Inhalt). Livewire nutzt veröffentlichte Dateien in public/vendor/livewire/ → HTTP 200.

Symptome: Modals öffnen nicht, Switcher reagieren nicht, Konsole zeigt ReferenceError: Can't find variable: fluxModal.

Fix auf dem Live-Server

Flux-Assets wie Livewire statisch veröffentlichen:

git pull
composer install --no-dev --optimize-autoloader
# ↑ führt flux:publish-assets automatisch aus (composer.json post-install-cmd)

# Falls nötig manuell:
php artisan flux:publish-assets --force

php artisan route:clear
php artisan config:cache
php artisan view:clear

auth.json muss auf Live existieren (Flux Pro) – die Datei liegt nicht in Git.

Der Command kopiert aktuelle Dateien aus vendor/livewire/flux-pro/dist/ nach public/flux/. Nginx liefert sie dann direkt mit HTTP 200 aus (wie bei Livewire).

Prüfen ob Flux korrekt läuft

curl -I "https://portal.b2in.eu/flux/flux.min.js?id=test"
# Erwartung: HTTP 200
# Kein x-fastcgi-cache Header (dann kommt es aus PHP statt statisch)

Im Admin-Portal → DevTools → Netzwerk:

  1. vendor/livewire/livewire.min.js → 200
  2. flux/flux.min.js → 200 (nicht 404!)
  3. livewire.js lädt vor flux.min.js
  4. Hard-Reload (Cmd+Shift+R / Ctrl+Shift+R)

Wichtig

❌ Falsch ✅ Richtig
Alte public/flux/flux.js aus altem Backup zurückkopieren php artisan flux:publish-assets --force
public/flux/ löschen ohne neu zu publishen Danach immer flux:publish-assets ausführen
Nur route:clear erwarten, dass es reicht Statische Assets publishen (wie bei Livewire)

Live-Deploy Checkliste

1. Code deployen

git pull
composer install --no-dev --optimize-autoloader

composer install veröffentlicht dabei automatisch Livewire- und Flux-Assets nach public/ (post-install-cmd). Falls der Deploy-Prozess Composer-Skripte mit --no-scripts deaktiviert, danach zwingend manuell ausführen:

php artisan livewire:publish --assets
php artisan flux:publish-assets --force

Keine neuen Migrationen in diesem Release. Die Spalte display_media.thumbnail_path existiert bereits seit der Mediathek-Migration (2026_03_26_*).

2. FFmpeg installieren (Pflicht für Video-Poster)

Video-Poster werden serverseitig per ffmpeg erzeugt (DisplayMediaService, Artisan-Command). Ohne FFmpeg funktionieren Uploads weiterhin, aber keine Video-Vorschaubilder (weder in der Mediathek noch im Editor).

Dev Container (lokal)

Im Dev Container ist ffmpeg bereits vorinstalliert. Prüfen:

ffmpeg -version
# Erwartung: /usr/bin/ffmpeg

Ubuntu / Debian (Live-Server)

sudo apt update
sudo apt install -y ffmpeg
ffmpeg -version

CentOS / RHEL / AlmaLinux

sudo dnf install -y ffmpeg
# Alternativ auf älteren Systemen:
sudo yum install -y ffmpeg

Falls ffmpeg im Standard-Repo fehlt, ggf. RPM Fusion aktivieren.

macOS (lokal ohne Dev Container)

brew install ffmpeg

Wichtig: FFmpeg muss für PHP erreichbar sein

Nicht nur in der SSH-Session, sondern auch für den Webserver-User (PHP-FPM), da Poster sowohl beim Artisan-Command als auch beim Upload in der Mediathek erzeugt werden:

# Prüfen (User ggf. anpassen: www-data, nginx, apache …)
sudo -u www-data which ffmpeg
sudo -u www-data ffmpeg -version

Wenn which ffmpeg für den Webserver-User leer ist, ffmpeg systemweit installieren oder sicherstellen, dass /usr/bin im PATH von PHP-FPM liegt. Der Code ruft ffmpeg direkt auf – ein separater .env-Key ist nicht nötig.

3. Bestehende Videos: Poster nachgenerieren

Einmalig nach dem Deploy (oder bei Bedarf erneut mit --force):

php artisan display-media:generate-video-thumbnails

Thumbnails landen auf dem public-Disk neben der Videodatei (…-poster.jpg).

4. Laravel-Caches leeren

php artisan route:clear          # wichtig für Flux-Routen auf Portal-Domain
php artisan config:cache
php artisan view:clear

Hinweis: route:cache erst verwenden, wenn /flux/flux.min.js auf Live mit HTTP 200 antwortet. Siehe Abschnitt „Flux UI auf Live“.

5. Storage prüfen

php artisan storage:link   # nur falls noch nicht vorhanden

Schreibrechte auf storage/app/public/display-media/ müssen für den Webserver/PHP-User gesetzt sein (Poster-Erzeugung).

6. Umgebungsvariablen

In .env auf Live prüfen:

Variable Live-Beispiel Hinweis
DISPLAY_PLAYER_URL https://cabinet.b2in.eu/display Player-URL für Admin-Vorschau und Links
DISPLAY_DOMAIN b2in.eu Fallback in config/display.php
FILESYSTEM_DISK public oder S3 Poster werden auf dem Media-Disk gespeichert

Keine neuen Pflicht-ENV-Keys in diesem Release.

7. Frontend-Assets

Für dieses Release reichen keine separaten npm-Builds – Änderungen liegen in Blade-Templates, PHP und der statischen Player-HTML-Datei.

Falls euer Deploy-Prozess generell Assets baut:

npm ci
npm run build:admin

8. Display-Player in der Praxis (Cabinet-Geräte)

  • Die Player-Datei public/_cabinet/display/index.html ist statisch und wird mit dem Deploy ausgeliefert.
  • Geräte laden die Config alle 60 Sekunden neu; nach Deploy spätestens innerhalb einer Minute die neue Player-Logik.
  • Zur Sicherheit: einmal Hard-Reload am Display-Browser oder kurz warten (Player hat zusätzlich 6h-Reload und Datei-Change-Erkennung).
  • Cache-Control für Preview-Routen ist auf no-cache gesetzt – betrifft Admin-Vorschau, nicht zwingend CDN vor /display.

9. Nach dem Deploy testen

Kurz im Admin-Portal (portal.b2in.eu):

  1. Mediathek – Video zeigt Poster? Neues Video hochladen → Poster erscheint?
  2. B2in-Modul – Footer aus, Logo-Ecke unten, Claim-Position, Vorschau im iframe.
  3. Angebote – Slide bearbeiten, Blöcke ein/aus, Streichpreis, Logo pro Slide.
  4. Leeres Modul – Editor öffnen ohne Inhalte → kein Browser-Crash, kein Endlos-Reload in der Vorschau.
  5. Browser-Konsole – keine fluxModal- oder Livewire-Morph-Fehler mehr.
  6. Flux-Assets – /flux/flux.min.js → 200; Switcher und Modals reagieren normal.

Rückwärtskompatibilität

  • Bestehende Angebots-Slides ohne show_*-Flags rendern weiter wie bisher (Fallback: Block sichtbar, wenn Inhalt vorhanden).
  • B2in-Module mit alten Einstellungen behalten ihre Defaults (Footer an, Logo oben links).
  • Offers Meta-Einstellungen (Logo, Brand-Text, Footer) in alten Modul-settings werden ignoriert – Branding liegt jetzt pro Slide. Bestehende Slides ohne Logo-Felder nutzen weiter die Player-Defaults.

Bekannte Abhängigkeiten

Abhängigkeit Zweck Ohne
ffmpeg Video-Poster Upload ok, kein Thumbnail
public-Storage Medien + Poster Upload schlägt fehl
Portal-Domain Admin + API Editor/Vorschau
Display-Domain Player-Ausspielung Cabinet-Geräte

Rollback

Bei Problemen: auf den vorherigen Git-Stand zurück (git revert oder Deploy des letzten Releases).

  • Keine DB-Migration rückgängig machen nötig.
  • Bereits erzeugte Poster-Dateien können liegen bleiben (harmlos).
  • public/flux/ nicht manuell aus altem Backup wiederherstellen – stattdessen php artisan flux:publish-assets --force.

Stand: 29.05.2026 · Commit 6c6d683