Git-Deploy per Tag, Betriebsüberwachung und Release-Seeder für den Livegang

- dev/betrieb/deploy.sh: Deploy nur per Tag, mit --seed (Seeder im Wartungsmodus)
  und --initial (Vorschau/Live einmalig an Ort und Stelle auf Git umstellen)
- dev/betrieb/vorschau-auffrischen.sh: Live-DB und Live-Medien in die Vorschau (Generalprobe)
- InteriorReleaseSeeder: alle Inhaltsschritte des Relaunchs in einem Lauf, idempotent;
  Displays, Playlists und Mediathek bleiben unberührt
- DisplayInteriorBrandingSeeder überschreibt keinen inzwischen gepflegten Claim mehr
- Monitoring: GlitchTip (Server + Browser), /health mit Token, Scheduler-Herzschlag,
  Alarme per Mail und ntfy, Version in about und /health
- public/build versioniert; .gitignore: macOS-Muster Icon traf resources/views/flux/icon/
- Runbook: dev/betrieb/README.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-10-09 08:56:23 +00:00
parent fcb10be120
commit b5ed756d67
98 changed files with 3947 additions and 82 deletions

View file

@ -17,6 +17,10 @@ use Illuminate\Database\Seeder;
* Gesetzt wird das Logo passend zum Theme des Moduls (dunkel = negativ/weiss, hell = positiv)
* sowie der neue Claim. Alle anderen Einstellungen bleiben unangetastet.
*
* Module, die schon eines der beiden Interior-Logos tragen, bleiben ganz unberührt (08.10.2026):
* Sie sind entweder neu angelegt (Standardwerte) oder bereits umgestellt, und ein inzwischen im
* Display-CMS gepflegter Claim soll beim Livegang nicht zurückgesetzt werden.
*
* php artisan db:seed --class=DisplayInteriorBrandingSeeder
*/
class DisplayInteriorBrandingSeeder extends Seeder
@ -34,6 +38,10 @@ class DisplayInteriorBrandingSeeder extends Seeder
foreach (DisplayVersion::query()->where('type', DisplayVersionType::B2in)->get() as $module) {
$settings = $module->settings ?? [];
if (in_array($settings['header_logo_url'] ?? null, [self::LOGO_DARK, self::LOGO_LIGHT], true)) {
continue;
}
$settings['header_logo_url'] = ($settings['theme'] ?? 'dark') === 'light'
? self::LOGO_LIGHT
: self::LOGO_DARK;

View file

@ -0,0 +1,69 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
/**
* Alle Inhaltsschritte des Interior-Relaunchs in einem Lauf (08.10.2026).
*
* Bringt eine Datenbank mit dem alten Website-Stand auf den Stand der Vorschau: zuerst auf der
* Vorschau mit frischer Kopie der Live-Datenbank (Generalprobe), nach der Freigabe identisch auf
* Live. Displays, Playlists, Display-Mediathek und hochgeladene Medien bleiben, wie sie sind –
* angefasst werden nur das Display-Branding (nur Module ohne Interior-Logo) und absolute
* Medien-URLs (werden host-unabhängig).
*
* Reihenfolge wie Abschnitt 8.2 und „Seeder für das nächste Deployment“ im Entwicklungsplan.
* Jeder Schritt ist idempotent, ein zweiter Lauf ändert nichts mehr. Ausgeführt von
* `dev/betrieb/deploy.sh vX.Y.Z --migrations --seed=InteriorReleaseSeeder` im Wartungsmodus.
*
* php artisan db:seed --class=InteriorReleaseSeeder --force
*/
class InteriorReleaseSeeder extends Seeder
{
/**
* @var list<class-string<Seeder>>
*/
public const STEPS = [
// Fehlende CMS-Einträge aus den Lang-Dateien anlegen – vorhandene bleiben unberührt.
CmsContentSeeder::class,
CmsBrandSeeder::class,
// Die in AP1 neu getexteten Sektionen überschreiben (alter Website-Stand).
InteriorRelaunchCmsSeeder::class,
CmsArticleSeeder::class,
// Displays: nur Branding und Medien-URLs.
DisplayInteriorBrandingSeeder::class,
DisplayMediaUrlNormalizerSeeder::class,
// Marken
BrandPageTextSeeder::class,
BrandGalleryCaptionNormalizerSeeder::class,
WorldSplitCmsSeeder::class,
OriginSectionCmsSeeder::class,
BrandOriginSeeder::class,
OtterpohlBrandSeeder::class,
BrandImageSeeder::class,
DemoBrandGalleryCleanupSeeder::class,
// Texte und Korrekturen
WhatsappNumberSeeder::class,
AudienceSwitchProjectTextSeeder::class,
HomeHeroTextSeeder::class,
UnusedCmsContentCleanupSeeder::class,
AboutPageTextSeeder::class,
ProofreadingCorrectionsSeeder::class,
LegalTextUpdateSeeder::class,
ReferencesPageSwitchSeeder::class,
HomeHeroSlidesSeeder::class,
PageHeroEyebrowSeeder::class,
HeroTrustItemsSeeder::class,
HomeVisionTitleSeeder::class,
ContentCorrections20261008Seeder::class,
// Zuletzt: fehlende Felder ergänzen, verwendete Bilder in die Mediathek.
CmsSectionFieldsSeeder::class,
AssetMediaImportSeeder::class,
];
public function run(): void
{
$this->call(self::STEPS);
}
}