: les sauvegardes changent de granularité, du conteneur au projet
v0.18.0-beta
Changement majeur
- ⚠️ BREAKING : les sauvegardes changent de granularité, du conteneur au projet.
run-backupetrestore-backupvisaient jusqu'ici une app individuelle (une ligne de sauvegarde par conteneur du projet, ex. "db", "web", "cache"), alors qu'un conteneur est reconstructible depuis son image et n'a rien de significatif à sauvegarder. La commande dorénavant : (1) archive les données réelles de chaque volume Docker nommé du projet (via un conteneur jetable qui monte le volume et le tar - avant, seul le dossier compose était archivé, jamais les données des volumes eux-mêmes), (2) dump la base managée si le projet en a une, (3) regroupe le tout dans une seule archive tar.gz par run. La restauration réapplique le bundle puis relance TOUS les services du projet (docker compose restart), plus seulement l'app ciblée. Le hub ne référence plusappSlugsur ces deux commandes ; un ancien agent qui recevrait le nouveau payload ignoreraitvolumeNames(champ inconnu) et tenterait un dump DB seul si présent, sans échouer bruyamment - mais la mise à jour de l'agent reste nécessaire pour un backup complet. - Correctif (auto-review avant merge) :
run-backup/restore-backupne prenaient plus aucun verrou. Le mutex par commande était indexé uniquement surappSlug; ces deux commandes n'en envoient plus (elles sont désormais scopées projet), donc elles tournaient sans aucune exclusion mutuelle - deux restaurations concurrentes sur le même projet pouvaient interférer sur les mêmes volumes. Le dispatcher verrouille maintenant aussi surprojectSlug(verrou projet pris avant le verrou app, ordre fixe partout, pas de deadlock possible). - Correctif (auto-review avant merge) : une restauration sur une archive corrompue/étrangère se rapportait comme réussie. Si aucune entrée de l'archive ne correspondait au format attendu (
volume-*.tar.gzoudb.sql.gz- imbrication inattendue, archive tronquée, format différent),restore-backupcontinuait quand même et renvoyait un succès avec zéro volume/BDD restauré. La commande échoue désormais explicitement dans ce cas.