backup-db.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /**
  2. * Script de sauvegarde automatique de la base de données SQLite
  3. */
  4. const fs = require('fs');
  5. const path = require('path');
  6. const { exec } = require('child_process');
  7. // Configuration
  8. const DB_PATH = process.env.DB_PATH || './data/framed.db';
  9. const BACKUP_DIR = process.env.BACKUP_DIR || './backups';
  10. const RETENTION_DAYS = process.env.RETENTION_DAYS || 7;
  11. // S'assurer que le répertoire de sauvegarde existe
  12. if (!fs.existsSync(BACKUP_DIR)) {
  13. fs.mkdirSync(BACKUP_DIR, { recursive: true });
  14. console.log(`Répertoire de sauvegarde créé: ${BACKUP_DIR}`);
  15. }
  16. // Générer un nom de fichier avec la date
  17. const now = new Date();
  18. const timestamp = now.toISOString()
  19. .replace(/[T:]/g, '-')
  20. .replace(/\..+/, '');
  21. const backupFile = path.join(BACKUP_DIR, `framed-${timestamp}.db`);
  22. // Vérifier que la base de données source existe
  23. if (!fs.existsSync(DB_PATH)) {
  24. console.error(`Erreur: La base de données source n'existe pas: ${DB_PATH}`);
  25. process.exit(1);
  26. }
  27. // Réaliser la sauvegarde
  28. console.log(`Sauvegarde de ${DB_PATH} vers ${backupFile}`);
  29. // Utiliser sqlite3 pour créer une sauvegarde via commande shell
  30. // Cette méthode garantit l'intégrité des données même si la DB est en cours d'utilisation
  31. const command = `sqlite3 "${DB_PATH}" ".backup '${backupFile}'"`;
  32. exec(command, (error, stdout, stderr) => {
  33. if (error) {
  34. console.error(`Erreur lors de la sauvegarde: ${error.message}`);
  35. return;
  36. }
  37. if (stderr) {
  38. console.error(`Avertissement: ${stderr}`);
  39. return;
  40. }
  41. console.log(`Sauvegarde réussie: ${backupFile}`);
  42. // Nettoyage des vieilles sauvegardes
  43. cleanOldBackups();
  44. });
  45. // Fonction pour supprimer les sauvegardes plus anciennes que RETENTION_DAYS
  46. function cleanOldBackups() {
  47. const files = fs.readdirSync(BACKUP_DIR);
  48. const cutoffDate = new Date();
  49. cutoffDate.setDate(cutoffDate.getDate() - RETENTION_DAYS);
  50. console.log(`Suppression des sauvegardes antérieures à ${cutoffDate.toISOString()}`);
  51. files.forEach(file => {
  52. if (!file.endsWith('.db')) return;
  53. const filePath = path.join(BACKUP_DIR, file);
  54. const stats = fs.statSync(filePath);
  55. if (stats.mtime < cutoffDate) {
  56. fs.unlinkSync(filePath);
  57. console.log(`Supprimé: ${file}`);
  58. }
  59. });
  60. console.log('Nettoyage terminé');
  61. }