Ajoute les mises à jour autonomes

Les installations hors YunoHost peuvent désormais vérifier et installer une release Forgejo avec sauvegarde et retour arrière complet.
This commit is contained in:
Alexandre NOEL 2026-09-08 20:13:55 +02:00
commit 53e79a72d7
25 changed files with 1146 additions and 61 deletions

View file

@ -17,8 +17,16 @@ final class BackupService
throw new RuntimeException(t('service.backup.directory_failed'));
}
$stamp = (new DateTimeImmutable('now', new DateTimeZone('Europe/Paris')))->format('Ymd-His');
$suffix = $reason === 'pre-restore' ? '-avant-restauration' : '';
$suffix = match ($reason) {
'pre-restore' => '-avant-restauration',
'pre-update' => '-avant-mise-a-jour',
'pre-rollback' => '-avant-retour-arriere',
default => '',
};
$target = $backupDir . '/globinours-' . $stamp . $suffix . '.zip';
if (is_file($target)) {
$target = $backupDir . '/globinours-' . $stamp . $suffix . '-' . bin2hex(random_bytes(2)) . '.zip';
}
// Certains volumes synchronisés acceptent les ZIP mais SQLite ne peut pas
// y créer de base avec VACUUM INTO. Le snapshot transitoire appartient au
// répertoire temporaire système ; seule l'archive finale va dans backups/.
@ -85,7 +93,7 @@ final class BackupService
{
if (
$name !== basename($name) ||
!preg_match('/^globinours-[0-9]{8}-[0-9]{6}(?:-avant-restauration)?\.zip$/', $name)
!preg_match('/^globinours-[0-9]{8}-[0-9]{6}(?:-avant-(?:restauration|mise-a-jour|retour-arriere))?(?:-[a-f0-9]{4})?\.zip$/', $name)
) {
return null;
}
@ -445,7 +453,15 @@ final class BackupService
$files = glob($dir . '/globinours-*.zip') ?: [];
usort($files, static fn($a, $b) => filemtime($b) <=> filemtime($a));
$keep = class_exists(AppSettings::class) ? AppSettings::int('backup_retention', 1, 50) : 10;
foreach (array_slice($files, $keep) as $file) {
$regularKept = 0;
foreach ($files as $file) {
$protectedRollback =
(str_contains(basename($file), '-avant-mise-a-jour') ||
str_contains(basename($file), '-avant-retour-arriere')) &&
time() - (filemtime($file) ?: 0) < 7 * 86400;
if ($protectedRollback || ++$regularKept <= $keep) {
continue;
}
@unlink($file);
}
}