Backups werden in config.php konfiguriert. Ohne Remote-Konfiguration funktionieren sie sofort: Ein Admin kann unter Einstellungen lokale ZIP-Backups erstellen.
Das Backup-ZIP enthält nur Betriebsdaten:
data/*.jsondata/uploads/**Nicht enthalten sind App-Dateien, config.php, bestehende Backups, Updater-Arbeitsdateien, Logs, Rate-Limit-Daten und temporäre Dateien.
Lokale Backup-ZIPs liegen in data/backups/. Mit der Standard-.htaccess ist dieses Verzeichnis nicht öffentlich lesbar.
Diese Defaults sind bereits in includes/backup.php hinterlegt. Wenn eine Installation explizite Werte benötigt, werden sie in config.php gesetzt:
define('BACKUP_DIR', DATA_DIR . 'backups/');
define('BACKUP_LOCAL_RETENTION', 4);
define('BACKUP_AUTO_INTERVAL_SECONDS', 604800);
define('BACKUP_REMOTE_TARGETS', []);
BACKUP_LOCAL_RETENTION legt fest, wie viele lokale ZIP-Dateien behalten werden. Ältere Backups werden nach einem erfolgreichen neuen Backup gelöscht.
BACKUP_AUTO_INTERVAL_SECONDS steuert automatische Backups durch Admin-Aktivität. Der Standard ist wöchentlich (604800). Mit 0 werden automatische Backups deaktiviert.
Es gibt keinen Cron-Endpunkt. Automatische Backups laufen nur, wenn ein Admin die Einstellungsseite öffnet und das Intervall abgelaufen ist.
Pfad: Admin > Einstellungen > Backups.
S3-Uploads nutzen eingebaute PHP-HTTPS-Streams und AWS Signature V4. Es ist keine Bibliothek erforderlich.
define('BACKUP_REMOTE_TARGETS', [
[
'name' => 'S3 Backup',
'type' => 's3',
'bucket' => 'example-bucket',
'region' => 'eu-central-1',
'prefix' => 'psa-orderform',
'access_key' => 'AKIA...',
'secret_key' => '...',
],
]);
Für S3-kompatiblen Speicher kann endpoint ergänzt werden:
'endpoint' => 'https://s3.example.org',
Der Objektpfad besteht aus prefix plus generiertem ZIP-Dateinamen.
SFTP benötigt die optionale PHP-SSH2-Erweiterung. Wenn die Erweiterung fehlt, funktionieren lokale Backups weiterhin; der SFTP-Upload wird als nicht verfügbar beziehungsweise fehlgeschlagen gemeldet.
Passwort-Anmeldung:
define('BACKUP_REMOTE_TARGETS', [
[
'name' => 'SFTP Backup',
'type' => 'sftp',
'host' => 'backup.example.org',
'port' => 22,
'username' => 'backup-user',
'password' => '...',
'path' => '/backups/psa-orderform',
],
]);
Key-Anmeldung:
define('BACKUP_REMOTE_TARGETS', [
[
'name' => 'SFTP Backup',
'type' => 'sftp',
'host' => 'backup.example.org',
'port' => 22,
'username' => 'backup-user',
'public_key' => __DIR__ . '/keys/backup.pub',
'private_key' => __DIR__ . '/keys/backup',
'password' => '',
'path' => '/backups/psa-orderform',
],
]);
Das Remote-Verzeichnis muss bereits existieren und für den konfigurierten Benutzer beschreibbar sein.
Ein Custom-Uploader ist ein PHP-Callback, der in config.php konfiguriert wird.
define('BACKUP_REMOTE_TARGETS', [
[
'name' => 'Custom Backup',
'type' => 'custom',
'file' => __DIR__ . '/custom-backup-uploader.php',
'callback' => 'uploadPsaOrderformBackup',
],
]);
Beispiel-Callback:
<?php
function uploadPsaOrderformBackup(string $archivePath, array $metadata, array $target)
{
$targetDir = __DIR__ . '/external-backups';
if (!is_dir($targetDir) && !mkdir($targetDir, 02775, true) && !is_dir($targetDir)) {
return [
'success' => false,
'error' => 'Target directory cannot be created.',
];
}
$remotePath = $targetDir . '/' . basename($archivePath);
if (!copy($archivePath, $remotePath)) {
return [
'success' => false,
'error' => 'Copy failed.',
];
}
return [
'remote_path' => $remotePath,
];
}
Der Callback erhält:
$archivePath: absoluter Pfad zur lokalen ZIP-Datei.$metadata: Dateiname, Erstellzeitpunkt, Auslöser und Prüfsumme.$target: das konfigurierte Ziel-Array.Für Erfolg kann true oder ein Array zurückgegeben werden. Für Fehler kann eine Exception geworfen werden. Ein Array mit 'success' => false wird als fehlgeschlagener Remote-Upload protokolliert.
Remote-Ziele können kombiniert werden:
define('BACKUP_REMOTE_TARGETS', [
[
'name' => 'Primary S3',
'type' => 's3',
'bucket' => 'example-bucket',
'region' => 'eu-central-1',
'prefix' => 'psa-orderform',
'access_key' => 'AKIA...',
'secret_key' => '...',
],
[
'name' => 'Secondary SFTP',
'type' => 'sftp',
'host' => 'backup.example.org',
'port' => 22,
'username' => 'backup-user',
'password' => '...',
'path' => '/backups/psa-orderform',
],
]);
Jedes Ziel wird unabhängig versucht.
Der Managed Backup Server ist ein separates Verzeichnis backup-server/, das auf einem zentralen Webspace bereitgestellt werden kann.
Server-Setup:
backup-server/config.sample.php nach backup-server/config.php kopieren.BACKUP_SERVER_PASSWORD ändern.backup-server/backups/ sicherstellen.backup-server/manage.php öffnen und einloggen.Der Upload-Endpunkt backup-server/upload.php benötigt keine Anmeldung. Jede verteilte Instanz muss aber einen eindeutigen instance-Wert senden, der serverseitig in der Management-Oberfläche erlaubt wurde.
Client-Konfiguration:
define('BACKUP_REMOTE_TARGETS', [
[
'name' => 'Managed Backup Server',
'type' => 'managed',
'url' => 'https://backup.example.org/upload.php',
'instance' => 'stadt-freising-prod',
],
]);
url ist die vollständige URL zu upload.php. instance darf Buchstaben, Zahlen, Punkte, Unterstriche und Bindestriche enthalten.
Die Server-Retention gilt pro Instanz. Standard ist 30; der Wert kann in backup-server/config.php und in der Management-Oberfläche geändert werden.
Uploads von unbekannten Instanzen werden abgelehnt. Entfernte Instanzen können keine neuen Backups mehr senden; bereits gespeicherte Backups bleiben in der Management-Oberfläche sichtbar.
config.php, nicht in data/settings.json.data/ muss für PHP beschreibbar sein..htaccess aktiv bleiben, damit data/backups/ nicht direkt erreichbar ist.