mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
- Add serverId parameter to keepLatestNBackups function - Execute backup retention commands on the specific server for each database type - Remove global backup retention call in favor of per-database type retention
116 lines
3.2 KiB
TypeScript
116 lines
3.2 KiB
TypeScript
import {
|
|
cleanUpDockerBuilder,
|
|
cleanUpSystemPrune,
|
|
cleanUpUnusedImages,
|
|
findBackupById,
|
|
findServerById,
|
|
keepLatestNBackups,
|
|
runMariadbBackup,
|
|
runMongoBackup,
|
|
runMySqlBackup,
|
|
runPostgresBackup,
|
|
} from "@dokploy/server";
|
|
import { db } from "@dokploy/server/dist/db";
|
|
import { backups, server } from "@dokploy/server/dist/db/schema";
|
|
import { eq } from "drizzle-orm";
|
|
import { logger } from "./logger.js";
|
|
import { scheduleJob } from "./queue.js";
|
|
import type { QueueJob } from "./schema.js";
|
|
|
|
export const runJobs = async (job: QueueJob) => {
|
|
try {
|
|
if (job.type === "backup") {
|
|
const { backupId } = job;
|
|
const backup = await findBackupById(backupId);
|
|
const { databaseType, postgres, mysql, mongo, mariadb } = backup;
|
|
|
|
if (databaseType === "postgres" && postgres) {
|
|
const server = await findServerById(postgres.serverId as string);
|
|
if (server.serverStatus === "inactive") {
|
|
logger.info("Server is inactive");
|
|
return;
|
|
}
|
|
await runPostgresBackup(postgres, backup);
|
|
await keepLatestNBackups(backup, server.serverId);
|
|
} else if (databaseType === "mysql" && mysql) {
|
|
const server = await findServerById(mysql.serverId as string);
|
|
if (server.serverStatus === "inactive") {
|
|
logger.info("Server is inactive");
|
|
return;
|
|
}
|
|
await runMySqlBackup(mysql, backup);
|
|
await keepLatestNBackups(backup, server.serverId);
|
|
} else if (databaseType === "mongo" && mongo) {
|
|
const server = await findServerById(mongo.serverId as string);
|
|
if (server.serverStatus === "inactive") {
|
|
logger.info("Server is inactive");
|
|
return;
|
|
}
|
|
await runMongoBackup(mongo, backup);
|
|
await keepLatestNBackups(backup, server.serverId);
|
|
} else if (databaseType === "mariadb" && mariadb) {
|
|
const server = await findServerById(mariadb.serverId as string);
|
|
if (server.serverStatus === "inactive") {
|
|
logger.info("Server is inactive");
|
|
return;
|
|
}
|
|
await runMariadbBackup(mariadb, backup);
|
|
await keepLatestNBackups(backup, server.serverId);
|
|
}
|
|
}
|
|
if (job.type === "server") {
|
|
const { serverId } = job;
|
|
const server = await findServerById(serverId);
|
|
if (server.serverStatus === "inactive") {
|
|
logger.info("Server is inactive");
|
|
return;
|
|
}
|
|
await cleanUpUnusedImages(serverId);
|
|
await cleanUpDockerBuilder(serverId);
|
|
await cleanUpSystemPrune(serverId);
|
|
}
|
|
} catch (error) {
|
|
logger.error(error);
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
export const initializeJobs = async () => {
|
|
logger.info("Setting up Jobs....");
|
|
|
|
const servers = await db.query.server.findMany({
|
|
where: eq(server.enableDockerCleanup, true),
|
|
});
|
|
|
|
for (const server of servers) {
|
|
const { serverId } = server;
|
|
scheduleJob({
|
|
serverId,
|
|
type: "server",
|
|
cronSchedule: "0 0 * * *",
|
|
});
|
|
}
|
|
|
|
logger.info({ Quantity: servers.length }, "Servers Initialized");
|
|
|
|
const backupsResult = await db.query.backups.findMany({
|
|
where: eq(backups.enabled, true),
|
|
with: {
|
|
mariadb: true,
|
|
mysql: true,
|
|
postgres: true,
|
|
mongo: true,
|
|
},
|
|
});
|
|
|
|
for (const backup of backupsResult) {
|
|
scheduleJob({
|
|
backupId: backup.backupId,
|
|
type: "backup",
|
|
cronSchedule: backup.schedule,
|
|
});
|
|
}
|
|
logger.info({ Quantity: backupsResult.length }, "Backups Initialized");
|
|
};
|