import { findVolumeBackupById } from "@dokploy/server/services/volume-backups"; import { createDeploymentVolumeBackup, execAsync, execAsyncRemote, updateDeploymentStatus, } from "../.."; import { backupVolume } from "./backup"; import { scheduleJob, scheduledJobs } from "node-schedule"; export const scheduleVolumeBackup = async (volumeBackupId: string) => { const volumeBackup = await findVolumeBackupById(volumeBackupId); scheduleJob(volumeBackupId, volumeBackup.cronExpression, async () => { await runVolumeBackup(volumeBackupId); }); }; export const removeVolumeBackupJob = async (volumeBackupId: string) => { const currentJob = scheduledJobs[volumeBackupId]; currentJob?.cancel(); }; export const runVolumeBackup = async (volumeBackupId: string) => { const volumeBackup = await findVolumeBackupById(volumeBackupId); const serverId = volumeBackup.application?.serverId || volumeBackup.compose?.serverId; const deployment = await createDeploymentVolumeBackup({ volumeBackupId: volumeBackup.volumeBackupId, title: "Volume Backup", description: "Volume Backup", }); try { const command = await backupVolume(volumeBackup); const commandWithLog = `(${command}) >> ${deployment.logPath} 2>&1`; if (serverId) { await execAsyncRemote(serverId, commandWithLog); } else { await execAsync(commandWithLog); } await updateDeploymentStatus(deployment.deploymentId, "done"); } catch (error) { await updateDeploymentStatus(deployment.deploymentId, "error"); console.error(error); } };