# 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) ```bash 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: ```bash 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 ```bash 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 ```bash 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: ```bash 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: ```bash ffmpeg -version # Erwartung: /usr/bin/ffmpeg ``` #### Ubuntu / Debian (Live-Server) ```bash sudo apt update sudo apt install -y ffmpeg ffmpeg -version ``` #### CentOS / RHEL / AlmaLinux ```bash 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) ```bash 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: ```bash # 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`): ```bash php artisan display-media:generate-video-thumbnails ``` Thumbnails landen auf dem `public`-Disk neben der Videodatei (`…-poster.jpg`). ### 4. Laravel-Caches leeren ```bash 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 ```bash 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: ```bash 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`*