Commands Übersicht
Postbox nutzt Artisan Commands für alle wiederkehrenden Aufgaben: Scraping, Metriken-Berechnung, Wartung und Monitoring.
Alle Scheduled Commands laufen in UTC und sind in routes/console.php konfiguriert.
Data Collection
| Signature | Schedule | Beschreibung |
|---|---|---|
social:scrape-daily-followers | Alle 2h (ungerade) | YouTube Daily Scrape mit Rotation-Buckets |
social:queue-daily-instagram | Alle 2h (gerade) | Instagram-Scrapes in Collector-Queue einreihen |
social:detect-languages --queue | Alle 15 Min | AI-Spracherkennung für Profile einreihen |
watchers:queue-rescrape {type} | Manuell | Re-Scrape nach Metriken-Range queuen |
Nightly Pipeline
| Signature | Schedule | Beschreibung |
|---|---|---|
pipeline:run | 01:00 taeglich | Zentraler Orchestrator: Score+Explore (Batch 1A), Rollups (Batch 1B), Leaderboards (Batch 2A+2B), Trending (Batch 2C), Phase 3 als eigenstaendiger Job (Trending Flags, Videos, Categories, Tag Cache, Explorer Refresh). --phase=phase3 fuer manuellen Re-Run. |
Durch pipeline:run ersetzte Commands (Legacy)
Diese Commands existieren weiterhin fuer manuelle Ausfuehrung, werden aber nicht mehr einzeln scheduled:
| Signature | Beschreibung |
|---|---|
dashboard:rollup-daily-metrics-range | Dashboard-Rollups aus taeglichen Metriken |
dashboard:rollup-leaderboards | Leaderboard-Snapshots vorberechnen |
dashboard:rollup-global-leaderboards | Globale Top/Flop-Listen (systemweit) |
scores:calculate | Postbox-Scores fuer alle Profile |
explore:calculate --type=all | Explore-Metriken, Trending, Kategorien |
tags:refresh-cache | Tag-Cache fuer Browse-Autocomplete |
cross-platform:queue-related | Cross-Platform Related Berechnungen |
public-explorer:refresh | Public Explorer Profil-Cache |
Dashboard & Metriken
| Signature | Schedule | Beschreibung |
|---|---|---|
youtube:calculate-video-scores | 21:00 taeglich | Video Performance Scores (VPS) |
youtube:aggregate-publishing-stats | Montag 03:00 | Publishing-Statistiken pro Kanal/Wochentag aggregieren |
YouTube
| Signature | Schedule | Beschreibung |
|---|---|---|
youtube:sync-video-stats | 14:00 täglich | Video-Statistiken für Auto-Sync-Profile |
youtube:auto-fill-related-channels | Alle 5 Min | Related Channels bei freiem Quota füllen |
youtube:manage-websub --all | 06:00 täglich | WebSub-Subscriptions erneuern, erstellen, bereinigen |
youtube:poll-rss-feeds | Alle 30 Min | RSS-Feeds pollen (WebSub-Fallback für neue Videos) |
youtube-research:prune | 01:30 täglich | Research-Queries > 30 Tage löschen |
Instagram / Collector
| Signature | Schedule | Beschreibung |
|---|---|---|
collector:token {name} | Manuell | Collector-Client + Sanctum Token erstellen |
collector:retry-failed | Manuell | Fehlgeschlagene Collector-Jobs erneut versuchen |
collector:requeue-expired-leases | Alle 5 Min | Verwaiste Collector-Jobs mit abgelaufenen Leases requeuen |
collector:prune-logs --days=7 | Alle 6h | Collector-Logs nach Aufbewahrungsfrist löschen |
instagram:queue-related | Manuell | Instagram Related Profiles berechnen (Bulk oder Einzelprofil, keine API-Kosten) |
instagram:prioritize-rotation | Manuell | Queued Daily-Scrape-Jobs vor Import-Jobs priorisieren |
instagram:deprioritize-non-rotation | Manuell | Non-rotation Jobs (Imports, neue Profile) auf niedrige Priority setzen |
AI Enhancement
| Signature | Schedule | Beschreibung |
|---|---|---|
social:detect-languages | Alle 15 Min (--queue) | Sprache/Land/Kategorie via Gemini AI erkennen |
ai:prune-logs --days=7 | 2x täglich | Fehlgeschlagene AI-Logs löschen |
ai:retry-failed | Sonntags 08:00 | Fehlgeschlagene AI-Detections erneut dispatchen |
tags:consolidate | Sonntags 18:00 | AI-Tags via Gemini konsolidieren |
keywords:update-stopwords | Sonntags 02:00 | Dynamische Stopword-Liste aus Keyword-Häufigkeit |
Admin & Wartung
| Signature | Schedule | Beschreibung |
|---|---|---|
watchers:backfill-admin-workspace | Stündlich | Profile ins Admin-Workspace spiegeln |
watchers:resume-imports | Alle 5 Min | Pausierte Watcher-Imports fortsetzen |
watchers:prune-by-metrics {type} | Manuell | Watcher nach Metriken löschen |
watchers:prune-to-max {type} | Manuell | Watcher auf Maximum pro Plattform begrenzen |
profiles:retry-inactive | 22:00 täglich | Deaktivierte Profile erneut versuchen |
profiles:sanitize | 03:30 taeglich | Low-Value Profile auto-deaktivieren (Queue-basiert via SanitizeProfileBatch) |
cross-platform:auto-fill-related | Alle 5 Min | Cross-Platform Related in kleinen Batches |
imports:retry-failed | Manuell | Fehlgeschlagene Import-Runs wiederholen (auch --source=research für Research-Recovery) |
queue:prune-stale | Manuell | Veraltete Queue-Jobs löschen |
notifications:cleanup | 03:00 täglich | Abgelaufene Notifications löschen |
db:prune-historical-data | 01:00 täglich | Alte Metriken, Rollups, Snapshots kürzen |
SEO & Web Vitals
| Signature | Schedule | Beschreibung |
|---|---|---|
sitemap:generate | 07:30 taeglich | XML-Sitemaps generieren (nach Explorer Refresh via pipeline:run) |
seo:sync-search-console | 08:00 täglich | Google Search Console Metriken synchronisieren |
seo:prune-metrics | Sonntag 03:30 | Search Console + Web Vitals Daten > 90 Tage löschen |
seo:web-vitals-report | Montag 09:00 | Wöchentlicher Web Vitals Report mit Degradation-Erkennung |
OG-Images & Storage
| Signature | Schedule | Beschreibung |
|---|---|---|
og-images:generate | 08:00 täglich (--missing-only) | OG-Images für Public Explorer Profile generieren (Browsershot) |
og-images:cleanup | Sonntag 04:00 | Verwaiste OG-Images löschen |
storage:migrate-to-r2 | Manuell | Lokale Dateien nach Cloudflare R2 migrieren |
storage:verify-r2 | Manuell | R2-Integrität gegen lokale Dateien prüfen |
storage:sync-r2-backup | Sonntag 04:30 | Primary R2 Bucket in Backup Bucket syncen |
cloudflare:fetch-r2-metrics | Stündlich | R2-Metriken via Cloudflare GraphQL/REST API abrufen |
Error Monitoring
| Signature | Schedule | Beschreibung |
|---|---|---|
error-monitor:rollup-daily | 01:10 täglich | Error-Page-Logs → Daily Stats aggregieren |
error-monitor:check-anomalies | Stündlich | Anomalie-Schwellwerte prüfen + Alert-Email (max 1/h) |
error-monitor:prune | Sonntag 03:00 | Error-Logs + Daily Stats > 365 Tage löschen |
error-monitor:weekly-report | Montag 08:00 | Wöchentlicher Error-Report an Admins |
Health & Monitoring
| Signature | Schedule | Beschreibung |
|---|---|---|
health:check-daily-scrapes | Alle 2h (:30 ungerade) | Alert-Email bei fehlenden Scrape-Jobs |
queue:metrics-snapshot | Alle 15 Min | Queue-Metriken für Admin-Charts |
queue:retry-failed-range | Manuell | Failed Jobs in Zeitraum erneut queuen |
google:sync-api-usage | Stündlich | Google API Quota-Nutzung synchronisieren |
server:check-alerts | Alle 5 Min | Server-Metriken gegen Alert-Schwellwerte prüfen |
db:snapshot | Alle 15 Min | PostgreSQL-Metriken Snapshot (Connections, TPS, Cache-Hit, Dead Tuples) |
db:snapshot --slow-queries --top=50 | Stündlich | Top 50 Slow Queries aus pg_stat_statements |
db:snapshot --prune | 02:15 täglich | DB-Monitoring-Snapshots + Slow-Query-Logs über Retention löschen |
db:activity | Manuell | Live PostgreSQL-Aktivität anzeigen (CLI) |
server:snapshot | Alle 5 Min | Server-Metriken aus Pulse in eigene Tabelle erfassen |
server:snapshot --prune | 02:20 täglich | Server-Metriken > 90 Tage löschen |
server:rollup-hourly | 03:00 täglich | 5-Min-Snapshots zu stündlichen Durchschnittswerten aggregieren |
pulse:check-size | Sonntag 03:30 | Pulse-Tabellengröße prüfen, Alert bei > 2 GB |
pulse:purge | 2×/Tag (02:30 + 14:30) | Pulse-Daten > Retention löschen |
vantage:cleanup-stuck --timeout=2 | 01:22 täglich | Stuck "processing" Jobs > 2h als failed markieren |
vantage:prune --status=completed | 01:25 täglich | Completed Vantage-Jobs > 24h löschen |
vantage:prune --status=failed | 01:30 täglich | Failed Vantage-Jobs > 4 Tage löschen |
reverb:start | Daemon | Laravel Reverb WebSocket Server |
Bilder
| Signature | Schedule | Beschreibung |
|---|---|---|
images:generate-variants | Manuell | Backfill: Optimierte Bild-Varianten (WebP/AVIF) für bestehende Profilbilder und Video-Thumbnails generieren |
images:cleanup-orphaned | Manuell | Verwaiste Varianten-Dateien ohne DB-Eintrag finden und entfernen |
Sonstige
| Signature | Schedule | Beschreibung |
|---|---|---|
notifications:rollup-stats | 00:30 täglich | Mail-Log in tägliche Statistiken aggregieren |
social:discover-from-links | Sonntag 09:00 | Auto-Discovery: SocialProfiles aus Contact-Link-Handles anlegen |
profiles:backfill-descriptions | Manuell | parsed_links für Profile ohne Daten nachparsen |
profiles:backfill-instagram-descriptions | Manuell | Instagram Bio ins description-Feld für AI Enhancer kopieren |
profiles:sync-parsed-links | Manuell | parsed_links JSONB in social_profile_links sync |
profiles:backfill-followers-count | Manuell | latest_followers_count aus Metriken nachfüllen |
social:recalculate-related-scores | Manuell | Relevance-Scores für Related Channels neu berechnen |
related:find-stuck | Manuell | Hängengebliebene Related-Suchen finden (alle Systeme: YouTube, Instagram, Cross-Platform) |
compare:send-reminders | Manuell | Wöchentliche Comparison-Reminder an User mit aktiven Subscriptions senden |
ai:assess-quality | Manuell | Einmalige Qualitätsbewertung englischer AI-Beschreibungen (Score 1-10) |
ai:translate-descriptions | Manuell | AI-Beschreibungen in andere Sprachen übersetzen |
mail:resume | Manuell | Flood-Guard-Pause für Mailversand aufheben |
mail:status | Manuell | Aktuellen Mail-System-Status anzeigen |
queue:prune-failed --hours=168 | 01:15 taeglich | Failed Jobs > 7 Tage loeschen (Laravel built-in) |
api-tokens:check-alerts | 08:00 taeglich | Inaktive/ablaufende API Tokens pruefen und Admins benachrichtigen |
favorites:cleanup | Manuell | Verwaiste Favoriten-Watcher bereinigen |
instagram:auto-fill-related | Alle 5 Min | Instagram Related in kleinen Batches (5/Run) |
Zeitliche Verteilung
Stunde | Jobs
--------|------------------------------------------------------------------
00:00 | Instagram Queue
00:30 | Notification Stats Rollup
01:00 | pipeline:run (Scores, Explore, Rollups, Leaderboards, Trending, Tags, Cross-Platform, Explorer Refresh), Historical Data Prune
01:10 | Error Monitor Rollup Daily
01:15 | Prune Failed Jobs
01:20 | Pulse Purge (1. Lauf)
01:22 | Vantage Stuck Cleanup
01:25 | Vantage Prune Completed
01:30 | Vantage Prune Failed, YouTube Research Prune
02:00 | Instagram Queue
02:15 | DB Snapshot Prune
02:20 | Server Metrics Prune
02:30 | Pulse Purge (2. Lauf)
03:00 | Notifications Cleanup, Server Rollup Hourly, Publishing Stats (Montag)
03:15 | Model Prune (ApiTokenUsageLog)
03:30 | Profiles Sanitize
06:00 | Instagram Queue, WebSub Manage, R2 Snapshot (1. Lauf)
07:30 | Sitemap Generate
08:00 | OG-Images Generate, SEO Sync, API Token Alerts
09:00 | Erster YouTube Scrape (dann alle 2h ungerade), Web Vitals Report (Montag), Auto-Discovery Retry (Sonntag)
10:30 | AI Prune Logs (1. Lauf)
11:15 | Collector Prune Logs (1. Lauf)
14:00 | YouTube Video Stats Sync
18:00 | R2 Snapshot (2. Lauf)
21:00 | YouTube Video Scores
22:00 | Profiles Retry Inactive
22:30 | AI Prune Logs (2. Lauf)
... | (Scrapes alle 2h, RSS-Polling alle 30min, Auto-Fill alle 5min)
Alle wichtigen Scheduled Commands werden via CronHeartbeatMonitorService überwacht. Verpasste Ausführungen lösen Alert-E-Mails an Admins aus (siehe cron:check-heartbeats).
Die meisten Commands nutzen .withoutOverlapping(minutes) um parallele Ausführungen zu verhindern.