- 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>
35 lines
1.3 KiB
PHP
35 lines
1.3 KiB
PHP
<?php
|
||
|
||
use App\Console\Commands\MonitoringHeartbeat;
|
||
use App\Support\OperationalAlert;
|
||
use Illuminate\Console\Scheduling\Event;
|
||
use Illuminate\Foundation\Inspiring;
|
||
use Illuminate\Support\Facades\Artisan;
|
||
use Illuminate\Support\Facades\Schedule;
|
||
|
||
Artisan::command('inspire', function () {
|
||
$this->comment(Inspiring::quote());
|
||
})->purpose('Display an inspiring quote');
|
||
|
||
// Betriebs-Alert, wenn ein geplanter Task fehlschlägt – an JEDEN Task hängen
|
||
$alertOnFailure = fn (string $task) => function (Event $event) use ($task): void {
|
||
OperationalAlert::send("Geplanter Task fehlgeschlagen: {$task}", ['exit_code' => $event->exitCode]);
|
||
};
|
||
|
||
Schedule::command('cabinet:reset-overrides')
|
||
->dailyAt('00:00')
|
||
->withoutOverlapping(10)
|
||
->onFailure($alertOnFailure('cabinet:reset-overrides'));
|
||
|
||
// Herzschlag: fällt der Scheduler aus (Cron weg, Server hängt), greift kein
|
||
// onFailure mehr – dann meldet /health den fehlenden Herzschlag
|
||
Schedule::command(MonitoringHeartbeat::class)
|
||
->everyMinute()
|
||
->withoutOverlapping(2)
|
||
->onFailure($alertOnFailure('monitoring:heartbeat'));
|
||
|
||
// Fehlgeschlagene Jobs nach 30 Tagen entfernen
|
||
Schedule::command('queue:prune-failed', ['--hours=720'])
|
||
->dailyAt('03:55')
|
||
->withoutOverlapping(30)
|
||
->onFailure($alertOnFailure('queue:prune-failed'));
|