From ba3591b3acab0bb8f185830f6329d201ed89c03f Mon Sep 17 00:00:00 2001 From: Maks Pikov Date: Tue, 21 Apr 2026 22:03:55 +0000 Subject: [PATCH 01/42] fix(webhook): return 401 when signature header is missing --- apps/dokploy/pages/api/deploy/github.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts index 4438366f6..57f926466 100644 --- a/apps/dokploy/pages/api/deploy/github.ts +++ b/apps/dokploy/pages/api/deploy/github.ts @@ -24,6 +24,11 @@ export default async function handler( res: NextApiResponse, ) { const signature = req.headers["x-hub-signature-256"]; + if (!signature) { + res.status(401).json({ message: "Missing signature header" }); + return; + } + const githubBody = req.body; if (!githubBody?.installation?.id) { @@ -50,7 +55,7 @@ export default async function handler( const verified = await webhooks.verify( JSON.stringify(githubBody), - signature as string, + signature, ); if (!verified) { From 8fb517152a63b6dc98514df1d747b422a143d746 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:04:36 +0000 Subject: [PATCH 02/42] [autofix.ci] apply automated fixes --- apps/dokploy/pages/api/deploy/github.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts index 57f926466..eadc80a21 100644 --- a/apps/dokploy/pages/api/deploy/github.ts +++ b/apps/dokploy/pages/api/deploy/github.ts @@ -53,10 +53,7 @@ export default async function handler( secret: githubResult.githubWebhookSecret, }); - const verified = await webhooks.verify( - JSON.stringify(githubBody), - signature, - ); + const verified = await webhooks.verify(JSON.stringify(githubBody), signature); if (!verified) { res.status(401).json({ message: "Unauthorized" }); From fc6df3ae0528d3a2fc63acc0e592cabd238738e5 Mon Sep 17 00:00:00 2001 From: OpenClaw Bot Date: Wed, 22 Apr 2026 00:04:44 +0000 Subject: [PATCH 03/42] fix(webhook): cast signature to string to fix TS2345 --- apps/dokploy/pages/api/deploy/github.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts index eadc80a21..8aeffdf47 100644 --- a/apps/dokploy/pages/api/deploy/github.ts +++ b/apps/dokploy/pages/api/deploy/github.ts @@ -53,7 +53,7 @@ export default async function handler( secret: githubResult.githubWebhookSecret, }); - const verified = await webhooks.verify(JSON.stringify(githubBody), signature); + const verified = await webhooks.verify(JSON.stringify(githubBody), signature as string); if (!verified) { res.status(401).json({ message: "Unauthorized" }); From ce703ef47872b912e3924d8fc780731fa6732005 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 00:05:08 +0000 Subject: [PATCH 04/42] [autofix.ci] apply automated fixes --- apps/dokploy/pages/api/deploy/github.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/dokploy/pages/api/deploy/github.ts b/apps/dokploy/pages/api/deploy/github.ts index 8aeffdf47..99f64ecc7 100644 --- a/apps/dokploy/pages/api/deploy/github.ts +++ b/apps/dokploy/pages/api/deploy/github.ts @@ -53,7 +53,10 @@ export default async function handler( secret: githubResult.githubWebhookSecret, }); - const verified = await webhooks.verify(JSON.stringify(githubBody), signature as string); + const verified = await webhooks.verify( + JSON.stringify(githubBody), + signature as string, + ); if (!verified) { res.status(401).json({ message: "Unauthorized" }); From ad490dca3fc60aee4470a669d886bfd2149f462f Mon Sep 17 00:00:00 2001 From: berkay-digital <46861579+berkay-digital@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:19:13 +0200 Subject: [PATCH 05/42] feat: add copy button to AI log analysis result Allows users to quickly copy the AI-generated log analysis to their clipboard from the analyze-logs popover, matching the copy UX used in the deployment and docker logs views. Made-with: Cursor --- .../dashboard/docker/logs/analyze-logs.tsx | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/dokploy/components/dashboard/docker/logs/analyze-logs.tsx b/apps/dokploy/components/dashboard/docker/logs/analyze-logs.tsx index 267735eac..c343294f6 100644 --- a/apps/dokploy/components/dashboard/docker/logs/analyze-logs.tsx +++ b/apps/dokploy/components/dashboard/docker/logs/analyze-logs.tsx @@ -1,5 +1,6 @@ "use client"; -import { Bot, Loader2, RotateCcw, Settings, X } from "lucide-react"; +import copy from "copy-to-clipboard"; +import { Bot, Check, Copy, Loader2, RotateCcw, Settings, X } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import ReactMarkdown from "react-markdown"; @@ -30,6 +31,7 @@ const MAX_LOG_LINES = 200; export function AnalyzeLogs({ logs, context }: Props) { const [open, setOpen] = useState(false); const [aiId, setAiId] = useState(""); + const [copied, setCopied] = useState(false); const { data: providers } = api.ai.getEnabledProviders.useQuery(undefined, { enabled: open, }); @@ -52,6 +54,15 @@ export function AnalyzeLogs({ logs, context }: Props) { mutate({ aiId, logs: logsText, context }); }; + const handleCopy = () => { + if (!data?.analysis) return; + const success = copy(data.analysis); + if (success) { + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + }; + return ( + + +
+ ( + +
+ Repository URL + {field.value?.startsWith("https://") && ( + + + View Repository + + )} +
+ + + + +
)} -
-
+ /> + {sshKeys && sshKeys.length > 0 ? ( ( - - Branch + + + SSH Key + + - + - )} /> -
+ ) : ( + + )} + + ( + + Branch + + + + + + )} + /> ( - + Build Path @@ -223,7 +216,7 @@ export const SaveGitProvider = ({ applicationId }: Props) => { control={form.control} name="watchPaths" render={({ field }) => ( - +
Watch Paths diff --git a/apps/dokploy/components/dashboard/application/general/show.tsx b/apps/dokploy/components/dashboard/application/general/show.tsx index 01fc9e84a..faf887e3f 100644 --- a/apps/dokploy/components/dashboard/application/general/show.tsx +++ b/apps/dokploy/components/dashboard/application/general/show.tsx @@ -58,7 +58,10 @@ export const ShowGeneralApplication = ({ applicationId }: Props) => { Deploy Settings - + {canDeploy && ( { > {canUpdateService && ( -
+
Autodeploy { )} {canUpdateService && ( -
+
Clean Cache { className="h-auto px-2 py-1.5 hover:bg-accent gap-2" > - + {currentProject?.name || "Select Project"} @@ -478,7 +478,7 @@ export const AdvanceBreadcrumb = () => { aria-expanded={environmentOpen} className="h-auto px-2 py-1.5 hover:bg-accent gap-2" > - + {currentEnvironment?.name || "production"} @@ -533,7 +533,7 @@ export const AdvanceBreadcrumb = () => { )} {projectEnvironments && projectEnvironments.length === 1 && ( -

+

{currentEnvironment?.name || "production"}

)} @@ -551,7 +551,7 @@ export const AdvanceBreadcrumb = () => { className="h-auto px-2 py-1.5 hover:bg-accent gap-2" > {getServiceIcon(currentService.type)} - + {currentService.name} @@ -617,7 +617,7 @@ export const AdvanceBreadcrumb = () => {