Ship production optimization M1-M12.5A: queues, metrics, HTTP observability, and vector search reliability.

Keep similar-ai from tripping the global circuit on a lone URL 502, clamp Qdrant search to 100, and add Server-Timing plus slow-request logging. Studio shared props, Academy S3 exists caching, heat chunking, and Redis/scheduler hygiene stay in this rollout.
This commit is contained in:
2026-08-25 07:58:47 +02:00
parent f52879edbb
commit 8a80aae21e
114 changed files with 9293 additions and 284 deletions
+61 -30
View File
@@ -44,16 +44,31 @@ Schedule::command('skinbase:reset-windowed-stats --period=7d')
->withoutOverlapping();
// Daily maintenance
Schedule::command('uploads:cleanup')->dailyAt('03:00');
Schedule::command('uploads:cleanup')
->dailyAt('03:00')
->name('uploads-cleanup')
->withoutOverlapping();
Schedule::command('enhance:cleanup --force')
->dailyAt('03:30')
->name('enhance-cleanup')
->withoutOverlapping()
->runInBackground();
Schedule::command('analytics:aggregate-similar-artworks')->dailyAt('03:10');
Schedule::command('analytics:aggregate-feed')->dailyAt('03:20');
Schedule::command('analytics:aggregate-discovery-feedback')->dailyAt('03:25');
Schedule::command('analytics:aggregate-tag-interactions')->dailyAt('03:35');
Schedule::command('analytics:aggregate-similar-artworks')
->dailyAt('03:10')
->name('analytics-aggregate-similar-artworks')
->withoutOverlapping();
Schedule::command('analytics:aggregate-feed')
->dailyAt('03:20')
->name('analytics-aggregate-feed')
->withoutOverlapping();
Schedule::command('analytics:aggregate-discovery-feedback')
->dailyAt('03:25')
->name('analytics-aggregate-discovery-feedback')
->withoutOverlapping();
Schedule::command('analytics:aggregate-tag-interactions')
->dailyAt('03:35')
->name('analytics-aggregate-tag-interactions')
->withoutOverlapping();
Schedule::command('academy:analytics-rollup')
->hourlyAt(12)
->name('academy-analytics-rollup')
@@ -74,8 +89,9 @@ Schedule::command('academy:analytics-prune-events --days=180')
// Drain Redis artwork-stat delta queue so MySQL counters stay fresh.
// Offset this off the :00/:10 boundaries so it does not pile onto publish jobs.
// :18 not :21 so this does not start with leaderboards:refresh (observed >2 min).
Schedule::command('skinbase:flush-redis-stats')
->cron('1,11,21,31,41,51 * * * *')
->cron('1,11,18,31,41,51 * * * *')
->name('flush-redis-stats')
->withoutOverlapping();
@@ -226,11 +242,13 @@ Schedule::job(new \App\Jobs\Sitemaps\CleanupSitemapReleasesJob())
->name('sitemaps-cleanup')
->withoutOverlapping();
Schedule::command('collections:dispatch-maintenance')
->hourlyAt(43)
->name('dispatch-collection-maintenance')
->withoutOverlapping()
->runInBackground();
if ((bool) config('collections.v5.queue.dispatch_enabled', false)) {
Schedule::command('collections:dispatch-maintenance')
->hourlyAt(43)
->name('dispatch-collection-maintenance')
->withoutOverlapping()
->runInBackground();
}
Schedule::job(new \App\Jobs\RankBuildListsJob())
->hourlyAt(15)
@@ -253,10 +271,11 @@ Schedule::job(new \App\Jobs\RecalculateRisingNovaCardsJob())
->name('nova-cards-rising-cache-refresh')
->withoutOverlapping();
Schedule::command('nova:prune-metric-snapshots --keep-days=7')
->dailyAt('04:00')
// After hourly snapshot at :02 so prune does not share the 04:02 upsert window.
Schedule::command('nova:prune-metric-snapshots')
->dailyAt('04:25')
->name('prune-metric-snapshots')
->withoutOverlapping();
->withoutOverlapping(120);
Schedule::command('skinbase:sync-countries')
->monthlyOn(1, '03:40')
@@ -269,17 +288,13 @@ Schedule::command('health:tick')
->name('health-scheduler-tick')
->withoutOverlapping();
Schedule::command('forum:ai-scan')
->hourlyAt(16)
->name('forum-ai-scan')
->withoutOverlapping()
->runInBackground();
Schedule::command('forum:bot-scan')
->hourlyAt(22)
->name('forum-bot-scan')
->withoutOverlapping()
->runInBackground();
if ((bool) config('skinbase_ai_moderation.queue.dispatch_enabled', false)) {
Schedule::command('forum:ai-scan')
->hourlyAt(16)
->name('forum-ai-scan')
->withoutOverlapping()
->runInBackground();
}
Schedule::command('forum:scan-posts --limit=250')
->hourlyAt(17)
@@ -287,13 +302,29 @@ Schedule::command('forum:scan-posts --limit=250')
->withoutOverlapping()
->runInBackground();
Schedule::command('forum:firewall-scan')
->hourlyAt(40)
->name('forum-firewall-scan')
->withoutOverlapping()
->runInBackground();
if ((bool) config('forum_security.queues.dispatch_enabled', false)) {
Schedule::command('forum:bot-scan')
->hourlyAt(22)
->name('forum-bot-scan')
->withoutOverlapping()
->runInBackground();
Schedule::command('forum:firewall-scan')
->hourlyAt(40)
->name('forum-firewall-scan')
->withoutOverlapping()
->runInBackground();
}
Schedule::command('horizon:snapshot')
->hourlyAt(45)
->name('horizon-snapshot')
->withoutOverlapping();
if ((bool) config('traffic.online_visitors.prune_enabled', false)) {
Schedule::command('skinbase:prune-online-visitor-index --execute')
->hourlyAt(33)
->name('prune-online-visitor-index')
->withoutOverlapping(25)
->runInBackground();
}