trilium/services/backup.js
2017-11-02 20:48:02 -04:00

65 lines
1.5 KiB
JavaScript

"use strict";
const utils = require('./utils');
const options = require('./options');
const fs = require('fs-extra');
const dataDir = require('./data_dir');
const log = require('./log');
async function regularBackup() {
const now = utils.nowTimestamp();
const last_backup_date = parseInt(await options.getOption('last_backup_date'));
if (now - last_backup_date > 43200) {
await backupNow();
}
await cleanupOldBackups();
}
async function backupNow() {
const now = utils.nowTimestamp();
const date_str = new Date().toISOString().substr(0, 19);
const backupFile = dataDir.BACKUP_DIR + "/" + "backup-" + date_str + ".db";
fs.copySync(dataDir.DOCUMENT_PATH, backupFile);
log.info("Created backup at " + backupFile);
await options.setOption('last_backup_date', now);
}
async function cleanupOldBackups() {
const now = new Date();
fs.readdirSync(dataDir.BACKUP_DIR).forEach(file => {
const match = file.match(/backup-([0-9 -:]+)\.db/);
if (match) {
const date_str = match[1];
const date = Date.parse(date_str);
if (now.getTime() - date.getTime() > 30 * 24 * 3600 * 1000) {
log.info("Removing old backup - " + file);
fs.unlink(dataDir.BACKUP_DIR + "/" + file);
}
}
});
}
if (!fs.existsSync(dataDir.BACKUP_DIR)) {
fs.mkdirSync(dataDir.BACKUP_DIR, 0o700);
}
setInterval(regularBackup, 60 * 60 * 1000);
// kickoff backup immediately
setTimeout(regularBackup, 1000);
module.exports = {
backupNow
};