Display CMS Optimierungen 03-06-2026

This commit is contained in:
Kevin Adametz 2026-06-03 15:43:18 +02:00
parent 6c6d683b9a
commit bebfa63e87
17 changed files with 925 additions and 133 deletions

View file

@ -0,0 +1,274 @@
# 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`*