import { ClipboardList, Database, DatabaseBackup, Play, Trash2, } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import { toast } from "sonner"; import { MariadbIcon, MongodbIcon, MysqlIcon, PostgresqlIcon, } from "@/components/icons/data-tools-icons"; import { AlertBlock } from "@/components/shared/alert-block"; import { DialogAction } from "@/components/shared/dialog-action"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; import { api } from "@/utils/api"; import type { ServiceType } from "../../application/advanced/show-resources"; import { ShowDeploymentsModal } from "../../application/deployments/show-deployments-modal"; import { HandleBackup } from "./handle-backup"; import { RestoreBackup } from "./restore-backup"; interface Props { id: string; databaseType?: Exclude | "web-server"; backupType?: "database" | "compose"; } export const ShowBackups = ({ id, databaseType, backupType = "database", }: Props) => { const [activeManualBackup, setActiveManualBackup] = useState< string | undefined >(); const queryMap = backupType === "database" ? { postgres: () => api.postgres.one.useQuery({ postgresId: id }, { enabled: !!id }), mysql: () => api.mysql.one.useQuery({ mysqlId: id }, { enabled: !!id }), mariadb: () => api.mariadb.one.useQuery({ mariadbId: id }, { enabled: !!id }), mongo: () => api.mongo.one.useQuery({ mongoId: id }, { enabled: !!id }), "web-server": () => api.user.getBackups.useQuery(), } : { compose: () => api.compose.one.useQuery({ composeId: id }, { enabled: !!id }), }; const { data } = api.destination.all.useQuery(); const key = backupType === "database" ? databaseType : "compose"; const query = queryMap[key as keyof typeof queryMap]; const { data: postgres, refetch } = query ? query() : api.mongo.one.useQuery({ mongoId: id }, { enabled: !!id }); const mutationMap = backupType === "database" ? { postgres: api.backup.manualBackupPostgres.useMutation(), mysql: api.backup.manualBackupMySql.useMutation(), mariadb: api.backup.manualBackupMariadb.useMutation(), mongo: api.backup.manualBackupMongo.useMutation(), "web-server": api.backup.manualBackupWebServer.useMutation(), } : { compose: api.backup.manualBackupCompose.useMutation(), }; const mutation = mutationMap[key as keyof typeof mutationMap]; const { mutateAsync: manualBackup, isPending: isManualBackup } = mutation ? mutation : api.backup.manualBackupMongo.useMutation(); const { mutateAsync: deleteBackup, isPending: isRemoving } = api.backup.remove.useMutation(); return (
Backups Add backups to your database to save the data to a different provider.
{postgres && postgres?.backups?.length > 0 && (
{databaseType !== "web-server" && ( )}
)}
{data?.length === 0 ? (
To create a backup it is required to set at least 1 provider. Please, go to{" "} S3 Destinations {" "} to do so.
) : (
{postgres?.backups.length === 0 ? (
No backups configured
) : (
{backupType === "compose" && ( Make sure the compose is running before creating a backup. )}
{postgres?.backups.map((backup) => { const serverId = "serverId" in postgres ? postgres.serverId : undefined; return (
{backup.backupType === "compose" && (
{backup.databaseType === "postgres" && ( )} {backup.databaseType === "mysql" && ( )} {backup.databaseType === "mariadb" && ( )} {backup.databaseType === "mongo" && ( )}
)}
{backup.backupType === "compose" && (

{backup.serviceName}

{backup.databaseType}
)}
{backup.enabled ? "Active" : "Inactive"}
Destination

{backup.destination.name}

Database

{backup.database}

Schedule

{backup.schedule}

Prefix Storage

{backup.prefix}

Keep Latest

{backup.keepLatestCount || "All"}

Run Manual Backup { await deleteBackup({ backupId: backup.backupId, }) .then(() => { refetch(); toast.success( "Backup deleted successfully", ); }) .catch(() => { toast.error("Error deleting backup"); }); }} >
); })}
)}
)} ); };