backups: run cron schedule per target

This commit is contained in:
Girish Ramakrishnan
2025-07-25 08:36:09 +02:00
parent 276db17f0c
commit 69cd766f88
3 changed files with 31 additions and 13 deletions

View File

@@ -43,11 +43,12 @@ const appHealthMonitor = require('./apphealthmonitor.js'),
safe = require('safetydance'),
scheduler = require('./scheduler.js'),
system = require('./system.js'),
updater = require('./updater.js');
updater = require('./updater.js'),
util = require('util');
const gJobs = {
autoUpdater: null,
backup: null,
backups: new Map(),
updateChecker: null,
systemChecks: null,
mailStatusCheck: null,
@@ -178,7 +179,6 @@ async function startJobs() {
start: true
});
gJobs.checkDomainConfigs = CronJob.from({
cronTime: `00 ${minute} 5 * * *`, // once a day
onTick: async () => await safe(domains.checkConfigs(AuditSource.CRON), { debug }),
@@ -203,7 +203,9 @@ async function startJobs() {
start: true
});
await handleBackupScheduleChanged(await backupTargets._getDefault());
for (const backupTarget of await backupTargets.list(1, 100)) {
await handleBackupScheduleChanged(backupTarget);
}
await handleAutoupdatePatternChanged(await updater.getAutoupdatePattern());
await handleDynamicDnsChanged(await network.getDynamicDns());
await handleExternalLdapChanged(await externalLdap.getConfig());
@@ -214,17 +216,24 @@ async function handleBackupScheduleChanged(target) {
const tz = await cloudron.getTimeZone();
debug(`backupPolicyChanged: schedule ${target.schedule} (${tz})`);
debug(`handleBackupScheduleChanged: schedule ${target.schedule} (${tz})`);
if (gJobs.backup) gJobs.backup.stop();
gJobs.backup = null;
if (gJobs.backups.has(target.id)) gJobs.backups.get(target.id).stop();
gJobs.backups.delete(target.id);
gJobs.backup = CronJob.from({
if (target.schedule === constants.CRON_PATTERN_NEVER) return;
const job = CronJob.from({
cronTime: target.schedule,
onTick: async () => await safe(backupTargets.startBackupTask(AuditSource.CRON), { debug }),
onTick: async () => {
const target = await backupTargets.get(target.id);
if (!target) return;
await safe(backupTargets.startBackupTask(target, AuditSource.CRON), { debug });
},
start: true,
timeZone: tz
});
gJobs.backups.set(target.id, job);
}
async function handleTimeZoneChanged(tz) {
@@ -290,9 +299,14 @@ async function handleExternalLdapChanged(config) {
}
async function stopJobs() {
for (const job in gJobs) {
if (!gJobs[job]) continue;
gJobs[job].stop();
gJobs[job] = null;
for (const jobName in gJobs) {
if (!gJobs[jobName]) continue;
if (util.types.isMap(gJobs[jobName])) {
gJobs[jobName].forEach((job) => job.stop());
gJobs[jobName] = new Map();
} else {
gJobs[jobName].stop();
gJobs[jobName] = null;
}
}
}