/** * Script de sauvegarde automatique de la base de données SQLite */ const fs = require('fs'); const path = require('path'); const { exec } = require('child_process'); // Configuration const DB_PATH = process.env.DB_PATH || './data/framed.db'; const BACKUP_DIR = process.env.BACKUP_DIR || './backups'; const RETENTION_DAYS = process.env.RETENTION_DAYS || 7; // S'assurer que le répertoire de sauvegarde existe if (!fs.existsSync(BACKUP_DIR)) { fs.mkdirSync(BACKUP_DIR, { recursive: true }); console.log(`Répertoire de sauvegarde créé: ${BACKUP_DIR}`); } // Générer un nom de fichier avec la date const now = new Date(); const timestamp = now.toISOString() .replace(/[T:]/g, '-') .replace(/\..+/, ''); const backupFile = path.join(BACKUP_DIR, `framed-${timestamp}.db`); // Vérifier que la base de données source existe if (!fs.existsSync(DB_PATH)) { console.error(`Erreur: La base de données source n'existe pas: ${DB_PATH}`); process.exit(1); } // Réaliser la sauvegarde console.log(`Sauvegarde de ${DB_PATH} vers ${backupFile}`); // Utiliser sqlite3 pour créer une sauvegarde via commande shell // Cette méthode garantit l'intégrité des données même si la DB est en cours d'utilisation const command = `sqlite3 "${DB_PATH}" ".backup '${backupFile}'"`; exec(command, (error, stdout, stderr) => { if (error) { console.error(`Erreur lors de la sauvegarde: ${error.message}`); return; } if (stderr) { console.error(`Avertissement: ${stderr}`); return; } console.log(`Sauvegarde réussie: ${backupFile}`); // Nettoyage des vieilles sauvegardes cleanOldBackups(); }); // Fonction pour supprimer les sauvegardes plus anciennes que RETENTION_DAYS function cleanOldBackups() { const files = fs.readdirSync(BACKUP_DIR); const cutoffDate = new Date(); cutoffDate.setDate(cutoffDate.getDate() - RETENTION_DAYS); console.log(`Suppression des sauvegardes antérieures à ${cutoffDate.toISOString()}`); files.forEach(file => { if (!file.endsWith('.db')) return; const filePath = path.join(BACKUP_DIR, file); const stats = fs.statSync(filePath); if (stats.mtime < cutoffDate) { fs.unlinkSync(filePath); console.log(`Supprimé: ${file}`); } }); console.log('Nettoyage terminé'); }