From 3eb4edfe5bc667b336071bf18206b8a329d0db46 Mon Sep 17 00:00:00 2001 From: oxpoe Date: Mon, 12 Oct 2026 23:12:35 +0700 Subject: [PATCH] fix(backup): VACUUM INTO agar backup konsisten saat DB mode WAL (sebelumnya salin file mentah bisa kehilangan -wal) --- services/backupService.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/services/backupService.js b/services/backupService.js index e69c4fe..20e2af0 100644 --- a/services/backupService.js +++ b/services/backupService.js @@ -3,6 +3,7 @@ * Melakukan backup otomatis database dan settings */ const fs = require('fs'); +const Database = require('better-sqlite3'); const path = require('path'); const { logger } = require('../config/logger'); const { getSetting, getCurrentDateInTimezone, getNowLocalISO } = require('../config/settingsManager'); @@ -41,8 +42,15 @@ function backupDatabase() { const backupFileName = `billing_db_${timestamp}.db`; const backupFilePath = path.join(backupDir, backupFileName); - // Copy database file - fs.copyFileSync(dbPath, backupFilePath); + // VACUUM INTO: snapshot konsisten & aman di mode WAL + // (menyalin file mentah bisa kehilangan transaksi terbaru yang masih di -wal) + if (fs.existsSync(backupFilePath)) fs.unlinkSync(backupFilePath); + const srcDb = new Database(dbPath, { readonly: true }); + try { + srcDb.prepare('VACUUM INTO ?').run(backupFilePath); + } finally { + srcDb.close(); + } // Compress backup (optional - bisa ditambahkan nanti) const stats = fs.statSync(backupFilePath);