{"id":1825,"date":"2026-03-24T08:32:48","date_gmt":"2026-03-24T07:32:48","guid":{"rendered":"https:\/\/wiki.ad-libitum.info\/?page_id=1825"},"modified":"2026-03-24T08:38:48","modified_gmt":"2026-03-24T07:38:48","slug":"updater-bundle","status":"publish","type":"page","link":"https:\/\/wiki.ad-libitum.info\/?page_id=1825","title":{"rendered":"Updater-Bundle"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Adlib Updater Bundle<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Ein schlankes Symfony-Bundle zum Pr\u00fcfen und Ausf\u00fchren von Updates in bestehenden Symfony-Projekten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation (manuell, ohne Flex-Recipe)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Das Repository in der <code>composer.json<\/code> deines Zielprojekts hinzuf\u00fcgen:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   \"repositories\": &#91;\n       {\n           \"type\": \"vcs\",\n           \"url\": \"https:\/\/github.com\/Odido\/programname.git\"\n       }\n   ],<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Vorab-Konfiguration anlegen (Wichtig!):<\/strong><br>Damit die Installation ohne Fehler durchl\u00e4uft (wegen des automatischen <code>cache:clear<\/code>), erstelle <strong>zuerst<\/strong> die Datei <code>config\/packages\/adlib_updater.yaml<\/code> in deinem Projekt:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   adlib_updater:\n     # MANDATORY: Die URL zu deinem GitHub Repository\n     update_url: 'https:\/\/github.com\/Odido\/project-url' \n\n     # OPTIONAL: GitHub Token f\u00fcr private Repositories\n     github_token: '%env(GITHUB_TOKEN)%' \n\n     # OPTIONAL: Pfade (Standardwerte werden hier gezeigt)\n     target_dir: '%kernel.project_dir%'\n     temp_dir: '%kernel.project_dir%\/var\/updater'<\/code><\/pre>\n\n<p>Die <code>update_url<\/code> ist die URL zu dem Projekt, das upgedated werden soll.<\/p>\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Bundle installieren:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   composer require adlib\/updater-bundle<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Bundle registrieren (falls keine Auto-Discovery\/Flex):<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   \/\/ config\/bundles.php\n   return &#91;\n       Adlib\\UpdaterBundle\\AdlibUpdaterBundle::class =&gt; &#91;'all' =&gt; true],\n   ];<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Twig in deinem Template nutzen (Beispiel Header\/Banner):<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>   {% if updater_has_update() %}\n       &lt;div class=\"alert alert-warning\"&gt;\n           Es ist eine neue Version {{ updater_remote_version() }} verf\u00fcgbar.\n           &lt;form action=\"{{ path('adlib_updater_run') }}\" method=\"post\" style=\"display:inline;\"&gt;\n               &lt;button class=\"btn btn-sm btn-primary\"&gt;Update jetzt ausf\u00fchren&lt;\/button&gt;\n           &lt;\/form&gt;\n       &lt;\/div&gt;\n   {% endif %}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funktionsweise (GitHub-Integration)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Version-Check:<\/strong> Das Bundle fragt die GitHub API (<code>api.github.com\/repos\/...\/tags<\/code>) ab und vergleicht den neuesten Tag (z.B. <code>v1.2.3<\/code>) mit deiner <code>VERSION<\/code> in der <code>.env<\/code>.<\/li>\n\n\n\n<li><strong>Download:<\/strong> Bei einem Update wird das ZIP-Archiv des Tags von GitHub heruntergeladen (<code>\/archive\/refs\/tags\/v{version}.zip<\/code>).<\/li>\n\n\n\n<li><strong>Backup:<\/strong> Vor der Installation werden die Ordner <code>src<\/code>, <code>templates<\/code>, <code>config<\/code>, <code>public<\/code>, <code>translations<\/code> und <code>assets<\/code> sowie die <code>.env<\/code> in einen Zeitstempel-Ordner unter <code>var\/updater\/backup_...<\/code> gesichert.<\/li>\n\n\n\n<li><strong>Installation:<\/strong> Das ZIP wird entpackt und der Inhalt (Source-Code) \u00fcber deine bestehenden Dateien dr\u00fcberkopiert.<\/li>\n\n\n\n<li><strong>Rollback:<\/strong> Tritt beim Entpacken oder Kopieren ein Fehler auf, wird automatisch der Zustand aus dem Backup wiederhergestellt. Bei einem totalen Systemausfall kann das Rollback auch manuell \u00fcber die Konsole gestartet werden: <code>php bin\/console adlib:updater:rollback<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wie funktioniert&#8217;s?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Beim erfolgreichen Login l\u00f6st <code>UpdateCheckSubscriber<\/code> eine Abfrage der Remote-Version aus (via GitHub API <code>\/tags<\/code>).<\/li>\n\n\n\n<li>Ist die Remote-Version (der neueste Tag) gr\u00f6\u00dfer als <code>VERSION<\/code> aus deiner <code>.env<\/code>, wird in der Session ein Flag gesetzt.<\/li>\n\n\n\n<li>\u00dcber die Twig-Extension kannst du den Status abfragen und einen Button anzeigen.<\/li>\n\n\n\n<li>Der <code>UpdateController<\/code> startet den Update-Prozess (<code>UpdateManager<\/code>). Bei Fehlern wird automatisch ein Rollback versucht und alles geloggt.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Console-Befehle<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Rollback (Manuell)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sollte die Anwendung nach einem Update nicht mehr erreichbar sein, kann ein Rollback \u00fcber die Kommandozeile durchgef\u00fchrt werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php bin\/console adlib:updater:rollback<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Verhalten:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ohne weitere Optionen sucht der Befehl automatisch nach dem aktuellsten Backup im konfigurierten <code>temp_dir<\/code> (Standard: <code>var\/updater\/backup_...<\/code>).<\/li>\n\n\n\n<li>Es wird eine Sicherheitsabfrage angezeigt, bevor die Dateien wiederhergestellt werden.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Optionen:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>--backup-dir=\/pfad\/zum\/backup<\/code>: Erm\u00f6glicht die Angabe eines spezifischen Backup-Ordners, falls nicht das aktuellste Backup verwendet werden soll.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Logging<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Bundle nutzt den Standard-Logger von Symfony und verwendet einen eigenen Kanal namens <code>updater<\/code>. Dieser Kanal wird vom Bundle automatisch registriert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das <code>symfony\/monolog-bundle<\/code> ist als Abh\u00e4ngigkeit definiert und wird automatisch mitinstalliert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konfiguration (Beispiel)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Um alle Meldungen des Updaters in eine separate Datei zu schreiben, kannst du in deiner <code>config\/packages\/monolog.yaml<\/code> einen neuen Handler hinzuf\u00fcgen. Achte hierbei auf den when@level:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>monolog:\n    handlers:\n        updater:\n            type: stream\n            path: \"%kernel.logs_dir%\/updater.log\"\n            level: info\n            channels: &#91;\"updater\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Falls du keine separate Datei m\u00f6chtest, stelle sicher, dass deine Standard-Handler den Kanal <code>updater<\/code> nicht ausschlie\u00dfen und das Log-Level auf <code>info<\/code> (oder niedriger) steht, besonders in der <code>prod<\/code>-Umgebung. Die Logdateien finden sich, wenn die Standardeinstellungen in config\/packages\/monolog.yaml nicht ge\u00e4ndert wurden, unter var\/log.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TODO \/ Erweiterungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Implementierung des echten Download\/Backup\/Rollback-Flows (Tar\/Zip), Checksummen, Wartungsmodus.<\/li>\n\n\n\n<li>Ratenbegrenzung der Update-Pr\u00fcfung (z.B. 1x pro Prozessstart o. Session).<\/li>\n\n\n\n<li>Ausgelagerter Update-Status (Cache\/DB) anstatt Session, wenn gew\u00fcnscht.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Adlib Updater Bundle Ein schlankes Symfony-Bundle zum Pr\u00fcfen und Ausf\u00fchren von Updates in bestehenden Symfony-Projekten. Installation (manuell, ohne Flex-Recipe) Die update_url ist die URL zu dem Projekt, das upgedated werden soll. Twig in deinem Template nutzen (Beispiel Header\/Banner): Funktionsweise (GitHub-Integration) Wie funktioniert&#8217;s? Console-Befehle Rollback (Manuell) Sollte die Anwendung nach einem Update nicht mehr erreichbar sein, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1825","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1825"}],"version-history":[{"count":4,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1825\/revisions"}],"predecessor-version":[{"id":1829,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1825\/revisions\/1829"}],"wp:attachment":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}