Fix lsur la restoration des sauvegardes

This commit is contained in:
ocroguennec committed 2026-09-19 19:09:52 +02:00
1 parent 49fab06012
commit a58a8460f7
1 file changed
+20 -9
+20 -9
View File
@@ -686,11 +686,19 @@ router.delete('/exports/:filename', (req, res, next) => {
* 2. Copie les assets (logos, icons, documents) immédiatement
* 3. Écrit la nouvelle DB dans {DB_PATH}.pending-restore
* 4. Répond au client, puis redémarre le processus (process.exit)
* → En prod (DATA_DIR défini), le restart policy Docker relance le conteneur
* → En prod (NODE_ENV=production), le restart policy Docker relance le conteneur
* qui applique le pending-restore au démarrage.
* → En local (DATA_DIR absent), aucun superviseur (node --watch / nodemon)
* ne relance automatiquement le process après un exit propre : on
* respawn nous-mêmes un process enfant détaché avant de quitter.
* → En local (NODE_ENV≠production — dev nodemon, ou tout environnement qui ne
* se déclare pas explicitement "production"), aucun superviseur externe ne
* relance automatiquement le process après un exit propre (nodemon n'auto-
* restart que sur changement de fichier) : on respawn nous-mêmes un process
* enfant détaché avant de quitter. NB (19/09/26, bug signalé par Olivier :
* "j'ai restauré, ça ne marche pas sans relancer le serveur à la main") :
* le signal utilisé ici était auparavant la présence de DATA_DIR, qui n'est
* PAS un indicateur fiable de "on tourne sous Docker avec restart policy" —
* le .env de dev local définit lui aussi DATA_DIR (pour organiser où vivent
* les données), donc la condition ne se déclenchait jamais en dev et le
* process restait mort jusqu'à un redémarrage manuel.
*/
router.post('/exports/:filename/restore', async (req, res, next) => {
const tmpDb = path.join(os.tmpdir(), `cl-pre-restore-${Date.now()}.db`);
@@ -794,11 +802,14 @@ router.post('/exports/:filename/restore', async (req, res, next) => {
// 4. Réponse puis redémarrage
res.json({ ok: true, backup: `pre-restore-backup-${ts}.zip` });
setTimeout(() => {
if (!process.env.DATA_DIR) {
// Dev local : node --watch / nodemon n'auto-restart pas après un exit
// propre (process.exit(0)) — ils attendent un changement de fichier.
// On relance donc nous-mêmes un process enfant détaché avant de quitter,
// qui appliquera le .pending-restore à son démarrage (voir db/index.js).
if (process.env.NODE_ENV !== 'production') {
// Dev local (ou tout NODE_ENV non explicitement "production") : node --watch /
// nodemon n'auto-restart pas après un exit propre (process.exit(0)) — ils
// attendent un changement de fichier. On relance donc nous-mêmes un process
// enfant détaché avant de quitter, qui appliquera le .pending-restore à son
// démarrage (voir db/index.js). Anciennement conditionné à `!process.env.DATA_DIR`,
// qui ne détectait pas fiablement l'environnement (cf. commentaire de la route
// ci-dessus) — DATA_DIR est défini en dev local aussi.
try {
const child = spawn(process.execPath, [process.argv[1]], {
cwd: process.cwd(),