Amélioration des restaurations
This commit is contained in:
1 parent
842f8c47b9
commit
c1ebb1537f
4 files changed
+362
-3
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user