274 lines
9.9 KiB
Markdown
274 lines
9.9 KiB
Markdown
# 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`*
|