Every installation now reports address and version to sites.kant-it.de every 15 minutes and picks up update orders there (ADR 123). Reports and answers are HMAC-signed with a per-installation key sent on first contact; an order can only install a published release with checksum. The next request after the file swap runs the migrations, so a remote update finishes without anyone in the admin. The platform itself lives in zentrale/ (plain PHP + SQLite, not part of the release archive): overview with outdated, silent and unassigned installations, single and bulk updates, per-site detail and history. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
210 lines
8.7 KiB
YAML
210 lines
8.7 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'
|
|
kant.mail_log: '%kernel.project_dir%/var/log/mail.log'
|
|
kant.mailer_dsn: 'sendmail://default'
|
|
# Die Einstellung, die die Verwaltung anzeigt und ausprobiert; Tests setzen sie fest.
|
|
kant.mail_dsn: '%env(default:kant.mailer_dsn:MAILER_DSN)%'
|
|
# Die Zentrale, bei der sich jede Installation meldet (ADR 123). ZENTRALE_URL=aus schaltet ab.
|
|
kant.zentrale_default: 'https://sites.kant-it.de'
|
|
kant.zentrale_url: '%env(default:kant.zentrale_default:ZENTRALE_URL)%'
|
|
|
|
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(projectdir:DATABASE_URL)%', '@App\Infrastructure\QueryCounter']
|
|
App\Controller\PageController:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
# Mit oder ohne www entscheidet SITE_ORIGIN; die andere Schreibweise leitet dorthin um.
|
|
App\EventSubscriber\CanonicalHostSubscriber:
|
|
arguments:
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\Content\MediaLibrary:
|
|
arguments:
|
|
$directory: '%env(projectdir:MEDIA_DIRECTORY)%'
|
|
App\Content\DocumentLibrary:
|
|
arguments:
|
|
$directory: '%env(projectdir: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\EventSubscriber\PublicNotFoundSubscriber:
|
|
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)%'
|
|
# Versand und Protokoll (ADR 121). MAIL_LOG nur fuer Tests, damit sie nicht ins echte var/log
|
|
# schreiben.
|
|
App\Ops\MailCheck:
|
|
arguments:
|
|
$dsn: '%kant.mail_dsn%'
|
|
$logFile: '%env(default:kant.mail_log:MAIL_LOG)%'
|
|
App\Controller\FormController:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\EventSubscriber\ErrorLogSubscriber:
|
|
arguments:
|
|
$debug: '%kernel.debug%'
|
|
App\Controller\SeoController:
|
|
arguments:
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
$adminPath: '%kant.admin_path%'
|
|
App\Command\HealthCommand:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\Controller\MailController:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\Controller\SystemController:
|
|
arguments:
|
|
$adminPath: '%kant.admin_path%'
|
|
$databaseUrl: '%env(DATABASE_URL)%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
$mediaDirectory: '%env(projectdir:MEDIA_DIRECTORY)%'
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\Command\AdminPathCommand:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$adminPath: '%kant.admin_path%'
|
|
$environment: '%kernel.environment%'
|
|
# Eigene kurze Zeitgrenzen statt des Download-Dienstes mit denen fuer Releasearchive.
|
|
App\Ops\OriginCheck:
|
|
arguments:
|
|
$secret: '%kernel.secret%'
|
|
$download: null
|
|
# HTTPS erzwingen und HSTS (ADR 120); die Probe ueber http kommt im Test als Closure herein.
|
|
App\Ops\HttpsRedirect:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$httpProbe: null
|
|
App\Command\HttpsCommand:
|
|
arguments:
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\Command\SiteOriginCommand:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
App\Ops\ArchiveUpdate:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
App\Ops\Updater:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$databaseUrl: '%env(projectdir: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(projectdir:MEDIA_DIRECTORY)%'
|
|
$secret: '%kernel.secret%'
|
|
App\Ops\Backup:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$databaseUrl: '%env(projectdir:DATABASE_URL)%'
|
|
$mediaDirectory: '%env(projectdir:MEDIA_DIRECTORY)%'
|
|
App\Ops\SitePackage:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$mediaDirectory: '%env(projectdir: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\Zentrale:
|
|
arguments:
|
|
$root: '%kernel.project_dir%'
|
|
$url: '%kant.zentrale_url%'
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
$databaseUrl: '%env(DATABASE_URL)%'
|
|
$senden: null
|
|
App\Ops\Tasks\ZentraleTask:
|
|
arguments:
|
|
$siteOrigin: '%env(SITE_ORIGIN)%'
|
|
$projectDir: '%kernel.project_dir%'
|
|
$anstossen: null
|
|
App\EventSubscriber\RemoteUpdateFinishSubscriber:
|
|
arguments:
|
|
$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: ~
|
|
# `%env(projectdir:...)%`: ersetzt nur %kernel.project_dir%. Symfonys `resolve:` laese ein
|
|
# prozentkodiertes MySQL-Passwort (`p%40ss`) als Parameter und brauche den Container.
|
|
App\Infrastructure\ProjectDirEnvProcessor:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
App\EventSubscriber\QueryHeaderSubscriber:
|
|
arguments:
|
|
$environment: '%kernel.environment%'
|
|
|
|
App\Plugin\PluginRegistry:
|
|
arguments:
|
|
$projectDir: '%kernel.project_dir%'
|
|
|
|
App\Twig\PluginExtension:
|
|
arguments:
|
|
$loader: '@twig.loader.native_filesystem'
|
|
|
|
# Tests: das Versandprotokoll gehoert nicht nach var/log der echten Installation, und die
|
|
# Verwaltung soll einen festen SMTP-Weg als eingestellt sehen. Verschickt wird trotzdem ueber
|
|
# null://null (config/packages/test/mailer.yaml), weil derselbe Weg den Transport des
|
|
# Frameworks nimmt. Hier und nicht in config/packages/test, weil diese Datei danach geladen wird.
|
|
when@test:
|
|
parameters:
|
|
kant.mail_log: '%kernel.cache_dir%/mail.log'
|
|
kant.mail_dsn: 'smtp://cms.test:587'
|