60a0928d2f
Sichert die SQLite-Datenbank periodisch (Standard: alle 24h) nach server/data/backups und räumt alte Sicherungen auf (Standard: 14 behalten). Zusätzlich per POST /api/backup manuell auslösbar.
43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs');
|
|
const db = require('./db');
|
|
|
|
const dataDir = path.join(__dirname, 'data');
|
|
const backupDir = path.join(dataDir, 'backups');
|
|
|
|
const INTERVAL_HOURS = Number(process.env.BACKUP_INTERVAL_HOURS) || 24;
|
|
const RETENTION_COUNT = Number(process.env.BACKUP_RETENTION_COUNT) || 14;
|
|
|
|
function timestamp() {
|
|
return new Date().toISOString().replace(/[:.]/g, '-');
|
|
}
|
|
|
|
async function runBackup() {
|
|
if (!fs.existsSync(backupDir)) fs.mkdirSync(backupDir, { recursive: true });
|
|
const target = path.join(backupDir, `data-${timestamp()}.db`);
|
|
await db.backup(target);
|
|
cleanupOldBackups();
|
|
console.log(`Backup geschrieben: ${target}`);
|
|
return target;
|
|
}
|
|
|
|
function cleanupOldBackups() {
|
|
const files = fs
|
|
.readdirSync(backupDir)
|
|
.filter((f) => f.startsWith('data-') && f.endsWith('.db'))
|
|
.sort();
|
|
const excess = files.length - RETENTION_COUNT;
|
|
for (let i = 0; i < excess; i++) {
|
|
fs.unlinkSync(path.join(backupDir, files[i]));
|
|
}
|
|
}
|
|
|
|
function startBackupScheduler() {
|
|
runBackup().catch((err) => console.error('Backup fehlgeschlagen:', err));
|
|
setInterval(() => {
|
|
runBackup().catch((err) => console.error('Backup fehlgeschlagen:', err));
|
|
}, INTERVAL_HOURS * 60 * 60 * 1000);
|
|
}
|
|
|
|
module.exports = { startBackupScheduler, runBackup };
|