Skip to content

Commit 7ed0282

Browse files
authored
Merge pull request #1223 from Dokploy/fix/remove-cron-jobs-after-delete
Fix/remove cron jobs after delete
2 parents 1e56364 + 2432713 commit 7ed0282

File tree

8 files changed

+66
-8
lines changed

8 files changed

+66
-8
lines changed

apps/dokploy/components/dashboard/project/add-database.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ const mySchema = z.discriminatedUnion("type", [
8989
z
9090
.object({
9191
type: z.literal("postgres"),
92-
databaseName: z.string().min(1, "Database name required"),
92+
databaseName: z.string().default("postgres"),
9393
databaseUser: z.string().default("postgres"),
9494
})
9595
.merge(baseDatabaseSchema),
@@ -110,7 +110,7 @@ const mySchema = z.discriminatedUnion("type", [
110110
type: z.literal("mysql"),
111111
databaseRootPassword: z.string().default(""),
112112
databaseUser: z.string().default("mysql"),
113-
databaseName: z.string().min(1, "Database name required"),
113+
databaseName: z.string().default("mysql"),
114114
})
115115
.merge(baseDatabaseSchema),
116116
z
@@ -119,7 +119,7 @@ const mySchema = z.discriminatedUnion("type", [
119119
dockerImage: z.string().default("mariadb:4"),
120120
databaseRootPassword: z.string().default(""),
121121
databaseUser: z.string().default("mariadb"),
122-
databaseName: z.string().min(1, "Database name required"),
122+
databaseName: z.string().default("mariadb"),
123123
})
124124
.merge(baseDatabaseSchema),
125125
]);
@@ -206,7 +206,7 @@ export const AddDatabase = ({ projectId, projectName }: Props) => {
206206
promise = postgresMutation.mutateAsync({
207207
...commonParams,
208208
databasePassword: data.databasePassword,
209-
databaseName: data.databaseName,
209+
databaseName: data.databaseName || "postgres",
210210

211211
databaseUser:
212212
data.databaseUser || databasesUserDefaultPlaceholder[data.type],
@@ -233,7 +233,7 @@ export const AddDatabase = ({ projectId, projectName }: Props) => {
233233
...commonParams,
234234
databasePassword: data.databasePassword,
235235
databaseRootPassword: data.databaseRootPassword,
236-
databaseName: data.databaseName,
236+
databaseName: data.databaseName || "mariadb",
237237
databaseUser:
238238
data.databaseUser || databasesUserDefaultPlaceholder[data.type],
239239
serverId: data.serverId,
@@ -242,7 +242,7 @@ export const AddDatabase = ({ projectId, projectName }: Props) => {
242242
promise = mysqlMutation.mutateAsync({
243243
...commonParams,
244244
databasePassword: data.databasePassword,
245-
databaseName: data.databaseName,
245+
databaseName: data.databaseName || "mysql",
246246
databaseUser:
247247
data.databaseUser || databasesUserDefaultPlaceholder[data.type],
248248
databaseRootPassword: data.databaseRootPassword,

apps/dokploy/server/api/routers/mariadb.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import {
99
apiSaveExternalPortMariaDB,
1010
apiUpdateMariaDB,
1111
} from "@/server/db/schema";
12+
import { cancelJobs } from "@/server/utils/backup";
1213
import {
1314
IS_CLOUD,
1415
addNewService,
1516
checkServiceAccess,
1617
createMariadb,
1718
createMount,
1819
deployMariadb,
20+
findBackupsByDbId,
1921
findMariadbById,
2022
findProjectById,
2123
findServerById,
@@ -211,8 +213,10 @@ export const mariadbRouter = createTRPCRouter({
211213
});
212214
}
213215

216+
const backups = await findBackupsByDbId(input.mariadbId, "mariadb");
214217
const cleanupOperations = [
215218
async () => await removeService(mongo?.appName, mongo.serverId),
219+
async () => await cancelJobs(backups),
216220
async () => await removeMariadbById(input.mariadbId),
217221
];
218222

apps/dokploy/server/api/routers/mongo.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import {
99
apiSaveExternalPortMongo,
1010
apiUpdateMongo,
1111
} from "@/server/db/schema";
12+
import { cancelJobs } from "@/server/utils/backup";
1213
import {
1314
IS_CLOUD,
1415
addNewService,
1516
checkServiceAccess,
1617
createMongo,
1718
createMount,
1819
deployMongo,
20+
findBackupsByDbId,
1921
findMongoById,
2022
findProjectById,
2123
removeMongoById,
@@ -252,9 +254,11 @@ export const mongoRouter = createTRPCRouter({
252254
message: "You are not authorized to delete this mongo",
253255
});
254256
}
257+
const backups = await findBackupsByDbId(input.mongoId, "mongo");
255258

256259
const cleanupOperations = [
257260
async () => await removeService(mongo?.appName, mongo.serverId),
261+
async () => await cancelJobs(backups),
258262
async () => await removeMongoById(input.mongoId),
259263
];
260264

apps/dokploy/server/api/routers/mysql.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import {
1212

1313
import { TRPCError } from "@trpc/server";
1414

15+
import { cancelJobs } from "@/server/utils/backup";
1516
import {
1617
IS_CLOUD,
1718
addNewService,
1819
checkServiceAccess,
1920
createMount,
2021
createMysql,
2122
deployMySql,
23+
findBackupsByDbId,
2224
findMySqlById,
2325
findProjectById,
2426
removeMySqlById,
@@ -249,8 +251,10 @@ export const mysqlRouter = createTRPCRouter({
249251
});
250252
}
251253

254+
const backups = await findBackupsByDbId(input.mysqlId, "mysql");
252255
const cleanupOperations = [
253256
async () => await removeService(mongo?.appName, mongo.serverId),
257+
async () => await cancelJobs(backups),
254258
async () => await removeMySqlById(input.mysqlId),
255259
];
256260

apps/dokploy/server/api/routers/postgres.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ import {
1414
apiSaveExternalPortPostgres,
1515
apiUpdatePostgres,
1616
} from "@/server/db/schema";
17+
import { cancelJobs } from "@/server/utils/backup";
1718
import {
1819
IS_CLOUD,
1920
addNewService,
2021
checkServiceAccess,
2122
createMount,
2223
createPostgres,
2324
deployPostgres,
25+
findBackupsByDbId,
2426
findPostgresById,
2527
findProjectById,
2628
removePostgresById,
@@ -231,8 +233,11 @@ export const postgresRouter = createTRPCRouter({
231233
});
232234
}
233235

236+
const backups = await findBackupsByDbId(input.postgresId, "postgres");
237+
234238
const cleanupOperations = [
235239
removeService(postgres.appName, postgres.serverId),
240+
cancelJobs(backups),
236241
removePostgresById(input.postgresId),
237242
];
238243

apps/dokploy/server/api/routers/redis.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ export const redisRouter = createTRPCRouter({
244244
message: "You are not authorized to delete this Redis",
245245
});
246246
}
247-
248247
const cleanupOperations = [
249248
async () => await removeService(redis?.appName, redis.serverId),
250249
async () => await removeRedisById(input.redisId),

apps/dokploy/server/utils/backup.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
import {
2+
type BackupScheduleList,
3+
IS_CLOUD,
4+
removeScheduleBackup,
5+
scheduleBackup,
6+
} from "@dokploy/server/index";
7+
18
type QueueJob =
29
| {
310
type: "backup";
@@ -59,3 +66,19 @@ export const updateJob = async (job: QueueJob) => {
5966
throw error;
6067
}
6168
};
69+
70+
export const cancelJobs = async (backups: BackupScheduleList) => {
71+
for (const backup of backups) {
72+
if (backup.enabled) {
73+
if (IS_CLOUD) {
74+
await removeJob({
75+
cronSchedule: backup.schedule,
76+
backupId: backup.backupId,
77+
type: "backup",
78+
});
79+
} else {
80+
removeScheduleBackup(backup.backupId);
81+
}
82+
}
83+
}
84+
};

packages/server/src/services/backup.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { db } from "@dokploy/server/db";
22
import { type apiCreateBackup, backups } from "@dokploy/server/db/schema";
33
import { TRPCError } from "@trpc/server";
44
import { eq } from "drizzle-orm";
5+
import { IS_CLOUD } from "../constants";
6+
import { removeScheduleBackup, scheduleBackup } from "../utils/backups/utils";
57

68
export type Backup = typeof backups.$inferSelect;
79

810
export type BackupSchedule = Awaited<ReturnType<typeof findBackupById>>;
9-
11+
export type BackupScheduleList = Awaited<ReturnType<typeof findBackupsByDbId>>;
1012
export const createBackup = async (input: typeof apiCreateBackup._type) => {
1113
const newBackup = await db
1214
.insert(backups)
@@ -69,3 +71,20 @@ export const removeBackupById = async (backupId: string) => {
6971

7072
return result[0];
7173
};
74+
75+
export const findBackupsByDbId = async (
76+
id: string,
77+
type: "postgres" | "mysql" | "mariadb" | "mongo",
78+
) => {
79+
const result = await db.query.backups.findMany({
80+
where: eq(backups[`${type}Id`], id),
81+
with: {
82+
postgres: true,
83+
mysql: true,
84+
mariadb: true,
85+
mongo: true,
86+
destination: true,
87+
},
88+
});
89+
return result || [];
90+
};

0 commit comments

Comments
 (0)