Takt über public/cron.php: KAS-Cronjobs können nur URLs
Korrektur meiner eigenen Annahme von heute früh. Der Tarif hat SSH und Cronjobs, aber das KAS-Formular kennt nur ein Feld "Protokoll / Pfad" mit https:// — ein `php bin/…` ist dort nicht eintragbar. Der Endpoint, den ich vorhin stillgelegt hatte, ist damit wieder der einzige Takt-Geber, und zwar in einer besseren Form als geplant: Aufrufer ist der Hoster selbst, der Schlüssel verlässt den Webspace nie, kein Dritter ist beteiligt. Dritter Job 'logrotate' in der Whitelist, denn ohne ihn liefe die Logpflege nie automatisch und die 2-MB-Grenze samt 90-Tage-Frist wäre toter Code. Er passt in denselben Rahmen wie die Syncs: kein Parameter aus der URL, keine Verbindung nach außen, schreibt nur in storage/logs. bin/log-rotate.php trägt dafür denselben Riegel wie die Syncs (CRON_HTTP) und require_once. Eine vierte Ausnahme braucht wieder denselben Aufwand an Begründung. Geprüft: falscher Schlüssel 403, unbekannter Job 403, gültiger Aufruf 204 mit leerem Body, sofortige Wiederholung 204 plus WARN, Logdateien unversehrt. Zeitraster angepasst, weil das KAS Wochentage nicht mit Halbstunden kombiniert: Matchcenter stündlich statt 2x/Tag plus Wochenende, Instagram als zwei Tageseinträge, Logpflege täglich nachts. Die Abwägung steht in config.example.php und docs/deploy.md. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
This commit is contained in:
@@ -5,14 +5,19 @@ declare(strict_types=1);
|
||||
/**
|
||||
* Cron-Endpoint — die ZWEITE benannte Ausnahme zu Regel 3 (siehe CLAUDE.md).
|
||||
*
|
||||
* Warum es ihn gibt: der All-Inkl-Tarif kennt keine zeitgesteuerten Aufgaben, weder
|
||||
* Shell- noch URL-Cronjobs ("in deinem Tarif nicht verfügbar"). Die Sync-Skripte müssen
|
||||
* aber regelmäßig laufen, also muss der Takt von außen kommen. Ein externer Dienst
|
||||
* (cron-job.org o. ä.) ruft diese Datei auf, sie startet das Skript serverseitig.
|
||||
* Warum es ihn gibt (Stand 31.07.2026, geprüft im KAS): der Tarif hat inzwischen
|
||||
* SSH und Cronjobs, aber die KAS-Cronjobs können ausschließlich **URLs** aufrufen,
|
||||
* keine Shell-Befehle. Ein `php bin/…` als Cronjob ist dort nicht eintragbar. Die
|
||||
* Skripte müssen aber getaktet laufen, also ruft der KAS-Cron diese Datei auf und
|
||||
* sie startet das Skript serverseitig.
|
||||
*
|
||||
* Warum nicht der Weg über GitHub Actions mit FTP-Upload: dort müsste ein Dritter
|
||||
* Schreibzugang zum ganzen Webspace kennen. Hier kennt er einen Schlüssel, der
|
||||
* ausschließlich "starte einen der beiden Syncs" kann — deutlich kleinerer Radius.
|
||||
* Das ist besser als der ursprünglich geplante Weg mit einem externen Cron-Dienst:
|
||||
* der Aufrufer ist jetzt der Hoster selbst, der Schlüssel verlässt den Webspace nie
|
||||
* und es ist überhaupt kein Dritter beteiligt.
|
||||
*
|
||||
* Warum nicht GitHub Actions mit FTP-Upload: dort müsste ein Dritter Schreibzugang
|
||||
* zum ganzen Webspace kennen. Hier kennt der Aufrufer einen Schlüssel, der
|
||||
* ausschließlich "starte einen der drei Jobs" kann — deutlich kleinerer Radius.
|
||||
*
|
||||
* Aufruf: https://www.tsv08kulmbach.de/cron.php?job=matchcenter&key=<cron.key>
|
||||
* Schlüssel alternativ als Header X-Cron-Key (bevorzugt, landet nicht im Log
|
||||
@@ -37,9 +42,19 @@ require dirname(__DIR__) . '/app/bootstrap.php';
|
||||
header('X-Robots-Tag: noindex, nofollow');
|
||||
header('Cache-Control: no-store');
|
||||
|
||||
// Whitelist — nie ein Skriptname aus der URL.
|
||||
//
|
||||
// 'logrotate' kam am 31.07.2026 dazu, und das ist eine bewusste Erweiterung: weil die
|
||||
// KAS-Cronjobs nur URLs aufrufen können, ist dieser Endpoint der EINZIGE Weg, überhaupt
|
||||
// etwas getaktet laufen zu lassen. Ohne den Eintrag liefe die Logpflege nie automatisch,
|
||||
// und die Logs wüchsen unbegrenzt (die 2-MB-Grenze und die 90-Tage-Frist wären toter
|
||||
// Code). Der Job passt in denselben Rahmen wie die zwei Syncs: kein Parameter aus der
|
||||
// URL, keine Netzverbindung nach außen, er schreibt ausschließlich in storage/logs.
|
||||
// Eine VIERTE Ausnahme braucht wieder denselben Aufwand an Begründung.
|
||||
$jobs = [
|
||||
'matchcenter' => 'bin/matchcenter-sync.php',
|
||||
'instagram' => 'bin/instagram-sync.php',
|
||||
'logrotate' => 'bin/log-rotate.php',
|
||||
];
|
||||
|
||||
$job = (string) ($_GET['job'] ?? '');
|
||||
|
||||
Reference in New Issue
Block a user