diff --git a/bin/push-docker-image.sh b/bin/push-docker-image.sh old mode 100644 new mode 100755 diff --git a/db/migrations/0108__new_backup_options.sql b/db/migrations/0108__new_backup_options.sql new file mode 100644 index 000000000..4a4cb94d9 --- /dev/null +++ b/db/migrations/0108__new_backup_options.sql @@ -0,0 +1,9 @@ +UPDATE options SET name = 'lastDailyBackupDate' WHERE name = 'lastBackupDate'; + +INSERT INTO options (name, value, dateCreated, dateModified, isSynced) +VALUES ('lastWeeklyBackupDate', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0); + +INSERT INTO options (name, value, dateCreated, dateModified, isSynced) +VALUES ('lastMonthlyBackupDate', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', '2018-07-29T18:31:00.874Z', 0); + +-- these options are not synced so no need to fix sync rows \ No newline at end of file diff --git a/src/services/app_info.js b/src/services/app_info.js index 40b2f7a8e..6ec279739 100644 --- a/src/services/app_info.js +++ b/src/services/app_info.js @@ -3,7 +3,7 @@ const build = require('./build'); const packageJson = require('../../package'); -const APP_DB_VERSION = 107; +const APP_DB_VERSION = 108; const SYNC_VERSION = 1; module.exports = { diff --git a/src/services/backup.js b/src/services/backup.js index 865f9ad6b..5b9831183 100644 --- a/src/services/backup.js +++ b/src/services/backup.js @@ -10,49 +10,32 @@ const syncMutexService = require('./sync_mutex'); const cls = require('./cls'); async function regularBackup() { - const now = new Date(); - const lastBackupDate = dateUtils.parseDateTime(await optionService.getOption('lastBackupDate')); + await periodBackup('lastDailyBackupDate', 'daily', 24 * 3600); - console.log(lastBackupDate); + await periodBackup('lastWeeklyBackupDate', 'weekly', 7 * 24 * 3600); - if (now.getTime() - lastBackupDate.getTime() > 43200 * 1000) { - await backupNow(); - } - - await cleanupOldBackups(); + await periodBackup('lastMonthlyBackupDate', 'monthly', 30 * 24 * 3600); } -async function backupNow() { - // we don't want to backup DB in the middle of sync with potentially inconsistent DB state +async function periodBackup(optionName, fileName, periodInSeconds) { + const now = new Date(); + const lastDailyBackupDate = dateUtils.parseDateTime(await optionService.getOption(optionName)); + if (now.getTime() - lastDailyBackupDate.getTime() > periodInSeconds * 1000) { + await backupNow(fileName); + + await optionService.setOption(optionName, dateUtils.nowDate()); + } +} + +async function backupNow(name) { + // we don't want to backup DB in the middle of sync with potentially inconsistent DB state await syncMutexService.doExclusively(async () => { - const backupFile = dataDir.BACKUP_DIR + "/" + "backup-" + dateUtils.getDateTimeForFile() + ".db"; + const backupFile = `${dataDir.BACKUP_DIR}/backup-${name}.db`; fs.copySync(dataDir.DOCUMENT_PATH, backupFile); log.info("Created backup at " + backupFile); - - await optionService.setOption('lastBackupDate', dateUtils.nowDate()); - }); -} - -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); - } - } }); } diff --git a/src/services/migration.js b/src/services/migration.js index 8498cb820..a863c457d 100644 --- a/src/services/migration.js +++ b/src/services/migration.js @@ -10,7 +10,7 @@ async function migrate() { const migrations = []; // backup before attempting migration - await backupService.backupNow(); + await backupService.backupNow("before-migration"); const currentDbVersion = parseInt(await optionService.getOption('dbVersion')); diff --git a/src/services/options_init.js b/src/services/options_init.js index c8ab364df..9c3fa41bc 100644 --- a/src/services/options_init.js +++ b/src/services/options_init.js @@ -31,7 +31,9 @@ async function initSyncedOptions(username, password) { async function initNotSyncedOptions(initialized, startNotePath = 'root', syncServerHost = '', syncProxy = '') { await optionService.createOption('startNotePath', startNotePath, false); - await optionService.createOption('lastBackupDate', dateUtils.nowDate(), false); + await optionService.createOption('lastDailyBackupDate', dateUtils.nowDate(), false); + await optionService.createOption('lastWeeklyBackupDate', dateUtils.nowDate(), false); + await optionService.createOption('lastMonthlyBackupDate', dateUtils.nowDate(), false); await optionService.createOption('dbVersion', appInfo.dbVersion, false); await optionService.createOption('lastSyncedPull', 0, false);