diff --git a/apps/dokploy/components/dashboard/application/deployments/show-deployments-modal.tsx b/apps/dokploy/components/dashboard/application/deployments/show-deployments-modal.tsx index f9a26c40..c018a97c 100644 --- a/apps/dokploy/components/dashboard/application/deployments/show-deployments-modal.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/show-deployments-modal.tsx @@ -8,7 +8,13 @@ import { ShowDeployments } from "./show-deployments"; interface Props { id: string; - type: "application" | "compose" | "schedule" | "server" | "backup"; + type: + | "application" + | "compose" + | "schedule" + | "server" + | "backup" + | "previewDeployment"; serverId?: string; refreshToken?: string; children?: React.ReactNode; diff --git a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx index d43a3339..199c1154 100644 --- a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx @@ -18,7 +18,13 @@ import { Badge } from "@/components/ui/badge"; interface Props { id: string; - type: "application" | "compose" | "schedule" | "server" | "backup"; + type: + | "application" + | "compose" + | "schedule" + | "server" + | "backup" + | "previewDeployment"; refreshToken?: string; serverId?: string; } @@ -65,7 +71,9 @@ export const ShowDeployments = ({ See all the 10 last deployments for this {type} - {refreshToken && } + {(type === "application" || type === "compose") && ( + + )} {refreshToken && ( @@ -80,7 +88,9 @@ export const ShowDeployments = ({ {`${url}/api/deploy/${refreshToken}`} - + {(type === "application" || type === "compose") && ( + + )} diff --git a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx deleted file mode 100644 index 90800f75..00000000 --- a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-builds.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { DateTooltip } from "@/components/shared/date-tooltip"; -import { StatusTooltip } from "@/components/shared/status-tooltip"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; - -import type { RouterOutputs } from "@/utils/api"; -import { useState } from "react"; -import { ShowDeployment } from "../deployments/show-deployment"; - -interface Props { - deployments: RouterOutputs["deployment"]["all"]; - serverId?: string; - trigger?: React.ReactNode; -} - -export const ShowPreviewBuilds = ({ - deployments, - serverId, - trigger, -}: Props) => { - const [activeLog, setActiveLog] = useState< - RouterOutputs["deployment"]["all"][number] | null - >(null); - const [isOpen, setIsOpen] = useState(false); - return ( - - - {trigger ? ( - trigger - ) : ( - - )} - - - - Preview Builds - - See all the preview builds for this application on this Pull Request - - -
- {deployments?.map((deployment) => ( -
-
- - {deployment.status} - - - - - {deployment.title} - - {deployment.description && ( - - {deployment.description} - - )} -
-
-
- -
- - -
-
- ))} -
-
- setActiveLog(null)} - logPath={activeLog?.logPath || ""} - errorMessage={activeLog?.errorMessage || ""} - /> -
- ); -}; diff --git a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx index ec3680f1..d436055e 100644 --- a/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx +++ b/apps/dokploy/components/dashboard/application/preview-deployments/show-preview-deployments.tsx @@ -17,7 +17,7 @@ import { ExternalLink, FileText, GitPullRequest, - Layers, + Loader2, PenSquare, RocketIcon, Trash2, @@ -25,8 +25,8 @@ import { import { toast } from "sonner"; import { ShowModalLogs } from "../../settings/web-server/show-modal-logs"; import { AddPreviewDomain } from "./add-preview-domain"; -import { ShowPreviewBuilds } from "./show-preview-builds"; import { ShowPreviewSettings } from "./show-preview-settings"; +import { ShowDeploymentsModal } from "../deployments/show-deployments-modal"; interface Props { applicationId: string; @@ -38,13 +38,16 @@ export const ShowPreviewDeployments = ({ applicationId }: Props) => { const { mutateAsync: deletePreviewDeployment, isLoading } = api.previewDeployment.delete.useMutation(); - const { data: previewDeployments, refetch: refetchPreviewDeployments } = - api.previewDeployment.all.useQuery( - { applicationId }, - { - enabled: !!applicationId, - }, - ); + const { + data: previewDeployments, + refetch: refetchPreviewDeployments, + isLoading: isLoadingPreviewDeployments, + } = api.previewDeployment.all.useQuery( + { applicationId }, + { + enabled: !!applicationId, + }, + ); const handleDeletePreviewDeployment = async (previewDeploymentId: string) => { deletePreviewDeployment({ @@ -80,8 +83,15 @@ export const ShowPreviewDeployments = ({ applicationId }: Props) => { each pull request you create. - {!previewDeployments?.length ? ( -
+ {isLoadingPreviewDeployments ? ( +
+ + + Loading preview deployments... + +
+ ) : !previewDeployments?.length ? ( +
No preview deployments found @@ -168,19 +178,10 @@ export const ShowPreviewDeployments = ({ applicationId }: Props) => { - - - Builds - - } /> Database Name - + @@ -789,10 +791,10 @@ export const RestoreBackup = ({ isLoading={isDeploying} form="hook-form-restore-backup" type="submit" - disabled={ - !form.watch("backupFile") || - (backupType === "compose" && !form.watch("databaseType")) - } + // disabled={ + // !form.watch("backupFile") || + // (backupType === "compose" && !form.watch("databaseType")) + // } > Restore diff --git a/packages/server/src/utils/backups/web-server.ts b/packages/server/src/utils/backups/web-server.ts index ae63b188..733d6a59 100644 --- a/packages/server/src/utils/backups/web-server.ts +++ b/packages/server/src/utils/backups/web-server.ts @@ -42,35 +42,35 @@ export const runWebServerBackup = async (backup: BackupSchedule) => { ); if (!containerId) { - writeStream.write("PostgreSQL container not found❌"); + writeStream.write("Dokploy postgres container not found❌\n"); writeStream.end(); - throw new Error("PostgreSQL container not found"); + throw new Error("Dokploy postgres container not found"); } - writeStream.write(`PostgreSQL container ID: ${containerId}`); + writeStream.write(`Dokploy postgres container ID: ${containerId}\n`); const postgresContainerId = containerId.trim(); const postgresCommand = `docker exec ${postgresContainerId} pg_dump -v -Fc -U dokploy -d dokploy > '${tempDir}/database.sql'`; - writeStream.write(`Running command: ${postgresCommand}`); + writeStream.write(`Running command: ${postgresCommand}\n`); await execAsync(postgresCommand); await execAsync(`cp -r ${BASE_PATH}/* ${tempDir}/filesystem/`); - writeStream.write("Copied filesystem to temp directory"); + writeStream.write("Copied filesystem to temp directory\n"); await execAsync( // Zip all .sql files since we created more than one `cd ${tempDir} && zip -r ${backupFileName} *.sql filesystem/ > /dev/null 2>&1`, ); - writeStream.write("Zipped database and filesystem"); + writeStream.write("Zipped database and filesystem\n"); const uploadCommand = `rclone copyto ${rcloneFlags.join(" ")} "${tempDir}/${backupFileName}" "${s3Path}"`; - writeStream.write(`Running command: ${uploadCommand}`); + writeStream.write(`Running command: ${uploadCommand}\n`); await execAsync(uploadCommand); - writeStream.write("Uploaded backup to S3 ✅"); + writeStream.write("Uploaded backup to S3 ✅\n"); writeStream.end(); await updateDeploymentStatus(deployment.deploymentId, "done"); return true; @@ -80,7 +80,9 @@ export const runWebServerBackup = async (backup: BackupSchedule) => { } catch (error) { console.error("Backup error:", error); writeStream.write("Backup error❌\n"); - writeStream.write(error instanceof Error ? error.message : "Unknown error"); + writeStream.write( + error instanceof Error ? error.message : "Unknown error\n", + ); writeStream.end(); await updateDeploymentStatus(deployment.deploymentId, "error"); throw error;