diff --git a/apps/dokploy/__test__/traefik/server/update-server-config.test.ts b/apps/dokploy/__test__/traefik/server/update-server-config.test.ts index f35e8132c..b422279ca 100644 --- a/apps/dokploy/__test__/traefik/server/update-server-config.test.ts +++ b/apps/dokploy/__test__/traefik/server/update-server-config.test.ts @@ -5,21 +5,27 @@ vi.mock("node:fs", () => ({ default: fs, })); -import type { FileConfig, User } from "@dokploy/server"; +import type { FileConfig } from "@dokploy/server"; import { createDefaultServerTraefikConfig, loadOrCreateConfig, updateServerTraefik, } from "@dokploy/server"; +import type { webServerSettings } from "@dokploy/server/db/schema"; import { beforeEach, expect, test, vi } from "vitest"; -const baseAdmin: User = { +type WebServerSettings = typeof webServerSettings.$inferSelect; + +const baseSettings: WebServerSettings = { + id: "", https: false, - enablePaidFeatures: false, - allowImpersonation: false, - role: "user", - firstName: "", - lastName: "", + certificateType: "none", + host: null, + serverIp: null, + letsEncryptEmail: null, + sshPrivateKey: null, + enableDockerCleanup: false, + logCleanupCron: null, metricsConfig: { containers: { refreshRate: 20, @@ -45,29 +51,8 @@ const baseAdmin: User = { cleanupCacheApplications: false, cleanupCacheOnCompose: false, cleanupCacheOnPreviews: false, - createdAt: new Date(), - serverIp: null, - certificateType: "none", - host: null, - letsEncryptEmail: null, - sshPrivateKey: null, - enableDockerCleanup: false, - logCleanupCron: null, - serversQuantity: 0, - stripeCustomerId: "", - stripeSubscriptionId: "", - banExpires: new Date(), - banned: true, - banReason: "", - email: "", - expirationDate: "", - id: "", - isRegistered: false, - createdAt2: new Date().toISOString(), - emailVerified: false, - image: "", + createdAt: null, updatedAt: new Date(), - twoFactorEnabled: false, }; beforeEach(() => { @@ -85,7 +70,7 @@ test("Should read the configuration file", () => { test("Should apply redirect-to-https", () => { updateServerTraefik( { - ...baseAdmin, + ...baseSettings, https: true, certificateType: "letsencrypt", }, @@ -100,7 +85,7 @@ test("Should apply redirect-to-https", () => { }); test("Should change only host when no certificate", () => { - updateServerTraefik(baseAdmin, "example.com"); + updateServerTraefik(baseSettings, "example.com"); const config: FileConfig = loadOrCreateConfig("dokploy"); @@ -110,7 +95,7 @@ test("Should change only host when no certificate", () => { test("Should not touch config without host", () => { const originalConfig: FileConfig = loadOrCreateConfig("dokploy"); - updateServerTraefik(baseAdmin, null); + updateServerTraefik(baseSettings, null); const config: FileConfig = loadOrCreateConfig("dokploy"); @@ -119,11 +104,14 @@ test("Should not touch config without host", () => { test("Should remove websecure if https rollback to http", () => { updateServerTraefik( - { ...baseAdmin, certificateType: "letsencrypt" }, + { ...baseSettings, certificateType: "letsencrypt" }, "example.com", ); - updateServerTraefik({ ...baseAdmin, certificateType: "none" }, "example.com"); + updateServerTraefik( + { ...baseSettings, certificateType: "none" }, + "example.com", + ); const config: FileConfig = loadOrCreateConfig("dokploy"); diff --git a/apps/dokploy/components/dashboard/settings/servers/setup-monitoring.tsx b/apps/dokploy/components/dashboard/settings/servers/setup-monitoring.tsx index fb7b23f78..09260b1a2 100644 --- a/apps/dokploy/components/dashboard/settings/servers/setup-monitoring.tsx +++ b/apps/dokploy/components/dashboard/settings/servers/setup-monitoring.tsx @@ -80,7 +80,7 @@ const Schema = z.object({ type Schema = z.infer; export const SetupMonitoring = ({ serverId }: Props) => { - const { data } = serverId + const { data: serverData } = serverId ? api.server.one.useQuery( { serverId: serverId || "", @@ -89,7 +89,14 @@ export const SetupMonitoring = ({ serverId }: Props) => { enabled: !!serverId, }, ) - : api.user.getServerMetrics.useQuery(); + : { data: null }; + + const { data: webServerSettings } = + api.settings.getWebServerSettings.useQuery(undefined, { + enabled: !serverId, + }); + + const data = serverId ? serverData : webServerSettings; const url = useUrl(); diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index 3261f61fa..4ad2ca00a 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -17,8 +17,8 @@ import { findGitProviderById, findProjectById, findServerById, - findUserById, getComposeContainer, + getWebServerSettings, IS_CLOUD, loadServices, randomizeComposeFile, @@ -569,8 +569,7 @@ export const composeRouter = createTRPCRouter({ const template = await fetchTemplateFiles(input.id, input.baseUrl); - const admin = await findUserById(ctx.user.ownerId); - let serverIp = admin.serverIp || "127.0.0.1"; + let serverIp = "127.0.0.1"; const project = await findProjectById(environment.projectId); @@ -579,6 +578,9 @@ export const composeRouter = createTRPCRouter({ serverIp = server.ipAddress; } else if (process.env.NODE_ENV === "development") { serverIp = "127.0.0.1"; + } else { + const settings = await getWebServerSettings(); + serverIp = settings?.serverIp || "127.0.0.1"; } const projectName = slugify(`${project.name} ${input.id}`); @@ -803,14 +805,16 @@ export const composeRouter = createTRPCRouter({ const decodedData = Buffer.from(input.base64, "base64").toString( "utf-8", ); - const admin = await findUserById(ctx.user.ownerId); - let serverIp = admin.serverIp || "127.0.0.1"; + let serverIp = "127.0.0.1"; if (compose.serverId) { const server = await findServerById(compose.serverId); serverIp = server.ipAddress; } else if (process.env.NODE_ENV === "development") { serverIp = "127.0.0.1"; + } else { + const settings = await getWebServerSettings(); + serverIp = settings?.serverIp || "127.0.0.1"; } const templateData = JSON.parse(decodedData); const config = parse(templateData.config) as CompleteTemplate; @@ -880,14 +884,16 @@ export const composeRouter = createTRPCRouter({ await removeDomainById(domain.domainId); } - const admin = await findUserById(ctx.user.ownerId); - let serverIp = admin.serverIp || "127.0.0.1"; + let serverIp = "127.0.0.1"; if (compose.serverId) { const server = await findServerById(compose.serverId); serverIp = server.ipAddress; } else if (process.env.NODE_ENV === "development") { serverIp = "127.0.0.1"; + } else { + const settings = await getWebServerSettings(); + serverIp = settings?.serverIp || "127.0.0.1"; } const templateData = JSON.parse(decodedData); diff --git a/apps/dokploy/server/api/routers/domain.ts b/apps/dokploy/server/api/routers/domain.ts index 1f6264351..5767a38a9 100644 --- a/apps/dokploy/server/api/routers/domain.ts +++ b/apps/dokploy/server/api/routers/domain.ts @@ -9,6 +9,7 @@ import { findPreviewDeploymentById, findServerById, generateTraefikMeDomain, + getWebServerSettings, manageDomain, removeDomain, removeDomainById, @@ -107,16 +108,13 @@ export const domainRouter = createTRPCRouter({ }), canGenerateTraefikMeDomains: protectedProcedure .input(z.object({ serverId: z.string() })) - .query(async ({ input, ctx }) => { - const organization = await findOrganizationById( - ctx.session.activeOrganizationId, - ); - + .query(async ({ input }) => { if (input.serverId) { const server = await findServerById(input.serverId); return server.ipAddress; } - return organization?.owner.serverIp; + const settings = await getWebServerSettings(); + return settings?.serverIp || ""; }), update: protectedProcedure diff --git a/apps/dokploy/server/api/routers/notification.ts b/apps/dokploy/server/api/routers/notification.ts index b32278465..303168b9f 100644 --- a/apps/dokploy/server/api/routers/notification.ts +++ b/apps/dokploy/server/api/routers/notification.ts @@ -8,6 +8,7 @@ import { createSlackNotification, createTelegramNotification, findNotificationById, + getWebServerSettings, IS_CLOUD, removeNotificationById, sendCustomNotification, @@ -66,7 +67,6 @@ import { apiUpdateTelegram, notifications, server, - user, } from "@/server/db/schema"; export const notificationRouter = createTRPCRouter({ @@ -364,21 +364,20 @@ export const notificationRouter = createTRPCRouter({ let organizationId = ""; let ServerName = ""; if (input.ServerType === "Dokploy") { - const result = await db - .select() - .from(user) - .where( - sql`${user.metricsConfig}::jsonb -> 'server' ->> 'token' = ${input.Token}`, - ); - - if (!result?.[0]?.id) { + const settings = await getWebServerSettings(); + if ( + !settings?.metricsConfig?.server?.token || + settings.metricsConfig.server.token !== input.Token + ) { throw new TRPCError({ code: "BAD_REQUEST", message: "Token not found", }); } - organizationId = result?.[0]?.id; + // For Dokploy server type, we don't have a specific organizationId + // This might need to be adjusted based on your business logic + organizationId = ""; ServerName = "Dokploy"; } else { const result = await db