From 375211f1847b89b9889c54dfda9b725140c60cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Sch=C3=A4fer?= Date: Sat, 28 Feb 2026 23:56:28 +0100 Subject: [PATCH 1/7] feat(kubernetes): enable newtInstances by default and update installation instructions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc Schäfer --- src/components/newt-install-commands.tsx | 110 ++++++++++++----------- 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/src/components/newt-install-commands.tsx b/src/components/newt-install-commands.tsx index 5a252f0d5..86acc492f 100644 --- a/src/components/newt-install-commands.tsx +++ b/src/components/newt-install-commands.tsx @@ -101,6 +101,7 @@ export function NewtSiteInstallCommands({ `helm install newt fossorial/newt \\ --create-namespace \\ --set newtInstances[0].name="main-tunnel" \\ + --set newtInstances[0].enabled=true \\ --set-string newtInstances[0].auth.keys.endpointKey="${endpoint}" \\ --set-string newtInstances[0].auth.keys.idKey="${id}" \\ --set-string newtInstances[0].auth.keys.secretKey="${secret}"` @@ -185,59 +186,68 @@ WantedBy=default.target` className="mt-4" /> -
-

- {t("siteConfiguration")} -

-
- { - const value = checked as boolean; - setAcceptClients(value); - }} - label={t("siteAcceptClientConnections")} - /> -
-

+

{t("siteConfiguration")}

+
+ { + const value = checked as boolean; + setAcceptClients(value); + }} + label={t("siteAcceptClientConnections")} + /> +
+

+ {t("siteAcceptClientConnectionsDescription")} +

+
+ +
+

{t("commands")}

+

+ For more and up to date Kubernetes installation + information, see{" "} + - {t("siteAcceptClientConnectionsDescription")} -

-
+ docs.pangolin.net/manage/sites/install-kubernetes + + . +

+
+ {commands.map((item, index) => { + const commandText = + typeof item === "string" ? item : item.command; + const title = + typeof item === "string" + ? undefined + : item.title; -
-

{t("commands")}

-
- {commands.map((item, index) => { - const commandText = - typeof item === "string" - ? item - : item.command; - const title = - typeof item === "string" - ? undefined - : item.title; - - return ( -
- {title && ( -

- {title} -

- )} - -
- ); - })} -
+ return ( +
+ {title && ( +

+ {title} +

+ )} + +
+ ); + })}
+
); From f36cf06e2624b66bf15a02ceea87fe7d3a86860d Mon Sep 17 00:00:00 2001 From: Fizza-Mukhtar Date: Sun, 1 Mar 2026 01:43:15 -0800 Subject: [PATCH 2/7] fix: fallback to local targets when newt targets are unhealthy --- server/lib/traefik/getTraefikConfig.ts | 11 ++++++++++- server/private/lib/traefik/getTraefikConfig.ts | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/server/lib/traefik/getTraefikConfig.ts b/server/lib/traefik/getTraefikConfig.ts index 06754ffa2..c55bad90d 100644 --- a/server/lib/traefik/getTraefikConfig.ts +++ b/server/lib/traefik/getTraefikConfig.ts @@ -490,7 +490,11 @@ export async function getTraefikConfig( if (target.health == "unhealthy") { return false; } - + + // Local sites don't report online status, always include them as fallback + if (target.site.type === "local") { + return true; + } // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { return false; @@ -614,6 +618,11 @@ export async function getTraefikConfig( return false; } + // Local sites don't report online status, always include them as fallback + if (target.site.type === "local") { + return true; + } + // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { return false; diff --git a/server/private/lib/traefik/getTraefikConfig.ts b/server/private/lib/traefik/getTraefikConfig.ts index f0343c5d4..6a4463719 100644 --- a/server/private/lib/traefik/getTraefikConfig.ts +++ b/server/private/lib/traefik/getTraefikConfig.ts @@ -679,6 +679,11 @@ export async function getTraefikConfig( return false; } + // Local sites don't report online status, always include them as fallback + if (target.site.type === "local") { + return true; + } + // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { return false; @@ -801,6 +806,11 @@ export async function getTraefikConfig( if (!target.enabled) { return false; } + + // Local sites don't report online status, always include them as fallback + if (target.site.type === "local") { + return true; + } // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { From 7ce589c4f23deb64a40080cc1d46c908fdfec177 Mon Sep 17 00:00:00 2001 From: Fizza-Mukhtar Date: Sun, 1 Mar 2026 06:50:03 -0800 Subject: [PATCH 3/7] fix: exclude labels from container search to prevent false positives --- src/components/ContainersSelector.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/ContainersSelector.tsx b/src/components/ContainersSelector.tsx index 5a0f49f99..d4ba6c437 100644 --- a/src/components/ContainersSelector.tsx +++ b/src/components/ContainersSelector.tsx @@ -171,8 +171,7 @@ const DockerContainersTable: FC<{ ...Object.values(container.networks) .map((n) => n.ipAddress) .filter(Boolean), - ...getExposedPorts(container).map((p) => p.toString()), - ...Object.entries(container.labels).flat() + ...getExposedPorts(container).map((p) => p.toString()) ]; return searchableFields.some((field) => From e63a6e9b77d747e2cc1542124d6f9691bef0edb1 Mon Sep 17 00:00:00 2001 From: Fizza-Mukhtar Date: Sun, 1 Mar 2026 07:56:47 -0800 Subject: [PATCH 4/7] fix: treat local and wireguard sites as online for failover --- server/lib/traefik/getTraefikConfig.ts | 19 ++++++++---------- .../private/lib/traefik/getTraefikConfig.ts | 20 ++++++++----------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/server/lib/traefik/getTraefikConfig.ts b/server/lib/traefik/getTraefikConfig.ts index c55bad90d..1ce594dc8 100644 --- a/server/lib/traefik/getTraefikConfig.ts +++ b/server/lib/traefik/getTraefikConfig.ts @@ -477,7 +477,10 @@ export async function getTraefikConfig( // TODO: HOW TO HANDLE ^^^^^^ BETTER const anySitesOnline = targets.some( - (target) => target.site.online + (target) => + target.site.online || + target.site.type === "local" || + target.site.type === "wireguard" ); return ( @@ -491,10 +494,6 @@ export async function getTraefikConfig( return false; } - // Local sites don't report online status, always include them as fallback - if (target.site.type === "local") { - return true; - } // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { return false; @@ -609,7 +608,10 @@ export async function getTraefikConfig( servers: (() => { // Check if any sites are online const anySitesOnline = targets.some( - (target) => target.site.online + (target) => + target.site.online || + target.site.type === "local" || + target.site.type === "wireguard" ); return targets @@ -617,11 +619,6 @@ export async function getTraefikConfig( if (!target.enabled) { return false; } - - // Local sites don't report online status, always include them as fallback - if (target.site.type === "local") { - return true; - } // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { diff --git a/server/private/lib/traefik/getTraefikConfig.ts b/server/private/lib/traefik/getTraefikConfig.ts index 6a4463719..3f6c5fdc2 100644 --- a/server/private/lib/traefik/getTraefikConfig.ts +++ b/server/private/lib/traefik/getTraefikConfig.ts @@ -665,7 +665,10 @@ export async function getTraefikConfig( // TODO: HOW TO HANDLE ^^^^^^ BETTER const anySitesOnline = targets.some( - (target) => target.site.online + (target) => + target.site.online || + target.site.type === "local" || + target.site.type === "wireguard" ); return ( @@ -679,11 +682,6 @@ export async function getTraefikConfig( return false; } - // Local sites don't report online status, always include them as fallback - if (target.site.type === "local") { - return true; - } - // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { return false; @@ -798,7 +796,10 @@ export async function getTraefikConfig( servers: (() => { // Check if any sites are online const anySitesOnline = targets.some( - (target) => target.site.online + (target) => + target.site.online || + target.site.type === "local" || + target.site.type === "wireguard" ); return targets @@ -806,11 +807,6 @@ export async function getTraefikConfig( if (!target.enabled) { return false; } - - // Local sites don't report online status, always include them as fallback - if (target.site.type === "local") { - return true; - } // If any sites are online, exclude offline sites if (anySitesOnline && !target.site.online) { From 6a537a23e8d2c2f878dfc5b5e3f93705f0c6f8c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Sch=C3=A4fer?= Date: Sun, 1 Mar 2026 18:17:45 +0100 Subject: [PATCH 5/7] fix(newt-install): conditionally display Kubernetes installation info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc Schäfer --- src/components/newt-install-commands.tsx | 32 +++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/components/newt-install-commands.tsx b/src/components/newt-install-commands.tsx index 86acc492f..ba0363e3b 100644 --- a/src/components/newt-install-commands.tsx +++ b/src/components/newt-install-commands.tsx @@ -210,19 +210,21 @@ WantedBy=default.target`

{t("commands")}

-

- For more and up to date Kubernetes installation - information, see{" "} - - docs.pangolin.net/manage/sites/install-kubernetes - - . -

+ {platform === "kubernetes" && ( +

+ For more and up to date Kubernetes installation + information, see{" "} + + docs.pangolin.net/manage/sites/install-kubernetes + + . +

+ )}
{commands.map((item, index) => { const commandText = @@ -232,8 +234,10 @@ WantedBy=default.target` ? undefined : item.title; + const key = `${title ?? ""}::${commandText}`; + return ( -
+
{title && (

{title} From 34dadd0e16f0c68b8e2da0b9fce08a9e48c8a763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Sch=C3=A4fer?= Date: Sat, 28 Feb 2026 23:56:28 +0100 Subject: [PATCH 6/7] feat(kubernetes): enable newtInstances by default and update installation instructions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc Schäfer --- src/components/newt-install-commands.tsx | 110 ++++++++++++----------- 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/src/components/newt-install-commands.tsx b/src/components/newt-install-commands.tsx index 5a252f0d5..86acc492f 100644 --- a/src/components/newt-install-commands.tsx +++ b/src/components/newt-install-commands.tsx @@ -101,6 +101,7 @@ export function NewtSiteInstallCommands({ `helm install newt fossorial/newt \\ --create-namespace \\ --set newtInstances[0].name="main-tunnel" \\ + --set newtInstances[0].enabled=true \\ --set-string newtInstances[0].auth.keys.endpointKey="${endpoint}" \\ --set-string newtInstances[0].auth.keys.idKey="${id}" \\ --set-string newtInstances[0].auth.keys.secretKey="${secret}"` @@ -185,59 +186,68 @@ WantedBy=default.target` className="mt-4" /> -

-

- {t("siteConfiguration")} -

-
- { - const value = checked as boolean; - setAcceptClients(value); - }} - label={t("siteAcceptClientConnections")} - /> -
-

+

{t("siteConfiguration")}

+
+ { + const value = checked as boolean; + setAcceptClients(value); + }} + label={t("siteAcceptClientConnections")} + /> +
+

+ {t("siteAcceptClientConnectionsDescription")} +

+
+ +
+

{t("commands")}

+

+ For more and up to date Kubernetes installation + information, see{" "} + - {t("siteAcceptClientConnectionsDescription")} -

-
+ docs.pangolin.net/manage/sites/install-kubernetes + + . +

+
+ {commands.map((item, index) => { + const commandText = + typeof item === "string" ? item : item.command; + const title = + typeof item === "string" + ? undefined + : item.title; -
-

{t("commands")}

-
- {commands.map((item, index) => { - const commandText = - typeof item === "string" - ? item - : item.command; - const title = - typeof item === "string" - ? undefined - : item.title; - - return ( -
- {title && ( -

- {title} -

- )} - -
- ); - })} -
+ return ( +
+ {title && ( +

+ {title} +

+ )} + +
+ ); + })}
+
); From bb189874cb29f3aab7fc1c2b074e515a07114435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Sch=C3=A4fer?= Date: Sun, 1 Mar 2026 18:17:45 +0100 Subject: [PATCH 7/7] fix(newt-install): conditionally display Kubernetes installation info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc Schäfer --- src/components/newt-install-commands.tsx | 32 +++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/components/newt-install-commands.tsx b/src/components/newt-install-commands.tsx index 86acc492f..ba0363e3b 100644 --- a/src/components/newt-install-commands.tsx +++ b/src/components/newt-install-commands.tsx @@ -210,19 +210,21 @@ WantedBy=default.target`

{t("commands")}

-

- For more and up to date Kubernetes installation - information, see{" "} - - docs.pangolin.net/manage/sites/install-kubernetes - - . -

+ {platform === "kubernetes" && ( +

+ For more and up to date Kubernetes installation + information, see{" "} + + docs.pangolin.net/manage/sites/install-kubernetes + + . +

+ )}
{commands.map((item, index) => { const commandText = @@ -232,8 +234,10 @@ WantedBy=default.target` ? undefined : item.title; + const key = `${title ?? ""}::${commandText}`; + return ( -
+
{title && (

{title}