From e29a86a85f33e626f24e7192b04b0674f538ec4d Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 28 Feb 2026 22:33:31 -0600 Subject: [PATCH 1/5] refactor: optimize trusted origins retrieval and caching in auth and admin services --- packages/server/src/lib/auth.ts | 24 +++++++++-------- packages/server/src/services/admin.ts | 39 +++++++++++++++++---------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/packages/server/src/lib/auth.ts b/packages/server/src/lib/auth.ts index 3dea8f486..21e1ff19f 100644 --- a/packages/server/src/lib/auth.ts +++ b/packages/server/src/lib/auth.ts @@ -73,23 +73,25 @@ const { handler, api } = betterAuth({ disabled: process.env.NODE_ENV === "production", }, async trustedOrigins() { - const trustedOrigins = await getTrustedOrigins(); if (IS_CLOUD) { - return trustedOrigins; + return getTrustedOrigins(); } - const settings = await getWebServerSettings(); - if (!settings) { - return []; - } - return [ - ...(settings?.serverIp ? [`http://${settings?.serverIp}:3000`] : []), - ...(settings?.host ? [`https://${settings?.host}`] : []), - ...(process.env.NODE_ENV === "development" + const [trustedOrigins, settings] = await Promise.all([ + getTrustedOrigins(), + getWebServerSettings(), + ]); + if (!settings) return []; + const devOrigins = + process.env.NODE_ENV === "development" ? [ "http://localhost:3000", "https://absolutely-handy-falcon.ngrok-free.app", ] - : []), + : []; + return [ + ...(settings?.serverIp ? [`http://${settings?.serverIp}:3000`] : []), + ...(settings?.host ? [`https://${settings?.host}`] : []), + ...devOrigins, ...trustedOrigins, ]; }, diff --git a/packages/server/src/services/admin.ts b/packages/server/src/services/admin.ts index 9bc18334f..1097be90f 100644 --- a/packages/server/src/services/admin.ts +++ b/packages/server/src/services/admin.ts @@ -117,23 +117,34 @@ export const getDokployUrl = async () => { return `http://${settings?.serverIp}:${process.env.PORT}`; }; -export const getTrustedOrigins = async () => { - const members = await db.query.member.findMany({ - where: eq(member.role, "owner"), - with: { - user: true, - }, - }); +const TRUSTED_ORIGINS_CACHE_TTL_MS = 60_000; +let trustedOriginsCache: { data: string[]; expiresAt: number } | null = null; - if (members.length === 0) { - return []; +export const getTrustedOrigins = async () => { + const runQuery = async () => { + const rows = await db + .select({ trustedOrigins: user.trustedOrigins }) + .from(member) + .innerJoin(user, eq(member.userId, user.id)) + .where(eq(member.role, "owner")); + return Array.from(new Set(rows.flatMap((r) => r.trustedOrigins ?? []))); + }; + + if (IS_CLOUD) { + const now = Date.now(); + console.log("trustedOriginsCache", trustedOriginsCache?.data.length); + if (trustedOriginsCache && now < trustedOriginsCache.expiresAt) { + return trustedOriginsCache.data; + } + const trustedOrigins = await runQuery(); + trustedOriginsCache = { + data: trustedOrigins, + expiresAt: now + TRUSTED_ORIGINS_CACHE_TTL_MS, + }; + return trustedOrigins; } - const trustedOrigins = members.flatMap( - (member) => member.user.trustedOrigins || [], - ); - - return Array.from(new Set(trustedOrigins)); + return runQuery(); }; export const getTrustedProviders = async () => { From c9e10790763dc8970a20a43e12362756e65a8815 Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 28 Feb 2026 22:39:20 -0600 Subject: [PATCH 2/5] refactor: remove console log from BreadcrumbSidebar component --- apps/dokploy/components/shared/breadcrumb-sidebar.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/dokploy/components/shared/breadcrumb-sidebar.tsx b/apps/dokploy/components/shared/breadcrumb-sidebar.tsx index e4777d32b..9ba28850c 100644 --- a/apps/dokploy/components/shared/breadcrumb-sidebar.tsx +++ b/apps/dokploy/components/shared/breadcrumb-sidebar.tsx @@ -32,7 +32,6 @@ interface Props { } export const BreadcrumbSidebar = ({ list }: Props) => { - console.log(list); return (
From 096c04486cc808f88549582a1c673b88a669757b Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 28 Feb 2026 22:42:15 -0600 Subject: [PATCH 3/5] refactor: increase cache TTL for trusted origins in admin service --- packages/server/src/services/admin.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/server/src/services/admin.ts b/packages/server/src/services/admin.ts index 1097be90f..2721777df 100644 --- a/packages/server/src/services/admin.ts +++ b/packages/server/src/services/admin.ts @@ -117,7 +117,7 @@ export const getDokployUrl = async () => { return `http://${settings?.serverIp}:${process.env.PORT}`; }; -const TRUSTED_ORIGINS_CACHE_TTL_MS = 60_000; +const TRUSTED_ORIGINS_CACHE_TTL_MS = 30 * 60_000; let trustedOriginsCache: { data: string[]; expiresAt: number } | null = null; export const getTrustedOrigins = async () => { @@ -132,7 +132,6 @@ export const getTrustedOrigins = async () => { if (IS_CLOUD) { const now = Date.now(); - console.log("trustedOriginsCache", trustedOriginsCache?.data.length); if (trustedOriginsCache && now < trustedOriginsCache.expiresAt) { return trustedOriginsCache.data; } From 439fa17292588a829f8cd483548c2ea962658cde Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 28 Feb 2026 22:52:04 -0600 Subject: [PATCH 4/5] chore: bump version to v0.28.2 in package.json --- apps/dokploy/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dokploy/package.json b/apps/dokploy/package.json index 75952aad6..39a5de912 100644 --- a/apps/dokploy/package.json +++ b/apps/dokploy/package.json @@ -1,6 +1,6 @@ { "name": "dokploy", - "version": "v0.28.1", + "version": "v0.28.2", "private": true, "license": "Apache-2.0", "type": "module", From ca527ab6fff3a50e880981db88088033b75f377d Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Sat, 28 Feb 2026 22:59:24 -0600 Subject: [PATCH 5/5] test: add mock implementation for member.findMany in application command and real tests --- .../__test__/deploy/application.command.test.ts | 10 +++++++++- apps/dokploy/__test__/deploy/application.real.test.ts | 10 +++++++++- apps/dokploy/__test__/setup.ts | 7 +++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/apps/dokploy/__test__/deploy/application.command.test.ts b/apps/dokploy/__test__/deploy/application.command.test.ts index c81fab44c..1a33489b5 100644 --- a/apps/dokploy/__test__/deploy/application.command.test.ts +++ b/apps/dokploy/__test__/deploy/application.command.test.ts @@ -14,13 +14,18 @@ vi.mock("@dokploy/server/db", () => { set: vi.fn(() => chain), where: vi.fn(() => chain), returning: vi.fn().mockResolvedValue([{}] as any), + from: vi.fn(() => chain), + innerJoin: vi.fn(() => chain), + then: (resolve: (v: any) => void) => { + resolve([]); + }, } as any; return chain; }; return { db: { - select: vi.fn(), + select: vi.fn(() => createChainableMock()), insert: vi.fn(), update: vi.fn(() => createChainableMock()), delete: vi.fn(), @@ -31,6 +36,9 @@ vi.mock("@dokploy/server/db", () => { patch: { findMany: vi.fn().mockResolvedValue([]), }, + member: { + findMany: vi.fn().mockResolvedValue([]), + }, }, }, }; diff --git a/apps/dokploy/__test__/deploy/application.real.test.ts b/apps/dokploy/__test__/deploy/application.real.test.ts index 498281776..4adff6f07 100644 --- a/apps/dokploy/__test__/deploy/application.real.test.ts +++ b/apps/dokploy/__test__/deploy/application.real.test.ts @@ -15,13 +15,18 @@ vi.mock("@dokploy/server/db", () => { set: vi.fn(() => chain), where: vi.fn(() => chain), returning: vi.fn().mockResolvedValue([{}]), + from: vi.fn(() => chain), + innerJoin: vi.fn(() => chain), + then: (resolve: (v: any) => void) => { + resolve([]); + }, }; return chain; }; return { db: { - select: vi.fn(), + select: vi.fn(() => createChainableMock()), insert: vi.fn(), update: vi.fn(() => createChainableMock()), delete: vi.fn(), @@ -32,6 +37,9 @@ vi.mock("@dokploy/server/db", () => { patch: { findMany: vi.fn().mockResolvedValue([]), }, + member: { + findMany: vi.fn().mockResolvedValue([]), + }, }, }, }; diff --git a/apps/dokploy/__test__/setup.ts b/apps/dokploy/__test__/setup.ts index 5af01d147..04fd08b0c 100644 --- a/apps/dokploy/__test__/setup.ts +++ b/apps/dokploy/__test__/setup.ts @@ -12,7 +12,11 @@ vi.mock("@dokploy/server/db", () => { chain.where = () => chain; chain.values = () => chain; chain.returning = () => Promise.resolve([{}]); - chain.then = undefined; + chain.from = () => chain; + chain.innerJoin = () => chain; + chain.then = (resolve: (value: unknown) => void) => { + resolve([]); + }; const tableMock = { findFirst: vi.fn(() => Promise.resolve(undefined)), @@ -21,7 +25,6 @@ vi.mock("@dokploy/server/db", () => { update: vi.fn(() => chain), delete: vi.fn(() => chain), }; - const createQueryMock = () => tableMock; return { db: {