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 * 2. Copie les assets (logos, icons, documents) immédiatement
* 3. Écrit la nouvelle DB dans {DB_PATH}.pending-restore * 3. Écrit la nouvelle DB dans {DB_PATH}.pending-restore
* 4. Répond au client, puis redémarre le processus (process.exit) * 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. * qui applique le pending-restore au démarrage.
* → En local (DATA_DIR absent), aucun superviseur (node --watch / nodemon) * → En local (NODE_ENV≠production — dev nodemon, ou tout environnement qui ne
* ne relance automatiquement le process après un exit propre : on * se déclare pas explicitement "production"), aucun superviseur externe ne
* respawn nous-mêmes un process enfant détaché avant de quitter. * 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) => { router.post('/exports/:filename/restore', async (req, res, next) => {
const tmpDb = path.join(os.tmpdir(), `cl-pre-restore-${Date.now()}.db`); 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 // 4. Réponse puis redémarrage
res.json({ ok: true, backup: `pre-restore-backup-${ts}.zip` }); res.json({ ok: true, backup: `pre-restore-backup-${ts}.zip` });
setTimeout(() => { setTimeout(() => {
if (!process.env.DATA_DIR) { if (process.env.NODE_ENV !== 'production') {
// Dev local : node --watch / nodemon n'auto-restart pas après un exit // Dev local (ou tout NODE_ENV non explicitement "production") : node --watch /
// propre (process.exit(0)) — ils attendent un changement de fichier. // nodemon n'auto-restart pas après un exit propre (process.exit(0)) — ils
// On relance donc nous-mêmes un process enfant détaché avant de quitter, // attendent un changement de fichier. On relance donc nous-mêmes un process
// qui appliquera le .pending-restore à son démarrage (voir db/index.js). // 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 { try {
const child = spawn(process.execPath, [process.argv[1]], { const child = spawn(process.execPath, [process.argv[1]], {
cwd: process.cwd(), cwd: process.cwd(),