Amélioration des restaurations

This commit is contained in:
ocroguennec committed 2026-08-15 10:00:19 +02:00
1 parent 842f8c47b9
commit c1ebb1537f
4 files changed
+362 -3

No files matched your search

+27 -2
View File
@@ -4,6 +4,7 @@ import { z } from 'zod';
import fs from 'node:fs';
import path from 'node:path';
import os from 'node:os';
import { spawn } from 'node:child_process';
import { fileURLToPath } from 'node:url';
import db from '../db/index.js';
import Database from 'better-sqlite3';
@@ -599,7 +600,11 @@ router.delete('/exports/:filename', (req, res, next) => {
* 2. Copie les assets (logos, icons) immédiatement
* 3. Écrit la nouvelle DB dans {DB_PATH}.pending-restore
* 4. Répond au client, puis redémarre le processus (process.exit)
* → Docker/nodemon relance le serveur qui applique le pending-restore au démarrage
* → En prod (DATA_DIR défini), 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.
*/
router.post('/exports/:filename/restore', async (req, res, next) => {
const tmpDb = path.join(os.tmpdir(), `cl-pre-restore-${Date.now()}.db`);
@@ -691,7 +696,27 @@ 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(() => process.exit(0), 300);
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).
try {
const child = spawn(process.execPath, [process.argv[1]], {
cwd: process.cwd(),
env: process.env,
detached: true,
stdio: 'ignore',
windowsHide: true,
});
child.unref();
} catch (e) {
console.error('[restore] échec du respawn local du serveur :', e);
}
}
process.exit(0);
}, 300);
} catch (e) {
next(e);
} finally {