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

274 lines
9.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.

# 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`*