# Update und Backup ## Überblick Updates und Backups laufen über den **Manage-Client** in `manage-client/`. Der Client holt Releases von einem zentralen Manage-Server, rollt sie über die Installation aus und lädt Backups der Betriebsdaten dorthin hoch. Der Client ist ein fertiges Paket und wird pro Projekt gepflegt. Seine vollständige Dokumentation liegt unter (maschinenlesbar: `llms.php`); dieses Dokument beschreibt nur, wie er in diesem Projekt eingebunden ist. Er ersetzt die früheren Komponenten `includes/backup.php`, `admin/updater.php`, `backup-server/` und `update-server/`, die vollständig entfernt wurden. ## Bestandteile im Projekt | Pfad | Zweck | |---|---| | `manage-client/lib/` | die Bibliothek; `lib/client.php` ist der einzige Einstiegspunkt | | `manage-client/bin/manage-client.php` | Kommandozeile für Cron und Shell | | `manage-client/ui/panel.php` | die Oberfläche, eingebunden von `admin/manage.php` | | `manage-client/config.php` | Serveradresse, Instanz, Token, Backup-Quellen — **nicht** im Repository, **nicht** im Release-Paket | | `manage-client/config.sample.php` | Vorlage dafür | | `admin/manage.php` | Adminseite „Update & Backup“ (prüft den Login, bindet dann das Panel ein) | | `includes/after-update.php` | Post-Update-Hook (`psaAfterUpdate`) | | `includes/manage-activity.php` | Cron-Ersatz: Backup und Statusmeldung durch Adminaktivität | | `migrations/` | einmalige Migrationsskripte, die mit einem Release ausgeliefert werden | | `scripts/create-release-zip.sh` | baut das Release-ZIP | Laufzeitdaten liegen unter `data/manage/` (`backups/`, `updates/`, `work/`, `migrations.json`, `manage-client.log`, `activity.json`) und sind über die `.htaccess` im Projektwurzelverzeichnis nicht über das Web erreichbar. ## Konfiguration (`manage-client/config.php`) Die drei Verbindungswerte stammen aus dem Manage-Server; der Token wird beim Anlegen der Instanz **einmalig** angezeigt: ```php define("MANAGE_SERVER_URL", "https://manage.med0.de"); define("MANAGE_INSTANCE", "psa-..."); define("MANAGE_TOKEN", "..."); ``` Projektspezifisch gesetzt sind außerdem: | Konstante | Wert in diesem Projekt | |---|---| | `MANAGE_VERSION_FILE` / `MANAGE_VERSION_CONSTANT` | `includes/version.php` mit `APP_VERSION` | | `MANAGE_UPDATE_PROTECTED_PATHS` | `config.php`, `data/`, `.git/`, `manage-client/config.php` | | `MANAGE_UPDATE_SANITY_PATHS` | `index.php`, `includes/functions.php` | | `MANAGE_UPDATE_POST_HOOK` | `includes/after-update.php` → `psaAfterUpdate()` | | `MANAGE_BACKUP_SOURCES` | `data/*.json`, `data/uploads/**`, `data/manage/migrations.json` | | `MANAGE_BACKUP_DATABASE` | `null` — reines Flat-File-Projekt | | `MANAGE_BACKUP_LOCAL_RETENTION` | 4 lokale Archive | | `MANAGE_BACKUP_AUTO_INTERVAL_SECONDS` | 604800 (wöchentlich) | | `MANAGE_HTTP_TIMEOUT` | 5 Sekunden — die Einstellungsseite ruft das Manifest beim Rendern ab | `config.php` der Anwendung enthält **keine** Update- oder Backup-Konstanten mehr. ## Bedienung im Admin - **Einstellungen** zeigt Version, Update-Verfügbarkeit, letztes Backup und offene Migrationen und verlinkt auf die Vollansicht. - **Update & Backup** (`admin/manage.php`) bietet: Backup erstellen, Update ausrollen, Migrationen nachholen, Status melden, lokale Backups herunterladen. - Das Dashboard (`admin/index.php`) stößt die periodischen Aufgaben an, siehe unten. ## Ohne Cron: Auslösung durch Adminaktivität Auf dieser Installation steht in der Regel kein Cron zur Verfügung. Die beiden Aufgaben, die sonst geplant laufen würden, hängen deshalb an der Adminaktivität: `admin/index.php` ruft beim Aufruf `manageActivityRunDueTasks()` aus [`includes/manage-activity.php`](../includes/manage-activity.php) auf. Der Login leitet immer auf das Dashboard, jede Adminsitzung kommt also dort vorbei. | Aufgabe | Intervall | Konstante | |---|---|---| | Automatisches Backup | wöchentlich | `MANAGE_BACKUP_AUTO_INTERVAL_SECONDS` | | Statusmeldung (Heartbeat) | stündlich | `MANAGE_ACTIVITY_HEARTBEAT_INTERVAL` | Ist das Intervall noch nicht abgelaufen, passiert nichts. Nach einem frisch erstellten Backup wird die Statusmeldung unabhängig vom Intervall gesendet, damit der Manage-Server nicht bis zu eine Stunde lang ein veraltetes „letztes Backup“ anzeigt. Der Zeitstempel der letzten Statusmeldung steht in `data/manage/activity.json` und wird **vor** dem Request geschrieben: ein nicht erreichbarer Manage-Server kostet dadurch einen Versuch pro Intervall, nicht einen pro Seitenaufruf. Keine der beiden Aufgaben kann die Seite abbrechen — Fehler landen im Client-Log (`data/manage/manage-client.log`), ein fehlgeschlagenes Backup zusätzlich als Hinweis auf dem Dashboard. Die Update-Prüfung braucht keine eigene Auslösung: die Einstellungsseite und `admin/manage.php` holen das Manifest beim Rendern. ## Cron Nur relevant, wenn auf einer Installation doch Cron zur Verfügung steht - dann sind die Kommandos der zuverlässigere Weg und die Auslösung durch Adminaktivität greift nur noch selten ein: ```cron 20 3 * * * /usr/bin/php /pfad/zum/projekt/manage-client/bin/manage-client.php backup --trigger=cron --quiet 7 * * * * /usr/bin/php /pfad/zum/projekt/manage-client/bin/manage-client.php heartbeat --quiet 0 8 * * 1-5 /usr/bin/php /pfad/zum/projekt/manage-client/bin/manage-client.php check --quiet ``` Exitcodes: `0` Erfolg, `1` Fehler, `2` Update verfügbar (nur `check`). Updates werden bewusst **nicht** automatisch installiert. ## Release bauen und veröffentlichen ```bash ./scripts/create-release-zip.sh v1.3.15 ``` Das Skript schreibt die Version nach `includes/version.php`, packt alle von Git verwalteten Dateien abzüglich der Ausschlussliste (`config.php`, `manage-client/config.php`, `data/`, `build/`, `scripts/`) nach `build/releases/psa-orderform-vX.Y.Z.zip` und gibt SHA-256 und Größe aus. Das ZIP wird im Manage-Server unter **Releases** hochgeladen; Prüfsumme und Größe berechnet der Server selbst. Die Wurzel des ZIP **ist** das Anwendungsverzeichnis — kein zusätzlicher Oberordner. ## Migrationen Migrationen liegen in `migrations/` und werden mit dem Release ausgeliefert. Sie laufen in Dateinamenreihenfolge, jeweils genau einmal; der Stand steht in `data/manage/migrations.json`. ```php