/tsv08kulmbach (echten Pfad einsetzen: pwd auf dem Server) * PHP=/usr/bin/php (All-Inkl ggf. /usr/local/bin/php8.2 — `which php8.2` prüft es) * * # Instagram-Feed: 2×/Tag (versetzte Minuten, damit die Läufe sich nicht überlappen) * 17 6,18 * * * cd $SITE && $PHP bin/instagram-sync.php >> storage/logs/instagram.log 2>&1 * * # Matchcenter: 2×/Tag als Grundtakt * 37 7,19 * * * cd $SITE && $PHP bin/matchcenter-sync.php >> storage/logs/matchcenter.log 2>&1 * * # Matchcenter am Spieltag-Nachmittag/Abend ½-stündlich (Sa+So 13–21 Uhr), * # damit Ergebnisse und Tabelle zeitnah stehen. * 7,37 13-21 * * 6,0 cd $SITE && $PHP bin/matchcenter-sync.php >> storage/logs/matchcenter.log 2>&1 * * # Logrotation: sonntags nachts, damit spam.log/php-errors.log nicht unbegrenzt wachsen. * 23 3 * * 0 cd $SITE && $PHP bin/log-rotate.php > /dev/null 2>&1 * * Alle Skripte sind CLI-only; die Syncs sperren sich per Lock gegen Parallelläufe und lassen * bei jedem Fehler den letzten guten Cache stehen — ein fehlgeschlagener Lauf schadet nie. * Erstlauf nach dem Deploy einmal von Hand anstoßen (füllt Cache + Bilder/Wappen). * * --------------------------------------------------------------------------- * NACH DEM DEPLOY * --------------------------------------------------------------------------- * php bin/preflight.php Config, Secrets, Schreibrechte, vendor/, PHP-Version prüfen * php bin/smtp-test.php SMTP-Login testen (ohne Mailversand) * danach je eine Testmail über /kontakt, /mitglied-werden und /sportheimbuchung */ return [ // Kanonische Basis-URL ohne trailing slash (für Canonical, OG, Sitemap). 'base_url' => 'https://www.tsv08kulmbach.de', // 'production' oder 'development' (steuert Fehleranzeige). 'env' => 'production', // Geheimer Schlüssel für die HMAC-Time-Trap der Formulare und den IP-Hash im Spam-Log. // Generieren mit: php -r "echo bin2hex(random_bytes(32));" // Für Produktion einen EIGENEN Wert erzeugen — nie den aus der lokalen Dev-Config // übernehmen. Solange hier CHANGE_ME steht, weisen die Formular-Actions jeden // Versand ab (config_problems()), damit die Time-Trap nie mit einem bekannten // Schlüssel läuft. 'app_secret' => 'CHANGE_ME', // All-Inkl SMTP (Postfach im KAS anlegen; Host = .kasserver.com). // Verbindung testen ohne Mailversand: php bin/smtp-test.php 'smtp' => [ 'host' => 'w01ca75d.kasserver.com', 'port' => 587, // STARTTLS 'username' => 'noreply@tsv08kulmbach.de', // volle Postfach-Adresse 'password' => 'POSTFACH_PASSWORT', // Absender: das authentifizierte Postfach (gleiche Domain, sonst lehnt All-Inkl ab). 'from' => 'noreply@tsv08kulmbach.de', 'from_name' => 'TSV 08 Kulmbach', // Empfänger der Formular-Mails. 'to' => 'info@tsv08kulmbach.de', ], // Instagram-Scraper (bin/instagram-sync.php). 'instagram' => [ 'username' => 'tsv08kulmbach', 'max_posts' => 9, ], // Matchcenter-Scraper (bin/matchcenter-sync.php) — Spielplan/Ergebnisse/Tabelle // aus der öffentlichen BFV-Widget-JSON-API. Die IDs sind keine Geheimnisse // (sie steckten schon im alten BFV-Widget-Embed) und dürfen hier stehen. 'matchcenter' => [ // Referer für die BFV-Requests (gegen HTTP 418). 'referer' => 'https://widget-prod.bfv.de/', 'max_upcoming' => 5, // anstehende Spiele pro Team + im globalen Slider 'max_results' => 5, // letzte Ergebnisse pro Team // key = Schlüssel in data/teams.json (für kuratierten Namen/Liga/Slug), // team_id = BFV permanentId (saison-stabil). compound_id = Wettbewerbs-ID // der Tabelle — nur Fallback: der Scraper leitet die aktuelle compoundId // automatisch aus der Matches-API ab, sodass eine neue Saison von selbst // übernommen wird. compound_id nur pflegen, falls die Auto-Erkennung mal fehlt. 'teams' => [ ['key' => 'erste-mannschaft', 'team_id' => '016PKHIPIO000000VV0AG811VUDIC8D7', 'compound_id' => '02TBKEVREG000006VS5489BTVVQ0O654-G'], // Vorerst deaktiviert (27.07.2026): Die BFV-Mannschaft hinter dieser ID lief in // der Saison 25/26 als „(SG1) TSV Melkendorf I/ TSV 08 Kulmbach II" und liefert // in 26/27 nur noch „TSV Melkendorf" — also Spiele ohne den TSV 08. Erst nach // Klärung im Verein wieder aktivieren (ggf. mit neuer team_id). // ['key' => 'zweite-mannschaft', 'team_id' => '016PCRVRJC000000VV0AG811VTE5EA5R', 'compound_id' => '02TD8CKMD8000006VS5489BTVTLPPK10-G'], ['key' => 'damen', 'team_id' => '01HLQ7QVES000000VV0AG80NVVKQLCU9', 'compound_id' => '02TK5AGFE0000004VS5489BUVVPGA9RV-G'], ], ], ];