From 8699e024ee1f80e53bd9495d7c8776aebfddaa5d Mon Sep 17 00:00:00 2001 From: UndefinedPony Date: Sat, 21 Dec 2024 10:05:31 +0100 Subject: [PATCH] refactor: add try catch, add default update data --- apps/dokploy/server/api/routers/settings.ts | 3 +- packages/server/src/services/settings.ts | 34 ++++++++++++++++----- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/apps/dokploy/server/api/routers/settings.ts b/apps/dokploy/server/api/routers/settings.ts index 2861511e5..937c93d3d 100644 --- a/apps/dokploy/server/api/routers/settings.ts +++ b/apps/dokploy/server/api/routers/settings.ts @@ -52,6 +52,7 @@ import { writeConfig, writeMainConfig, writeTraefikConfigInPath, + DEFAULT_UPDATE_DATA, } from "@dokploy/server"; import { checkGPUStatus, setupGPUSupport } from "@dokploy/server"; import { generateOpenApiDocument } from "@dokploy/trpc-openapi"; @@ -345,7 +346,7 @@ export const settingsRouter = createTRPCRouter({ }), getUpdateData: adminProcedure.mutation(async () => { if (IS_CLOUD) { - return { latestVersion: null, updateAvailable: false }; + return DEFAULT_UPDATE_DATA; } return await getUpdateData(); diff --git a/packages/server/src/services/settings.ts b/packages/server/src/services/settings.ts index a3bd3f090..0d2ec9671 100644 --- a/packages/server/src/services/settings.ts +++ b/packages/server/src/services/settings.ts @@ -7,6 +7,16 @@ import { } from "@dokploy/server/utils/process/execAsync"; // import packageInfo from "../../../package.json"; +export interface IUpdateData { + latestVersion: string | null; + updateAvailable: boolean; +} + +export const DEFAULT_UPDATE_DATA: IUpdateData = { + latestVersion: null, + updateAvailable: false, +}; + /** Returns current Dokploy docker image tag or `latest` by default. */ export const getDokployImageTag = () => { return process.env.RELEASE_TAG || "latest"; @@ -30,17 +40,27 @@ export const getServiceImageDigest = async () => { const { stdout } = await execAsync( "docker service inspect dokploy --format '{{.Spec.TaskTemplate.ContainerSpec.Image}}'", ); + const currentDigest = stdout.trim().split("@")[1]; + if (!currentDigest) { + throw new Error("Could not get current service image digest"); + } + return currentDigest; }; /** Returns latest version number and information whether server update is available by comparing current image's digest against digest for provided image tag via Docker hub API. */ -export const getUpdateData = async (): Promise<{ - latestVersion: string | null; - updateAvailable: boolean; -}> => { - const currentDigest = await getServiceImageDigest(); +export const getUpdateData = async (): Promise => { + let currentDigest: string; + try { + currentDigest = await getServiceImageDigest(); + } catch { + // Docker service might not exist locally + // You can run the # Installation command for docker service create mentioned in the below docs to test it locally: + // https://docs.dokploy.com/docs/core/manual-installation + return DEFAULT_UPDATE_DATA; + } const url = "https://hub.docker.com/v2/repositories/dokploy/dokploy/tags"; const response = await fetch(url, { @@ -55,7 +75,7 @@ export const getUpdateData = async (): Promise<{ const latestTagDigest = results.find((t) => t.name === "latest")?.digest; if (!latestTagDigest) { - return { latestVersion: null, updateAvailable: false }; + return DEFAULT_UPDATE_DATA; } const versionedTag = results.find( @@ -63,7 +83,7 @@ export const getUpdateData = async (): Promise<{ ); if (!versionedTag) { - return { latestVersion: null, updateAvailable: false }; + return DEFAULT_UPDATE_DATA; } const { name: latestVersion, digest } = versionedTag;