From 527e311239f56030a9eba27f96bbd78ad08e3756 Mon Sep 17 00:00:00 2001 From: biersoeckli Date: Fri, 21 Aug 2026 12:28:33 +0000 Subject: [PATCH 1/3] feat: add deployment creation logic and update server hostname constant --- src/app/settings/server/actions.ts | 1 + src/server/services/param.service.ts | 2 +- src/server/services/qs.service.ts | 11 +++++++++++ src/shared/utils/constants.ts | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app/settings/server/actions.ts b/src/app/settings/server/actions.ts index d755c02f..7c2df331 100644 --- a/src/app/settings/server/actions.ts +++ b/src/app/settings/server/actions.ts @@ -115,6 +115,7 @@ export const updateIngressSettings = async (prevState: any, inputData: QsIngress await quickStackService.createOrUpdateService(!validatedData.disableNodePortAccess); await quickStackService.createOrUpdateIngress(validatedData.serverUrl); + await quickStackService.createOrUpdateDeployment(); }); diff --git a/src/server/services/param.service.ts b/src/server/services/param.service.ts index 67b73484..e9d69e25 100644 --- a/src/server/services/param.service.ts +++ b/src/server/services/param.service.ts @@ -7,7 +7,7 @@ import { CryptoUtils } from "../utils/crypto.utils"; export class ParamService { - static readonly QS_SERVER_HOSTNAME = 'qsServerHostname'; + static readonly QS_SERVER_HOSTNAME = Constants.QS_PARAM_SERVER_HOSTNAME; static readonly DISABLE_NODEPORT_ACCESS = 'disableNodePortAccess'; static readonly LETS_ENCRYPT_MAIL = 'letsEncryptMail'; static readonly USE_CANARY_CHANNEL = 'useCanaryChannel'; diff --git a/src/server/services/qs.service.ts b/src/server/services/qs.service.ts index 42a7c3a2..8e4d861c 100644 --- a/src/server/services/qs.service.ts +++ b/src/server/services/qs.service.ts @@ -6,6 +6,8 @@ import crypto from "crypto"; import { FancyConsoleUtils } from "../../shared/utils/fancy-console.utils"; import standalonePodService from "./standalone-services/standalone-pod.service"; import ingressSetupService from "./setup-services/ingress-setup.service"; +import dataAccess from "../adapter/db.client"; +import { Constants } from "@/shared/utils/constants"; class QuickStackService { @@ -259,6 +261,11 @@ class QuickStackService { async createOrUpdateDeployment(inputNextAuthSecret?: string, imageTag = 'latest') { const generatedNextAuthSecret = crypto.randomBytes(32).toString('base64'); const existingDeployment = await this.getExistingDeployment(); + const hostnameParam = await dataAccess.client.parameter.findUnique({ + where: { name: Constants.QS_PARAM_SERVER_HOSTNAME }, + select: { value: true }, + }); + const nextAuthUrl = hostnameParam?.value ? `https://${hostnameParam.value}` : undefined; const body: V1Deployment = { metadata: { name: this.QUICKSTACK_DEPLOYMENT_NAME, @@ -299,6 +306,10 @@ class QuickStackService { name: 'NEXTAUTH_SECRET', value: inputNextAuthSecret || existingDeployment.nextAuthSecret || generatedNextAuthSecret }, + ...nextAuthUrl ? [{ + name: 'NEXTAUTH_URL', + value: nextAuthUrl, + }] : [], ...process.env.K3S_JOIN_TOKEN ? [{ name: 'K3S_JOIN_TOKEN', value: process.env.K3S_JOIN_TOKEN diff --git a/src/shared/utils/constants.ts b/src/shared/utils/constants.ts index 0e2fbbd9..f872cb71 100644 --- a/src/shared/utils/constants.ts +++ b/src/shared/utils/constants.ts @@ -41,5 +41,6 @@ export class Constants { static readonly QS_AUTH_PROXY_IMAGE = 'quickstack/auth-proxy:canary'; static readonly QS_AGENT_CLAIM_COOKIE = 'qs-agent-claim'; static readonly QS_AGENT_ACCESS_COOKIE = 'qs-agent-access'; + static readonly QS_PARAM_SERVER_HOSTNAME = 'qsServerHostname'; } From 3a109364625671dc45bf468e6b83880ee41ac75a Mon Sep 17 00:00:00 2001 From: biersoeckli Date: Fri, 21 Aug 2026 12:43:38 +0000 Subject: [PATCH 2/3] fix: add delay before deployment update to prevent UI error on backend restart --- src/app/settings/server/actions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/settings/server/actions.ts b/src/app/settings/server/actions.ts index 7c2df331..5db79f52 100644 --- a/src/app/settings/server/actions.ts +++ b/src/app/settings/server/actions.ts @@ -115,7 +115,8 @@ export const updateIngressSettings = async (prevState: any, inputData: QsIngress await quickStackService.createOrUpdateService(!validatedData.disableNodePortAccess); await quickStackService.createOrUpdateIngress(validatedData.serverUrl); - await quickStackService.createOrUpdateDeployment(); + setTimeout(() => quickStackService.createOrUpdateDeployment(), 2000); // delay is needed to ensure that the response is sent before the backend restarts, otherwise an error is shown in the UI. + }); From 0d542b26677f37ddb34744c2d53a5d5b5b9f63be Mon Sep 17 00:00:00 2001 From: biersoeckli Date: Fri, 21 Aug 2026 12:57:38 +0000 Subject: [PATCH 3/3] fix: update deployment creation logic to include release channel parameter --- src/app/settings/server/actions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/settings/server/actions.ts b/src/app/settings/server/actions.ts index 5db79f52..40835682 100644 --- a/src/app/settings/server/actions.ts +++ b/src/app/settings/server/actions.ts @@ -113,9 +113,11 @@ export const updateIngressSettings = async (prevState: any, inputData: QsIngress value: validatedData.disableNodePortAccess + '' }); + const currentReleaseChannel = await paramService.getString(ParamService.USE_CANARY_CHANNEL, 'false'); + await quickStackService.createOrUpdateService(!validatedData.disableNodePortAccess); await quickStackService.createOrUpdateIngress(validatedData.serverUrl); - setTimeout(() => quickStackService.createOrUpdateDeployment(), 2000); // delay is needed to ensure that the response is sent before the backend restarts, otherwise an error is shown in the UI. + setTimeout(() => quickStackService.createOrUpdateDeployment(undefined, currentReleaseChannel === 'true' ? 'canary' : 'latest'), 2000); // delay is needed to ensure that the response is sent before the backend restarts, otherwise an error is shown in the UI. });