Wiederkehrende Aufgaben ohne Cronjob (ADR 073): Sicherung, Statistik kuerzen, geplante Veroeffentlichung, Updatepruefung und Aufraeumen laufen als Plan in der Tabelle scheduled_task - eine Zeile je Aufgabe mit Faelligkeit, Sperre und letztem Ergebnis. Auf geteiltem Hosting gibt es oft keinen Cronjob; der Plan haengt stattdessen an Anfragen und an einem Takt aus dem geoeffneten Backend. Diese Arbeit entstand in einer parallel laufenden Sitzung und lag bis hierher unveroeffentlicht im Arbeitsverzeichnis: die Releases 1.5.0 bis 1.5.5 wurden bewusst aus dem jeweiligen Tag gebaut und enthielten sie deshalb nicht. Vor der Veroeffentlichung geprueft, nicht bloss eingepackt: - phpunit 452/452, npm test 28/28, npm run test:editor vollstaendig. - Die Migration 20260914000100 legt nur die Tabelle scheduled_task an und nimmt sie beim Zurueckrollen wieder weg. Sie fasst keine bestehenden Daten an. - Seit einer Stunde keine Schreibzugriffe der anderen Sitzung mehr. Dabei zwei Fehler behoben: - config/services.yaml verwendet !tagged_iterator. Das ist gueltiges Symfony, aber "lint:yaml config" kennt eigene Tags nur mit --parse-tags und gab 1 zurueck - der CI-Lauf waere daran gescheitert. Flag ergaenzt. - AdminHeadersSubscriber.php (aus 1.5.3) entsprach nicht dem Stil von php-cs-fixer; composer lint gab 8 zurueck. Behoben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
118 lines
4.8 KiB
YAML
118 lines
4.8 KiB
YAML
parameters:
|
|
# Die Adresse der Verwaltung. Standard bleibt /admin; wer sie aendert, nimmt Scannern und
|
|
# Anmeldeversuchen das Ziel - erraten laesst sie sich nicht mehr. Sie steht in der Umgebung und
|
|
# nicht in der Datenbank, weil die Routen beim Start feststehen muessen. Geaendert wird sie
|
|
# ueber `php bin/console cms:admin:path <neu>`; der Befehl prueft und raeumt den Cache auf.
|
|
kant.admin_path: '%env(string:default:kant.admin_path_default:ADMIN_PATH)%'
|
|
kant.admin_path_default: 'admin'
|
|
# Wo Schriften und Stylesheets liegen. Im Normalfall im oeffentlichen Ordner; ueber
|
|
# FONT_DIRECTORY und ASSET_DIRECTORY umstellbar - die Tests nutzen das, damit sie nicht in
|
|
# das Projekt schreiben, und eine Installation mit schreibgeschuetztem public/ ebenfalls.
|
|
kant.fonts_dir: '%kernel.project_dir%/public/assets/fonts'
|
|
kant.asset_dir: '%kernel.project_dir%/public/assets'
|
|
|
|
services:
|
|
_defaults:
|
|
autowire: true
|
|
autoconfigure: true
|
|
# Jede Aufgabe traegt sich selbst in den Plan ein: eine Klasse, die App\Ops\Tasks\Task
|
|
# implementiert, bekommt das Etikett und liegt beim naechsten Abgleich in der Tabelle. Eine
|
|
# neue Aufgabe ist damit eine Datei und keine Liste, die man an drei Stellen nachfuehrt.
|
|
_instanceof:
|
|
App\Ops\Tasks\Task:
|
|
tags: ['kant.task']
|
|
App\:
|
|
resource: '../src/'
|
|
exclude: '../src/{Kernel.php,Domain/}'
|
|
Doctrine\DBAL\Connection:
|
|
factory: ['App\Infrastructure\ConnectionFactory', 'create']
|
|
arguments: ['%env(resolve:DATABASE_URL)%', '@App\Infrastructure\QueryCounter']
|
|
App\Controller\PageController:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\Content\MediaLibrary:
|
|
arguments:
|
|
$directory: '%env(resolve:MEDIA_DIRECTORY)%'
|
|
# Die Schriften liegen im oeffentlichen Ordner: sie sollen vom Webserver direkt ausgeliefert
|
|
# werden, ohne PHP dazwischen - das ist der Punkt der Uebung.
|
|
# Die Stellen, die wissen muessen, wie die Verwaltung heisst.
|
|
App\EventSubscriber\AdminHeadersSubscriber:
|
|
arguments:
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Content\Statistics:
|
|
arguments:
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Content\FontLibrary:
|
|
arguments:
|
|
$directory: '%env(default:kant.fonts_dir:FONT_DIRECTORY)%'
|
|
App\Content\StyleBundle:
|
|
arguments:
|
|
$assetDirectory: '%env(default:kant.asset_dir:ASSET_DIRECTORY)%'
|
|
App\Controller\FormController:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\Controller\SeoController:
|
|
arguments:
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Command\HealthCommand:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\Controller\SystemController:
|
|
arguments:
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Command\AdminPathCommand:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$adminPath: '%kant.admin_path%'
|
|
$environment: '%kernel.environment%'
|
|
App\Ops\ArchiveUpdate:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
App\Ops\Updater:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$databaseUrl: '%env(resolve:DATABASE_URL)%'
|
|
App\EventSubscriber\InstallSubscriber:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\EventSubscriber\MaintenanceSubscriber:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Ops\Installation:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$mediaDirectory: '%env(resolve:MEDIA_DIRECTORY)%'
|
|
$secret: '%kernel.secret%'
|
|
App\Ops\Backup:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$databaseUrl: '%env(resolve:DATABASE_URL)%'
|
|
$mediaDirectory: '%env(resolve:MEDIA_DIRECTORY)%'
|
|
# Der Aufgabenplan. Die Aufgaben kommen ueber ihr Etikett herein, damit diese Stelle nicht
|
|
# jedes Mal mitwaechst.
|
|
App\Ops\Scheduler:
|
|
arguments:
|
|
$tasks: !tagged_iterator kant.task
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\Ops\Tasks\CleanupTask:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\EventSubscriber\TaskWorkerSubscriber:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Controller\TaskController:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
App\Controller\CronController:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
App\Infrastructure\QueryCounter: ~
|
|
App\EventSubscriber\QueryHeaderSubscriber:
|
|
arguments:
|
|
$environment: '%kernel.environment%'
|