From 7c2eb636252d56f905fca9035fd641fe835e441d Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 27 Apr 2025 22:14:06 -0600 Subject: [PATCH] Implement metadata handling for database and compose backups. Update backup schemas to include metadata fields for various database types. Enhance backup creation and update processes to accommodate new metadata requirements. Modify UI components to support metadata input for different database types during backup operations. --- .../dashboard/database/backups/add-backup.tsx | 154 +- .../database/backups/show-backups.tsx | 29 +- .../database/backups/update-backup.tsx | 158 +- apps/dokploy/drizzle/0089_dazzling_marrow.sql | 1 + apps/dokploy/drizzle/meta/0089_snapshot.json | 5454 +++++++++++++++++ apps/dokploy/drizzle/meta/_journal.json | 7 + apps/dokploy/server/api/routers/backup.ts | 17 +- apps/dokploy/server/api/routers/compose.ts | 18 +- packages/server/src/db/schema/backups.ts | 20 + packages/server/src/services/mongo.ts | 26 +- packages/server/src/utils/backups/compose.ts | 91 + packages/server/src/utils/backups/utils.ts | 47 +- packages/server/src/utils/builders/compose.ts | 6 +- packages/server/src/utils/docker/backup.ts | 4 + packages/server/src/utils/docker/domain.ts | 55 +- 15 files changed, 6010 insertions(+), 77 deletions(-) create mode 100644 apps/dokploy/drizzle/0089_dazzling_marrow.sql create mode 100644 apps/dokploy/drizzle/meta/0089_snapshot.json create mode 100644 packages/server/src/utils/backups/compose.ts create mode 100644 packages/server/src/utils/docker/backup.ts diff --git a/apps/dokploy/components/dashboard/database/backups/add-backup.tsx b/apps/dokploy/components/dashboard/database/backups/add-backup.tsx index c4920730c..8fe2a9760 100644 --- a/apps/dokploy/components/dashboard/database/backups/add-backup.tsx +++ b/apps/dokploy/components/dashboard/database/backups/add-backup.tsx @@ -58,7 +58,36 @@ import { z } from "zod"; type CacheType = "cache" | "fetch"; -const AddPostgresBackup1Schema = z.object({ +const getMetadataSchema = ( + backupType: "database" | "compose", + databaseType: Props["databaseType"], +) => { + if (backupType !== "compose") return z.object({}).optional(); + + const schemas = { + postgres: z.object({ + databaseUser: z.string().min(1, "Database user is required"), + }), + mariadb: z.object({ + databaseUser: z.string().min(1, "Database user is required"), + databasePassword: z.string().min(1, "Database password is required"), + }), + mongo: z.object({ + databaseUser: z.string().min(1, "Database user is required"), + databasePassword: z.string().min(1, "Database password is required"), + }), + mysql: z.object({ + databaseRootPassword: z.string().min(1, "Root password is required"), + }), + "web-server": z.object({}), + }; + + return z.object({ + [databaseType]: schemas[databaseType], + }); +}; + +const Schema = z.object({ destinationId: z.string().min(1, "Destination required"), schedule: z.string().min(1, "Schedule (Cron) required"), prefix: z.string().min(1, "Prefix required"), @@ -68,7 +97,7 @@ const AddPostgresBackup1Schema = z.object({ serviceName: z.string().nullable(), }); -type AddPostgresBackup = z.infer; +type Schema = z.infer; interface Props { id: string; @@ -89,7 +118,11 @@ export const AddBackup = ({ const { mutateAsync: createBackup, isLoading: isCreatingPostgresBackup } = api.backup.create.useMutation(); - const form = useForm({ + const schema = Schema.extend({ + metadata: getMetadataSchema(backupType, databaseType), + }); + + const form = useForm>({ defaultValues: { database: "", destinationId: "", @@ -98,8 +131,9 @@ export const AddBackup = ({ schedule: "", keepLatestCount: undefined, serviceName: null, + metadata: {}, }, - resolver: zodResolver(AddPostgresBackup1Schema), + resolver: zodResolver(schema), }); const { @@ -128,10 +162,11 @@ export const AddBackup = ({ schedule: "", keepLatestCount: undefined, serviceName: null, + metadata: {}, }); }, [form, form.reset, form.formState.isSubmitSuccessful, databaseType]); - const onSubmit = async (data: AddPostgresBackup) => { + const onSubmit = async (data: Schema) => { if (backupType === "compose" && !data.serviceName) { form.setError("serviceName", { type: "manual", @@ -489,6 +524,115 @@ export const AddBackup = ({ )} /> + {backupType === "compose" && ( + <> + {databaseType === "postgres" && ( + ( + + Database User + + + + + + )} + /> + )} + + {databaseType === "mariadb" && ( + <> + ( + + Database User + + + + + + )} + /> + ( + + Database Password + + + + + + )} + /> + + )} + + {databaseType === "mongo" && ( + <> + ( + + Database User + + + + + + )} + /> + ( + + Database Password + + + + + + )} + /> + + )} + + {databaseType === "mysql" && ( + ( + + Root Password + + + + + + )} + /> + )} + + )}