Zum Hauptinhalt springen

Admin-Tools

Alle Admin-Seiten sind via Gate::allows('admin') geschuetzt. Admins werden ueber config('postbox.admin_emails') definiert. Nicht-Admins erhalten 404 statt 403 (URL-Verschleierung).

Einheitliche Cron-Status-Anzeige

Alle Admin-Seiten mit zugehoerigen Scheduled Commands zeigen einen einheitlichen Status-Block via <x-admin.cron-status> Blade-Component.

Anzeige

ElementBeschreibung
Status-BadgeFarbcodiert: Gruen (Erfolgreich), Amber (Verzoegert), Rot (Fehlgeschlagen), Grau (Ausstehend)
Letzter LaufAbsoluter Zeitstempel (z.B. "08.03.2026 11:38 UTC") + relatives Datum ("vor 2 Stunden")
Naechster LaufNaechste geplante Ausfuehrung, berechnet aus der Cron-Expression

Technische Umsetzung

  • Service: CronStatusService (app/Services/CronMonitoring/CronStatusService.php)
  • Component: <x-admin.cron-status> (resources/views/components/admin/cron-status.blade.php)
  • Datenquelle: Heartbeat-Cache-Keys (cron:heartbeat:{key}) + Cron-Expressions via dragonmantank/cron-expression
  • Status-Logik: ok (innerhalb max_minutes), warning (>75% von max_minutes), failed (ueberfaellig), pending (kein Heartbeat)

Integration pro Admin-Seite

SeiteHeartbeat-Keys
Social Profilesinstagram_scrape, youtube_scrape
AI Enhancementspipeline_run
Tag Managementtag_cache
YouTube Managementyoutube_video_sync, websub_manage, youtube_rss_poll
Publishing Analyticsyoutube_publishing_stats
Related Channelscross_platform_auto_fill
Profil-Links (Import Status)collector_requeue
Explore Statuspipeline_run, explore_metrics
Public Explorerpublic_explorer_refresh
AI Agent Analyticsindexnow_submit, sitemap_generate
Open Graphpublic_explorer_refresh
API Managementgoogle_api_sync
SEO Dashboardseo_sync_search_console, indexnow_submit

Verwendung

{{-- Einzelner Heartbeat --}}
<x-admin.cron-status :keys="'pipeline_run'" />

{{-- Mehrere Heartbeats (worst-case Status) --}}
<x-admin.cron-status :keys="['youtube_video_sync', 'websub_manage']" />

Bei mehreren Keys wird der schlechteste Status angezeigt (failed > warning > ok > pending), der letzte Lauf ist der aktuellste, der naechste Lauf der frueheste.

Location: app/Services/CronMonitoring/CronStatusService.php, resources/views/components/admin/cron-status.blade.php


Admin SocialProfiles

Route: /admin/social-profiles Title: Admin: Social Profiles

Zentrale Verwaltungs-Seite fuer alle getracken Profile mit Health-Stats, Filtern und Aktionen.

Health-Stats

Oben auf der Seite werden aggregierte Statistiken angezeigt:

StatBeschreibung
GesamtAlle Profile
Tracking aktivtracking_enabled = true
Deaktiviertdeactivated_at IS NOT NULL (Fail-Streak)
Sanitizersanitized_at IS NOT NULL
Pending RetryIm Retry-Lifecycle
Archiviertarchived_at IS NOT NULL
Gesperrtblocked_at IS NOT NULL
Ohne MetrikenKeine social_profile_daily_metrics
API OK / Fehler / InaktivAPI-Status des letzten Scrapes

Filter

FilterOptionen
SucheName, Handle
PlattformYouTube, Instagram
TrackingAktiv, Inaktiv
API-StatusOK, Fehler, Inaktiv
SanitizerAktiv (sanitized), Deaktiviert, Admin-geschuetzt
SortierungName, Followers, Created, Updated

Aktionen

AktionMethodeBeschreibung
Blockblock()Profil sperren (blocked_at, blocked_by, block_reason)
Unblockunblock()Sperre aufheben
Enable TrackingenableTracking()Tracking aktivieren, Sanitizer-Schutz setzen
Disable TrackingdisableTracking()Tracking deaktivieren
Reset Fail-StreakresetFailStreak()Deaktivierung aufheben
Reset RelatedresetRelatedChannels()Related Channels zuruecksetzen
PrunepruneProfile()Profil physisch loeschen (nur wenn tracking disabled + keine Watcher)

Location: app/Livewire/Admin/SocialProfiles/Index.php

Admin Statistics

Route: /admin/statistics Title: Admin: Statistiken

Dashboard-Charts fuer System-Ueberblick mit globalem Zeitraum-Filter (Default: 1 Tag):

ChartSerienDatenquelle
Plattform-VerteilungYouTube, InstagramSocialProfile::created_at
Workspaces & WatchersWorkspaces, WatchersWorkspace::created_at, Watcher::created_at
Account-StatusUsers, Blocked, Sanitized, KontakteUser, SocialProfile, SocialProfileLink
Mail-ZustellungGesendet, FehlgeschlagenNotificationStat

Zeitraum-Filter

RangeBeschreibung
1dLetzter Tag (Default)
7dLetzte 7 Tage
30dLetzte 30 Tage
allGesamter Zeitraum

Ein globaler Range-Filter steuert alle 4 Charts gleichzeitig. Daten werden mit 1h Cache-TTL geladen (Cache::remember("admin:statistics:{chart}:{range}", now()->addHours(1), ...)). Der refreshCharts()-Button invalidiert alle Cache-Keys und berechnet die Charts neu.

Mail-Features

FeatureBeschreibung
Mail Flood Guard StatusZeigt aktuellen Flood-Guard-Status (aktiv/pausiert)
Test-E-Mail sendenAdmin kann Test-Mail an sich selbst senden

Location: app/Livewire/Admin/Statistics/Index.php

Admin Log & Queue

Route: /admin/log-queue Title: Admin: Log & Queue

Container-Seite fuer:

  • Log Viewer: Integration von opcodesio/log-viewer (via separater Route /admin/logs)
  • Queue Status: Live-Metriken der Queue-Worker
  • YouTube Update Status: Collector-Job-Status (queued/leased/completed/failed)
  • Queue Metrics Chart: Jobs pending/processing/failed ueber Zeit

Sub-Komponenten:

  • QueueMetricsChart - Zeitreihen-Chart der Queue-Metriken
  • YoutubeUpdateStatus - Aktueller Status der YouTube-Collector-Jobs

Location: app/Livewire/Admin/LogQueue/Index.php, app/Livewire/Admin/LogQueue/QueueMetricsChart.php, app/Livewire/Admin/LogQueue/YoutubeUpdateStatus.php

Admin YouTube Management

Route: /admin/youtube-management Title: Admin: YouTube Management

Zentrale Uebersichts-Seite fuer YouTube Video Detection, PRO-Profile, WebSub, RSS-Polling und Video-Statistiken-Tracking.

Video-Statistiken Abruf-Diagramm (Plan 30)

Interaktives ApexCharts-Diagramm zeigt taeglich, wie viele Videos frische Statistiken erhalten haben.

Datenfluss:

graph TD
A[youtube:sync-video-stats - 14:00 UTC] --> B[youtube_video_daily_metrics]
C[youtube:calculate-video-scores - 21:00 UTC] --> D[youtube_video_scores]
B --> E[youtube:aggregate-video-stats-tracking - 22:00 UTC]
D --> E
E --> F[youtube_video_stats_daily_aggregations]
F --> G[ApexCharts auf /admin/youtube-management]

Aggregations-Tabelle: youtube_video_stats_daily_aggregations

SpalteTypBeschreibung
datedateAggregierter Tag (unique)
total_videosintVideos im Bestand (nicht entfernt)
total_removedintEntfernte Videos
videos_with_metricsintVideos mit frischen Metriken
videos_without_metricsintVideos ohne Metriken
reason_removedintGrund: Video entfernt
reason_sync_disabledintGrund: Profil auto_sync deaktiviert
reason_over_limitintGrund: Ueber max_videos Limit
reason_before_cutoffintGrund: Vor Cutoff-Datum
reason_tracking_disabledintGrund: Profil tracking_enabled = false
profiles_syncedintAnzahl gesyncter Profile
quota_units_usedintAPI Quota Units verbraucht
videos_with_scoreintVideos mit VPS-Score
videos_score_pendingintVideos mit Pending-Score
health_scoretinyintGesundheits-Score (0-100)

Chart-Features:

FeatureBeschreibung
Multi-Serien ChartVideos im Bestand (Line), Abgerufen (Area), Nicht abgerufen (Area), Quota Units (dashed Line)
Zeitraum-Toggle7 Tage / 30 Tage
Custom TooltipBestand, Abgerufen, Coverage %, Quota Units, Health Score
KPI-KachelnCoverage %, Health Score, Quota Units, VPS-Score Stats
Aufschluesselungs-TabelleTageszeilen mit Gruende-Breakdown
Coverage-AlertAdmin-Notification wenn Coverage < 50%
Profil-Drill-DownWelche Profile an einem Tag gesynct wurden

Health-Score-Berechnung (0-100):

  • Coverage % (50% Gewichtung) — videos_with_metrics / total_videos
  • Sync-Aktivitaet (25% Gewichtung) — profiles_synced / total auto_sync profiles
  • Score-Vollstaendigkeit (25% Gewichtung) — videos_with_score / videos_with_metrics

Gruende-Prioritaet (keine Doppelzaehlung): removed > sync_disabled > tracking_disabled > before_cutoff > over_limit

Command:

# Gestern aggregieren (Default)
php artisan youtube:aggregate-video-stats-tracking

# Bestimmtes Datum
php artisan youtube:aggregate-video-stats-tracking --date=2026-03-01

# Alle fehlenden Tage nachberechnen
php artisan youtube:aggregate-video-stats-tracking --backfill

Schedule: Taeglich 22:00 UTC (nach Video-Sync 14:00 und Scores 21:00)

Weitere Sektionen

SektionBeschreibung
WebSub SubscriptionsGesamt, Aktiv, Ausstehend, Fehlgeschlagen, Ablaufend (48h), Erneuerungsfehler
Video-ErkennungNeue Videos 24h/7d/30d/Gesamt
PRO-ProfileAuto-Sync aktiv/deaktiviert, Tracking-Startdatum, Fail-Streak
RSS-PollingGepollt (letzte Stunde), Noch nie gepollt, Mit ETag
KonfigurationWebSub/RSS Status, Intervall, PRO Max Videos
Neue Videos Trend (14 Tage)Tabelle mit Balkendiagramm

Location: app/Livewire/Admin/YouTubeManagement/Index.php, app/Console/Commands/AggregateVideoStatsTracking.php

Admin YouTube Research

Route: /admin/youtube-research

YouTube Data API Search Tool fuer Admins mit Einzel- und Batch-Suche.

Features

FeatureBeschreibung
EinzelsucheYouTube-Suche mit Freitext und Topic-IDs
Batch-SucheBis zu 20 Keywords gleichzeitig mit Qualitaetsfilter
QualitaetsfilterMin. Subscriber, Min. Videos pro Kanal (via channels.list API)
Keyword-SuggestionsAI-Keywords aus bestehenden Profilen mit 14-Tage-Cooldown
YouTube SuggestAutocomplete-Vorschlaege von YouTube Suggest API
ErgebnisseAnzeige mit Kanal-Info, Followers, Views
ImportErgebnisse direkt in einen Workspace importieren
URL ExportErgebnis-URLs exportieren
HistoryVergangene Suchanfragen mit Ergebnissen und Batch-Status

Batch-Suche

graph TD
A[Admin gibt Keywords ein] --> B[ProcessYouTubeResearchBatch Job]
B --> C{Fuer jedes Keyword}
C --> D[YouTube Search API]
D --> E{Qualitaetsfilter aktiv?}
E -->|Ja| F[channels.list API: Subscriber/Video Check]
E -->|Nein| G[Alle Ergebnisse speichern]
F --> G
G --> H[YouTubeResearchBatchProgress Event]
H --> I[Echtzeit-Fortschritt im UI]
C --> J[Batch abgeschlossen]

Batch-Filter-Optionen:

FilterTypBeschreibung
topic_idstringYouTube Topic-ID (Music, Gaming, Sports, etc.)
relevance_languagestringISO 639-1 Sprache
region_codestringISO 3166-1 Region
min_subscribersintMindest-Subscriber-Anzahl
min_videosintMindest-Video-Anzahl

Location: app/Livewire/Admin/YouTubeResearch/Index.php, app/Jobs/ProcessYouTubeResearchBatch.php

Admin AI Enhancements

Route: /admin/ai-enhancements

Uebersicht aller AI-Detections (Gemini):

  • Statistiken: Gesamt-Detections, Erfolgs-/Fehlerrate, Profile mit Kategorie/Keywords/Description
  • Tabelle: Badges fuer Sprache, Land, Kategorie, Keywords, Description
  • Detail-Modal: Alle AI-generierten Daten mit Confidence-Levels
  • Filter: Plattform, Status, Sprache, Land, Confidence
  • Quick-Fix: "AI bearbeiten"-Button im Detail-Modal oeffnet den AiFieldEditor

Location: app/Livewire/Admin/AiEnhancements/Index.php

Admin AiFieldEditor (Manual Override)

Trigger: Event openAiFieldEditor — kann von beliebigen Seiten ausgeloest werden.

Modales Admin-Component fuer manuelle Korrektur von AI-generierten Feldern (Kategorie, Beschreibung, Keywords). Dual-Field-System: ai_manual_* Felder ueberschreiben ai_* Felder, alle Consumer nutzen effective_* Accessors.

Integration

Der "AI bearbeiten"-Button ist auf drei Seiten verfuegbar:

SeiteTrigger
Watcher ShowButton neben Profil-Details (Admin-only)
Public Explorer ShowButton auf der Profilseite (Admin-only)
AI Enhancements Detail-ModalButton im Modal

Features

FeatureBeschreibung
VergleichsansichtAI-Wert vs. Manual Override nebeneinander
Override-TogglesCheckbox pro Feld aktiviert/deaktiviert den manuellen Override
Cross-Platform VerifyVerifizierung von Cross-Platform-Zuordnungen (cross_profile_verified_at)
Cross-Platform PropagateKategorie + Keywords auf Partner-Profil uebertragen
Audit-HistoryLetzte 10 Aenderungen mit Admin-Name und Zeitstempel
Explore-SyncSpeichern aktualisiert sofort die Explore-Kategorie

Audit-Log

Jede Aenderung wird in ai_manual_override_logs protokolliert:

  • field: category, description oder keywords
  • old_value/new_value: Vorheriger und neuer Wert
  • user_id: Admin der die Aenderung vorgenommen hat

Location: app/Livewire/Admin/AiFieldEditor.php, resources/views/livewire/admin/ai-field-editor.blade.php, app/Models/AiManualOverrideLog.php

Admin Google API Usage

Route: /admin/google-api-usage Title: Admin: Google API Usage Navigation: YouTube-Gruppe (Sidebar)

Quota-Dashboard fuer Google API Keys mit Live-Sync-Status:

  • Donut-Charts: Verbrauch pro Projekt/Metrik
  • Zeitreihen: Quota-Verlauf ueber Tage
  • Sync: Manueller Sync via google:sync-api-usage (queued, nicht synchron)
  • Sync-Overlay: Waehrend Background-Sync zeigt ein halbtransparentes Overlay auf allen Projekt-Cards "Daten werden aktualisiert..." mit Spinner. Polling wechselt von 1h auf 10s. Automatische Erkennung wenn Sync abgeschlossen (vergleicht synced_at Timestamps mit Sync-Startzeit). Button zeigt Spinner-Animation.
  • Circuit Breaker Status: Zeigt den Status aller YouTube API Key Pools (default, video, research, extended)
  • Quota Guard Metriken: Circuit-Open, Jobs-Blocked, Jobs-Released pro Pool
  • Auto-Refresh: Polling alle 3600s (1h), waehrend Sync alle 10s

Location: app/Livewire/Admin/GoogleApiUsage/Index.php

Route: /admin/related-channels

Verwaltungs-Seite fuer Related Channels:

FeatureBeschreibung
Status-UebersichtPending, Running, Completed, Failed Counts
SucheNach Profil-Name/Handle
Status-FilterAlle, Pending, Completed, Failed
Platform-FilterYouTube, Instagram
ResetRelated Channels fuer ein Profil zuruecksetzen
Stuck-ErkennungFindet Profile im "running"-Status seit >1h

Location: app/Livewire/Admin/RelatedChannels/Index.php

Admin App Monitoring

Route: /admin/app-monitoring Title: Admin: App Monitoring

Zentrale Monitoring-Übersichtsseite die den Gesamtstatus aller Systeme auf einen Blick zeigt.

Sektionen

SektionBeschreibung
System-AmpelGroßer Status-Badge: "Alle Systeme OK" (grün) / "Warnung" (gelb) / "Kritisch" (rot) — basierend auf dem schlechtesten Sub-System-Status
Server-KPIsCPU, RAM, Disk, PG Connections als kompakte Badges mit Farb-Codierung (Daten aus Pulse)
Queue-StatusQueued/Failed Jobs, Worker-Status (aktiv/inaktiv)
Uptime SLA (E2)System-Uptime-Prozentsatz mit Period-Selector (7d/30d), Top-5 schlechteste Heartbeats
Cron-Heartbeat-TabelleAlle Heartbeats mit Status, Alter, Limit, Abhängigkeiten, Mute/Unmute-Buttons
Dependency Map (E4)Konfigurierte Abhängigkeiten zwischen Commands mit Upstream-Status
Event-Historie (Phase 3)Letzte 50 Events (failed, recovered, escalated, muted, unmuted) mit Filter

Heartbeat-Status-Farben

StatusFarbeBeschreibung
okGrünHeartbeat innerhalb max_minutes
failedRotHeartbeat überfällig
not_requiredGelbKein Heartbeat, aber Deploy-Grace-Period aktiv
mutedGrauVon Admin stumm geschaltet

Alter-Farbcodierung

  • Grün: <50% von max_minutes
  • Gelb: 50-100% von max_minutes
  • Rot: >100% von max_minutes (überfällig)

Admin-Aktionen

AktionBeschreibung
Stumm schaltenHeartbeat-Alerting deaktivieren (bleibt sichtbar mit "Muted" Badge)
Stummschaltung aufhebenAlerting wieder aktivieren

Auto-Refresh

wire:poll.30s — automatische Aktualisierung alle 30 Sekunden.

Location: app/Livewire/Admin/AppMonitoring/Index.php, resources/views/livewire/admin/app-monitoring/index.blade.php


Admin Server Monitoring

Route: /admin/server Title: Admin: Server

Live Server-Monitoring mit Echtzeit-Updates via Reverb:

  • Metriken: CPU, RAM, Disk, Swap, Load Average
  • Alerts: Schwellwert-basierte Alarme
  • Alert History: Vergangene Alarme
  • Refresh: Automatisch alle 15 Sekunden

Events: .server.metrics.updated, .server.alert.triggered

Location: app/Livewire/Admin/ServerDashboard.php

Admin Reverb Test

Route: /admin/reverb-test

WebSocket-Konnektivitaets-Test:

  • Test-Event senden (TestBroadcast)
  • Event-Log anzeigen
  • Verbindungsstatus pruefen

Location: app/Livewire/Admin/ReverbTest/Index.php

Admin Pages (CMS)

Route: /admin/pages, /admin/pages/create, /admin/pages/{page}/edit

CMS-lite fuer statische Seiten (Impressum, Datenschutz, etc.):

Status Workflow

StatusBeschreibung
is_draftDefault fuer neue Seiten, nicht oeffentlich sichtbar
is_review_neededZur internen Pruefung markiert
is_publishedOeffentlich sichtbar

Features

  • Auto-generierte Meta-Description aus HTML-Content
  • Navigation-Priority fuer Menu-Reihenfolge
  • Show-in-Header/Footer/Sidebar Toggles
  • Revision History via Laravel Auditing
  • One-Click Restore vorheriger Versionen

Location: app/Livewire/Admin/Pages/Index.php, app/Livewire/Admin/Pages/Edit.php

Profile Sanitizer

Automatische Deaktivierung von Low-Value-Profilen via profiles:sanitize (taeglich 04:30 UTC).

Regeln

PlattformBedingung fuer Deaktivierung
YouTubevideo_count < 1 AND followers_count < 100
Instagrampost_count < 1 AND followers_count < 100

Schutz-Bedingungen

  • Mindestalter: 7 Tage seit Erstellung
  • Mindest-Metriken: 3 Metriken-Eintraege
  • Uebersprungen: Blocked, Archived, Deactivated (Fail-Streak), Admin-geschuetzt

Admin Override Flow

  1. Admin findet sanitized Profil in /admin/social-profiles (Filter: Sanitizer -> Deaktiviert)
  2. Admin klickt "Enable" -> enableTracking() setzt sanitized_at = null, behaelt sanitize_checked_at
  3. Sanitizer ueberspringt Profile mit sanitize_checked_at IS NOT NULL AND sanitized_at IS NULL
  4. Permanenter Schutz: Nur Fail-Streak kann das Profil erneut deaktivieren

Re-Check Zyklus

Bereits sanitized Profile werden alle 3 Monate erneut geprueft. Falls die Metriken sich verbessert haben, wird das Profil reaktiviert.

php artisan profiles:sanitize
php artisan profiles:sanitize --dry-run

Config: config('postbox.sanitizer') - alle Werte env-konfigurierbar

Prune

Physisches Loeschen von Profilen und zugehoerigen Daten. Unabhaengig vom Sanitizer.

Commands

# Max-Anzahl pro Plattform (aelteste zuerst)
php artisan watchers:prune-to-max
php artisan watchers:prune-to-max --dry-run

# Nach Metriken (Follower, Videos, Posts)
php artisan watchers:prune-by-metrics
php artisan watchers:prune-by-metrics --dry-run

Admin UI Prune

Einzelnes Profil loeschen ueber /admin/social-profiles:

  • Voraussetzung: tracking_enabled = false UND keine aktiven Watcher
  • Admin-Workspace wird zuerst bereinigt

Location: app/Livewire/Admin/SocialProfiles/Index.php (Methode pruneProfile())

Admin Users

Route: /admin/users Title: Admin: Users

User-Verwaltung mit Workspace- und Watcher-Counts, User-Blocking und Block-History.

User-Blocking-System

Admins koennen User account-weit sperren. Gesperrte User werden sofort aus allen Sessions ausgeloggt.

graph TD
A[Admin klickt Block] --> B[Block-Grund eingeben]
B --> C[blockUser: blocked_at + blocked_by + block_reason]
C --> D[Sessions loeschen + remember_token null]
C --> E[UserBlock Audit-Log erstellen]
D --> F[User sofort ausgeloggt]
F --> G{User versucht Login}
G --> H[CheckBlockedUser Middleware: 403]
G --> I[Fortify Login: generische Fehlermeldung]

Blocking-Aktionen

AktionMethodeBeschreibung
BlockblockUser(int $id)User sperren mit Grund. Sessions + Token invalidieren. Audit-Log.
UnblockunblockUser(int $id)Sperre aufheben. Audit-Log.
Block HistoryshowBlockHistory(int $id)Alle Block/Unblock-Aktionen anzeigen (Modal)

Sicherheits-Checks

  • Admin-Selbstsperre verhindert: if ($user->id === auth()->id()) return
  • Middleware-Integration: CheckBlockedUser prueft isBlocked() bei jedem authentifizierten Request
  • Fortify-Integration: Login-Versuch wird mit generischer Fehlermeldung abgelehnt

Filter

FilterOptionen
SucheName, E-Mail
AdminAlle, Admins, Nicht-Admins
StatusAlle, Gesperrt

Location: app/Livewire/Admin/Users/Index.php

Admin Tag Management

Route: /admin/tag-management

Tag-Verwaltung fuer AI-generierte Tags:

FeatureBeschreibung
Block TagTag sperren (mit Grund)
Unblock TagSperre aufheben
ConsolidationAI-gesteuerte Tag-Zusammenfuehrung starten
SucheTags durchsuchen
FilterNur geblockte Tags anzeigen

Location: app/Livewire/Admin/TagManagement/Index.php

Admin Update Status

Route: /admin/update-status Title: Admin: Update Status

Container fuer YouTube- und Instagram-Update-Status sowie Pipeline-Monitoring:

  • YouTube: Queue-Status der Collector-Jobs, Breakdown-Kategorien mit Fortschritt
  • Instagram: Scrape-Status pro Rotation (queued/completed/failed), Retry-Statistiken
  • Pipeline: Tages-Pipeline mit Schritten, Health-Indikator, PRO Video Metrics Check

Breakdown-Stabilität: Die Kategorie-Summen (PRO, Leader, Candidate, Favorit, Catch-Up, Rotation, Low-Priority) bleiben über den Tag stabil. Profile, die nach dem Scraping ihre ursprüngliche Kategorie-Zuordnung verlieren (z.B. isNew → false), werden automatisch über einen elseif ($isUpdatedToday) Catch-All in die korrekte Kategorie zurückgezählt.

Pipeline Status Dashboard

Die Pipeline-Status-Seite zeigt den taeglichen Verarbeitungsfortschritt aller Pipeline-Schritte (YouTube Sync, Instagram Scrape, Explore-Berechnung, Trending Videos etc.).

FeatureBeschreibung
Gesundheits-IndikatorProminenter Banner: Gruen „Alles OK" (alle Schritte abgeschlossen), Blau „In Bearbeitung" (Steps laufen), Rot „X Probleme" (Fehler erkannt)
Trending Videos StepPipeline-Schritt „Trending Videos" in der Verarbeitungsgruppe. Zeigt Anzahl berechneter Videos pro Tag aus explore_trending_videos. Retry: explore:calculate --type=videos
PRO Video Metrics Health CheckPrueft ob alle PRO-Profile taegliche Video-Metriken haben. Nur Videos innerhalb des Tracking-Fensters (video_tracking_start_date oder cutoff_months) werden gezaehlt, begrenzt auf pro_max_videos (100). Warnung mit paginierter Tabelle (25/Seite) inkl. Beschreibungstext. Gruener Badge wenn alles OK
Instagram Stall DetectionErkennt wenn Instagram-Scraping haengt (keine Fortschritte ueber laengeren Zeitraum) und zeigt Warnung

Location: app/Livewire/Admin/UpdateStatus/DailyPipelineStatus.php, app/Services/Pipeline/PipelineStatusService.php

Retry-Statistiken (Instagram)

In der Instagram-Sektion werden zusätzlich Retry/Inactive-Profile-Statistiken angezeigt:

StatFarbeBeschreibung
In CooldownAmberProfile mit scrape_fail_streak >= 3 (noch aktiv, aber im Cooldown)
Warten auf RetryOrangeDeaktivierte Profile mit next_retry_at in der Zukunft
Gesamt inaktivOrangeAlle deaktivierten, nicht-archivierten Profile
ArchiviertRotProfile mit archived_at (> 6 Monate deaktiviert)

Collector Health Dashboard

Integriert in die Instagram-Sektion auf /admin/update-status:

FeatureBeschreibung
Circuit Breaker StatusZeigt ob der CollectorCircuitBreaker offen (pausiert) oder geschlossen (aktiv) ist, inkl. aktueller Fehlerrate der letzten 60 Minuten
Collector-Client-HealthPro Client: healthy/offline-Badge basierend auf Heartbeat-Timeout (10 Min, COLLECTOR_CLIENT_HEARTBEAT_TIMEOUT). Deaktivierte Clients (alle Tokens revoziert) werden automatisch ausgeblendet.
Recovery-ErkennungWenn ein offline-Client wieder auftaucht, wird ein Cache-Event geschrieben und eine Admin-Notification gesendet
Systemic-Outage-AlarmBei >500 requeued expired Leases in einem collector:requeue-expired-leases-Lauf wird eine Admin-Notification via NotificationService::announceToAll() ausgeloest
CachinggetResearchImportStats() gecacht (1h TTL), getPriorityProfileIds() gecacht (4h TTL). Manueller Refresh-Button löscht Cache.

Config:

KeyDefaultBeschreibung
COLLECTOR_CIRCUIT_BREAKER_THRESHOLD0.5Fehlerrate ab der der Circuit Breaker oeffnet (50%)
COLLECTOR_CIRCUIT_BREAKER_MIN_SAMPLE50Minimale Job-Anzahl bevor der Breaker greifen kann
COLLECTOR_CLIENT_HEARTBEAT_TIMEOUT600Sekunden ohne Heartbeat bis Client als offline gilt
COLLECTOR_MAX_FAIL_COUNT3Max. explizite Failures pro Job bevor permanent failed
COLLECTOR_REQUEUE_BACKOFF[30, 120]Exponentieller Backoff in Sekunden bei transientem Fehler-Requeue

Location: app/Livewire/Admin/UpdateStatus/InstagramUpdateStatus.php, app/Services/Collector/CollectorCircuitBreaker.php, app/Models/CollectorClient.php

Admin Error Monitor

Route: /admin/error-monitor Title: Admin: Error Monitor

HTTP-Fehlerseiten-Monitoring (400–599) und URL-Redirect-Management.

Features

FeatureBeschreibung
Error-LoggingAutomatisch via TrackErrorPages Middleware (PostgreSQL UPSERT: 1 Zeile pro Pfad + Status + Stunde)
Bot-ErkennungUser-Agent-Analyse fuer Bot-Traffic-Filterung
4 KPI-Boxen4xx gestern/heute (Trend), 5xx gestern/heute (Trend), Unique Pfade (24h), Bot-Anteil
Tages-Chart14-Tage-Verlauf (4xx + 5xx), inkl. Live-Daten fuer heute
Fehler-TabellePfad, Status, Hits, letzter Hit, Bot-Anteil — filterbar, paginiert (50/Seite)
Redirect-CRUDURL-Redirects mit Regex-Support, Loop-Detection, Status-Code-Auswahl (301/302/307/308/410)
Dismiss (Kein Redirect)Pfad als "Kein Redirect noetig" markieren — Redirect-Button wird ausgeblendet, Pfad bleibt sichtbar
Mute (Stummschalten)Pfad stummschalten — wird weiterhin getrackt, aber von Anomalie-Detection/Alert-Emails ausgeschlossen. Nützlich fuer Pfade die natuerlich Fehler erzeugen (z.B. abgelaufene CSRF-Tokens, Bot-Probes)
Anomalie-DetectionStuendliche Pruefung gegen Schwellwerte, konsolidierte Alert-Email (max 1/h). Gemutete Pfade werden uebersprungen
Weekly ReportWoechentlicher Error-Report an Admin-Emails (mit Stumm-Spalte)

Datenfluss

graph TD
A[HTTP Request] --> B[HandleRedirects Middleware]
B -->|301/302/307/308| C[Redirect + Hit-Counter]
B -->|410| C2[abort 410 Gone + Hit-Counter]
B -->|Kein Match| D[Routing + Controller]
D --> E[Response]
E --> F[TrackErrorPages Middleware]
F -->|4xx/5xx| G[ErrorMonitorService::recordErrorSimple]
G --> H[error_page_logs UPSERT]
I[Cron: error-monitor:rollup-daily] --> J[error_page_daily_stats]
K[Cron: error-monitor:check-anomalies] --> L{Schwellwert ueberschritten?}
L -->|Ja| M[ErrorMonitorAnomalyAlert Email]

Commands

CommandScheduleBeschreibung
error-monitor:rollup-daily01:10 taeglichLogs → Daily Stats aggregieren
error-monitor:check-anomaliesStuendlichSchwellwerte pruefen + Alert
error-monitor:pruneSonntag 03:00Logs + Stats > 365 Tage loeschen
error-monitor:weekly-reportMontag 08:00Woechentlicher Report an Admins

Redirect-Management

Admins koennen URL-Redirects mit optionalem Regex-Pattern erstellen. Loop-Detection verhindert Redirect-Schleifen. Hit-Counter verfolgt die Nutzung.

Status-CodeVerhalten
301Permanent Redirect → Browser cacht
302Temporary Redirect
307Temporary Redirect (Methode beibehalten)
308Permanent Redirect (Methode beibehalten)
410Gone — abort(410), kein Redirect, Seite als dauerhaft entfernt markiert

Bei 410 wird kein Ziel-URL benoetigt — die Middleware gibt direkt abort(410, 'Gone') zurueck. Hit-Counter wird trotzdem gezaehlt.

Pfad-Aktionen (Fehler-Tabelle)

Pro Fehlerpfad stehen drei Aktionen zur Verfuegung:

AktionButtonBeschreibung
Redirect erstellenRedirectOeffnet Redirect-Modal mit vorausgefuelltem Source-Pfad
Kein RedirectKein RedirectMarkiert Pfad als "Kein Redirect noetig" — Redirect-Button wird ausgeblendet, Pfad bleibt in Tabelle. Aufhebbar per X-Button
StummschaltenLautsprecher-IconPfad wird weiterhin getrackt, aber von checkAnomalies() uebersprungen — keine Alert-Emails mehr. Amber-Badge "Stumm" zeigt Status an. Aufhebbar per Klick auf Badge

Mute und Dismiss sind unabhaengig — ein Pfad kann gleichzeitig "Kein Redirect" UND "Stumm" sein.

Datenbank: dismissed_error_paths Tabelle mit path_hash (MD5, unique), is_muted (boolean), dismissed_by (FK → users).

Excluded Paths

Pfade die von der Middleware gar nicht erst getrackt werden (kein DB-Eintrag):

// config/postbox.php → error_monitor.excluded_paths
'/api/*', '/livewire/*', '/livewire-*', '/broadcasting/*',
'/_debugbar/*', '/_ignition/*', '/up', '/up_system'

Hinweis: /livewire-* matcht Livewire v3 AJAX-Requests (/livewire-{hash}/update). Das aeltere Pattern /livewire/* greift nur fuer /livewire/... (ohne Hash-Suffix).

Location: app/Livewire/Admin/ErrorMonitor/Index.php, app/Services/ErrorMonitor/ErrorMonitorService.php, app/Services/ErrorMonitor/RedirectManager.php

Admin Explore & Discover Status

Route: /admin/explore-status Title: Admin: Explore Status

Explore-System-Ueberblick mit Inventar-Statistiken und Bestandsentwicklung.

KPI-Boxen (6)

KPIBeschreibung
In ExploreGesamtzahl Profile in Explore
AbdeckungProzentuale Coverage aller Profile
TrendingAnzahl Profile mit Trending-Score
Rising StarsNeue Rising Stars
Neue Profile (24h)Heute hinzugefuegte Profile
Trending VideosVideos mit Trending-Score

Bestandsentwicklung (letzte 14 Tage)

Tabelle mit taeglichen Explore-Inventar-Snapshots:

  • Gesamtzahl, Plattform-Split (YouTube/Instagram)
  • Tier-Verteilung (Mega/Large/Medium/Small/Micro)
  • Trending- und Rising-Stars-Counts
  • Delta-Spalte mit Veraenderung zum Vortag (gruen/rot)

Datenquelle: explore_daily_snapshots-Tabelle, befuellt nach explore:calculate --type=daily.

Weitere Sektionen

  • Tier-Verteilung: Balkendiagramm (Mega/Large/Medium/Small/Micro)
  • Plattform-Verteilung: YouTube vs. Instagram
  • Kategorie-Tabelle: Profile pro Kategorie mit Count

Location: app/Livewire/Admin/ExploreStatus/Index.php, app/Models/ExploreDailySnapshot.php


Admin AI-Agent Analytics

Route: /admin/ai-agent-analytics Title: Admin: AI-Agent Analytics

Umfassendes Monitoring-Dashboard fuer AI-Bot-Traffic, Konfigurations-Compliance und SEO-Indexierung. Zeigt welche AI-Bots via robots.txt erlaubt/blockiert sind, trackt Cloudflare AI Crawl Traffic und ueberwacht IndexNow-Submissions.

Tabs

TabBeschreibung
Config12 konfigurierte AI-Bots (OpenAI, Anthropic, Perplexity etc.) mit Operator, Kategorie (Search/Assistant/Training), Status (erlaubt/blockiert). SEO-Dateien-Status (robots.txt, llms.txt, llms-full.txt, sitemap.xml)
TrafficKPI-Cards (Total Requests, Data Transfer, Unique Bots, Top Bot). Bot-Traffic-Chart (24h/7d). Donut-Chart Data Transfer by Bot. Top Crawled Paths. Response-Status pro Bot
AnalysisCrawler-Effizienz-Bewertung (efficient/normal/heavy/excessive). Content-Value-Schaetzung (USD). Traffic-Anomalien (Spike/Drop vs. Vorperiode)
DiscoveryUnbekannte Bot User-Agents mit Request-Counts. Robots.txt-Violations (Bots die trotz Blockierung zugreifen)
IndexNowSubmission-Statistiken (Success/Failure), tägliches Chart, aktuelle Submissions-Log

Datenquelle: Cloudflare GraphQL Analytics API (AI Crawl Metrics), Redis-Cache

Location: app/Livewire/Admin/AiAgentAnalytics/Index.php


Admin API Management

Route: /admin/api-management Title: Admin: API Management

Sanctum-API-Token-Lifecycle-Management fuer Collector-Clients. Erstellen, Revozieren, Loeschen von Personal Access Tokens mit Ablaufdatum, Abilities und IP-Whitelisting.

Features

FeatureBeschreibung
Token erstellenName, Abilities, optionales Ablaufdatum, IP-Whitelist
Aktive TokensTabelle mit Name, Abilities, Ablaufstatus, Erstelldatum, Aktionen (Chart, IP-Edit, Revoke)
Revozierte TokensSoft-revozierte Tokens mit permanenter Loesch-Option
Token-Usage-ChartsLazy-loaded Line-Charts pro Token ueber 24h/7d/30d
Uebersichts-ChartSparkline der gesamten API-Nutzung
IP-Whitelist-EditorModal zum Bearbeiten erlaubter IPs (kommasepariert)
Plaintext-BannerEinmalige Anzeige des generierten Tokens (nur bei Erstellung)

Location: app/Livewire/Admin/ApiManagement/Index.php


Admin Cloudflare Management

Route: /admin/cloudflare-management Title: Admin: Cloudflare Management

R2-Storage-Bucket-Monitoring und Analytics-Dashboard. Zeigt Kapazitaet, Kosten-Schaetzungen, Anomalien, Operations-Metriken und Billing-Trends.

Features

FeatureBeschreibung
Bucket-MetrikenBucket-Groesse (MB), Objekt-Anzahl, Snapshot-Timestamp
Kosten-SchaetzungMonatliche Aufschluesselung: Storage, Class A/B Ops, Egress, Gesamt (USD)
Operations-BreakdownCounts nach Typ (List, Get, Put, Delete), Class A/B Totals
Account-MetrikenStorage-Klassen: Standard und Infrequent-Access
Backup-StatusHealth-Check, Objekt-Anzahl, letzter Sync
Anomalie-ErkennungAlerts bei ungewoehnlichen Metrik-Aenderungen (aktuell vs. Vorperiode)
Storage-Forecast6-Monats-Projektion: aktuell GB, projiziert GB, taegliche Wachstumsrate
Billing-VergleichAktueller vs. vorheriger Monat mit Prozent-Delta
R2 Metrics ChartZeitreihen-Chart der R2-Metriken (stündlich/täglich)
Manueller RefreshBackground-Command mit Polling bis Abschluss

Location: app/Livewire/Admin/CloudflareManagement/Index.php, app/Livewire/Admin/CloudflareManagement/R2MetricsChart.php


Admin DB-Monitoring

Route: /admin/db-monitoring Title: Admin: DB-Monitoring

PostgreSQL-Performance- und Health-Monitoring-Dashboard. Zeigt Live-Connection-Counts, Cache-Hit-Ratios, Query-Dauer, Slow-Query-Log, Tabellen-Statistiken und historische Trend-Charts.

Features

FeatureBeschreibung
Aktuelle MetrikenKPI-Cards: Active Connections, Cache Hit Ratio, Longest Query, DB Size (30s Cache)
Performance-WarnungenSchwellwert-basierte Warnings (Connections, Cache Hit, Query Duration)
Historische Charts4 Line-Charts: Connections, Cache Hit Ratio, Longest Query, DB Size (1h/6h/24h/7d/30d)
Live-QueriesEchtzeit-Tabelle langlaufender Queries (>5s) mit Dauer und State
Slow-Query-LogAggregierte Slow Queries aus pg_stat_statements (Top 50, gruppiert nach Hash)
Query-Detail-ModalVollstaendige Slow-Query-Anzeige fuer selektierten Hash
Tabellen-StatistikenTop 30 Tabellen nach Groesse mit Row Count, Dead Rows, Vacuum-Status
Index-ProblemeUngenutzte/selten genutzte Indexes, Sequential-Scan-Warnings
Table-Size-Chart14-Tage-Trend der Top-10-Tabellen

Datenquelle: pg_stat_activity, pg_stat_statements, db_monitoring_snapshots, db_slow_query_log, db_table_size_snapshots

Location: app/Livewire/Admin/DbMonitoring/Index.php


Admin Import Status

Route: /admin/import-status Title: Admin: Profil-Links Verwaltung

Contact-Link-Verwaltung und Review-Dashboard. Zeigt alle extrahierten Kontakt-Links (URLs, E-Mails, Social Handles) ueber Profile hinweg mit Approve/Reject-Workflows.

Features

FeatureBeschreibung
Statistik-BoxenTotal Links, Pending Review, Approved, Rejected, Auto-Backref, Import-Status
Paginierte Link-Liste50 pro Seite mit Link-Wert, Quell-Profil, Typ, Plattform, Approval-Status
SucheVolltextsuche nach Link-Wert oder Profil-Handle
FilterStatus (Review/Approved/Rejected), Plattform, Typ (Social/E-Mail/Telefon/URL)
Review-AktionenApprove, Reject, Unapprove, Unreject mit sofortigem Status-Update
Auto-BackrefGegenseitige Verlinkungen aus Import-Prozess
Discovery-StatusPending/Completed/Failed/Not Found fuer Auto-Discovery

Location: app/Livewire/Admin/ImportStatus/Index.php


Admin Matomo Statistiken

Route: /admin/matomo-statistics Title: Admin: Matomo Statistiken

Self-hosted Matomo Analytics Dashboard (ana.lyse.io). Zeigt Website-Besucher-Statistiken, Content-Performance, Referrer-Quellen, Geraete-/Browser-Daten, Events und Echtzeit-Aktivitaet.

Features

FeatureBeschreibung
KPI-CardsToday/7d/30d: Visits, Actions, Bounce Rate, Avg. Time
Live-CounterEchtzeit Visits und Actions (Matomo Live API)
Zeitraum-Tabstoday, last7, last30 mit Lazy-Loading
Top-SeitenMeistbesuchte Seiten mit Clicks, Impressions, CTR
Top-ReferrerDirect, Search Engines, Social, Referral, Campaigns
Top-LaenderGeographische Besucher-Verteilung
Geraete/BrowserDesktop/Mobile/Tablet + Browser-Verteilung
Site SearchSuchbegriffe und No-Result-Searches
Echtzeit-BesucherLetzte 15 Visits mit Details
Perioden-VergleichAktuell vs. Vorperiode mit Delta-Prozenten
Trend-Charts30-Tage Visits und Geraete-Verteilung
GoalsGoal-Conversion-Tracking

Datenquelle: Matomo Reporting API (gecacht)

Location: app/Livewire/Admin/MatomoStatistics/Index.php


Admin Open Graph

Route: /admin/open-graph Title: Admin: Open Graph

OG-Image-Generierung und -Management fuer oeffentliche Profile. Ueberwacht Generierungs-Statistiken, Queue-Status und Job-Logs. Erlaubt Bulk-Generierung und Einzelprofil-Regenerierung.

Features

FeatureBeschreibung
Generierungs-StatsTotal Profile, mit/ohne OG-Image, Coverage %, geschaetzte Speichergroesse
Plattform-StatsYouTube/Instagram: Total, mit OG, ohne OG
Regenerierungs-FormPlattform-Filter, Tier-Filter, Force-Regenerate Checkbox
Bulk-DispatchJob-Dispatch mit chunkById(100) Iteration
Job-Log-TabellePaginierte Liste (50/Seite) mit Status (Success/Failed/Skipped), Profil, Timestamp
Log-FilterFilter nach Status mit Count-Badges
Einzelprofil-RegenerierungButton pro Profil fuer sofortige Regenerierung

Location: app/Livewire/Admin/OpenGraph/Index.php


Admin SEO Dashboard

Route: /admin/seo-dashboard Title: Admin: SEO Dashboard

Vereintes SEO-Monitoring mit Google Search Console Metriken, Core Web Vitals Daten und IndexNow-Submissions.

Tabs

TabBeschreibung
GSCSync-Status, Top 20 Pages/Queries nach Clicks, KPI-Totals (Clicks, Impressions, CTR, Position). Manueller Sync-Trigger
Web VitalsCurrent vs. Previous Period (LCP, FCP, INP, CLS, TTFB). Device Breakdown (Mobile/Desktop/Tablet). Page Type Breakdown. 5 Trend-Charts (7/14/30d). URL Drilldown fuer schlechteste Performance

IndexNow-Integration

Enabled/Configured Status, Submission-Statistiken (Total, Success, Failed, letzte Submission).

Datenquelle: search_console_metrics, web_vitals_metrics, index_now_submissions

Location: app/Livewire/Admin/SeoDashboard/Index.php


Admin Sitemap Management

Route: /admin/sitemap-management Title: Admin: Sitemap Management

XML-Sitemap-Generierung, -Validierung und -Monitoring. Trackt taegliche Snapshots mit Deltas, Health-Score und bietet manuelle Generierung mit Dry-Run.

Features

FeatureBeschreibung
Heartbeat-StatusLetzter Generierungs-Zeitpunkt, ob heute gelaufen
Sitemap-DateienXML-Dateien mit Groesse und Validierungs-Ergebnissen
14-Tage-HistoryTaegliche Snapshots: Total URLs, Static/Category/Tag/Profile URLs, Dateien, Groesse, Dauer
Health-Score (0–100)40% Validierungen + 30% Stabilitaet + 20% Vollstaendigkeit + 10% Geschwindigkeit
14-Tage-ChartLine-Chart: Total URLs und Profile URLs Trend
Manuelle GenerierungSynchroner Trigger mit Heartbeat-Recording
Dry-RunPreview der URL-Counts ohne Dateien zu schreiben

Datenquelle: sitemap_daily_snapshots, Storage-Dateien

Location: app/Livewire/Admin/SitemapManagement/Index.php


Admin Mark Video as Short

Trigger: Inline-Livewire-Component auf Video-Detail-Seiten (kein eigener Route)

Admin-only Toggle-Button zum manuellen Markieren/Entmarkieren von YouTube-Videos als Shorts (vs. Auto-Erkennung).

Features

FeatureBeschreibung
Admin-Only ButtonKleiner "S"-Button, nur fuer Admins sichtbar
Toggle-StateBadge bei Markierung, kein Badge bei Entmarkierung
Mark as ShortSetzt is_short=true, is_short_marked_at=now()
UnmarkSetzt is_short=null, is_short_marked_at=null (zurueck zur Auto-Erkennung)
Toast-FeedbackErfolgs-/Info-Toast bei Toggle

Location: app/Livewire/Admin/MarkVideoAsShort.php