feat: extend volume backup functionality with scheduling and management

- Added support for volume backup jobs in the scheduling and removal processes.
- Enhanced job management to include volume backups in the job queue.
- Updated schema to accommodate volume backup data structure.
- Implemented initialization of volume backup jobs based on server status, improving backup management.
This commit is contained in:
Mauricio Siu
2025-07-02 00:45:57 -06:00
parent 6521491e2f
commit 107cdcee49
5 changed files with 84 additions and 4 deletions
+54 -1
View File
@@ -5,6 +5,7 @@ import {
findBackupById,
findScheduleById,
findServerById,
findVolumeBackupById,
keepLatestNBackups,
runCommand,
runComposeBackup,
@@ -12,9 +13,15 @@ import {
runMongoBackup,
runMySqlBackup,
runPostgresBackup,
runVolumeBackup,
} from "@dokploy/server";
import { db } from "@dokploy/server/dist/db";
import { backups, schedules, server } from "@dokploy/server/dist/db/schema";
import {
backups,
schedules,
server,
volumeBackups,
} from "@dokploy/server/dist/db/schema";
import { and, eq } from "drizzle-orm";
import { logger } from "./logger.js";
import { scheduleJob } from "./queue.js";
@@ -93,6 +100,12 @@ export const runJobs = async (job: QueueJob) => {
if (schedule.enabled) {
await runCommand(schedule.scheduleId);
}
} else if (job.type === "volume-backup") {
const { volumeBackupId } = job;
const volumeBackup = await findVolumeBackupById(volumeBackupId);
if (volumeBackup.enabled) {
await runVolumeBackup(volumeBackupId);
}
}
} catch (error) {
logger.error(error);
@@ -184,4 +197,44 @@ export const initializeJobs = async () => {
{ Quantity: filteredSchedulesBasedOnServerStatus.length },
"Schedules Initialized",
);
const volumeBackupsResult = await db.query.volumeBackups.findMany({
where: eq(volumeBackups.enabled, true),
with: {
application: {
with: {
server: true,
},
},
compose: {
with: {
server: true,
},
},
},
});
const filteredVolumeBackupsBasedOnServerStatus = volumeBackupsResult.filter(
(volumeBackup) => {
if (volumeBackup.application) {
return volumeBackup.application.server?.serverStatus === "active";
}
if (volumeBackup.compose) {
return volumeBackup.compose.server?.serverStatus === "active";
}
},
);
for (const volumeBackup of filteredVolumeBackupsBasedOnServerStatus) {
scheduleJob({
volumeBackupId: volumeBackup.volumeBackupId,
type: "volume-backup",
cronSchedule: volumeBackup.cronExpression,
});
}
logger.info(
{ Quantity: filteredVolumeBackupsBasedOnServerStatus.length },
"Volume Backups Initialized",
);
};