diff --git a/server/lib/remoteTraefikConfig.ts b/server/lib/remoteTraefikConfig.ts index d6289dea..a31aee29 100644 --- a/server/lib/remoteTraefikConfig.ts +++ b/server/lib/remoteTraefikConfig.ts @@ -210,9 +210,9 @@ export class TraefikConfigManager { } } - // logger.debug( - // `Successfully retrieved traefik config: ${JSON.stringify(traefikConfig)}` - // ); + logger.debug( + `Successfully retrieved traefik config: ${JSON.stringify(traefikConfig)}` + ); const badgerMiddlewareName = "badger"; if (traefikConfig?.http?.middlewares) { diff --git a/server/routers/traefik/getTraefikConfig.ts b/server/routers/traefik/getTraefikConfig.ts index e25a48cf..441b4328 100644 --- a/server/routers/traefik/getTraefikConfig.ts +++ b/server/routers/traefik/getTraefikConfig.ts @@ -81,6 +81,16 @@ export async function traefikConfigProvider( } export async function getTraefikConfig(exitNodeId: number): Promise { + // Define extended target type with site information + type TargetWithSite = Target & { + site: { + siteId: number; + type: string; + subnet: string | null; + exitNodeId: number | null; + }; + }; + // Get all resources with related data const allResources = await db.transaction(async (tx) => { // Get resources with their targets and sites in a single optimized query @@ -122,9 +132,10 @@ export async function getTraefikConfig(exitNodeId: number): Promise { eq(targets.enabled, true), eq(resources.enabled, true), or( - eq(sites.exitNodeId, currentExitNodeId), + eq(sites.exitNodeId, exitNodeId), isNull(sites.exitNodeId) ), + ne(targetHealthCheck.hcHealth, "unhealthy") ) ); @@ -192,7 +203,6 @@ export async function getTraefikConfig(exitNodeId: number): Promise { for (const resource of allResources) { const targets = resource.targets; - const site = resource.site; const routerName = `${resource.resourceId}-router`; const serviceName = `${resource.resourceId}-service`; @@ -295,14 +305,14 @@ export async function getTraefikConfig(exitNodeId: number): Promise { config_output.http.services![serviceName] = { loadBalancer: { - servers: targets - .filter((target: Target) => { + servers: (targets as TargetWithSite[]) + .filter((target: TargetWithSite) => { if (!target.enabled) { return false; } if ( - site.type === "local" || - site.type === "wireguard" + target.site.type === "local" || + target.site.type === "wireguard" ) { if ( !target.ip || @@ -311,27 +321,27 @@ export async function getTraefikConfig(exitNodeId: number): Promise { ) { return false; } - } else if (site.type === "newt") { + } else if (target.site.type === "newt") { if ( !target.internalPort || !target.method || - !site.subnet + !target.site.subnet ) { return false; } } return true; }) - .map((target: Target) => { + .map((target: TargetWithSite) => { if ( - site.type === "local" || - site.type === "wireguard" + target.site.type === "local" || + target.site.type === "wireguard" ) { return { url: `${target.method}://${target.ip}:${target.port}` }; - } else if (site.type === "newt") { - const ip = site.subnet!.split("/")[0]; + } else if (target.site.type === "newt") { + const ip = target.site.subnet!.split("/")[0]; return { url: `${target.method}://${ip}:${target.internalPort}` }; @@ -415,35 +425,35 @@ export async function getTraefikConfig(exitNodeId: number): Promise { config_output[protocol].services[serviceName] = { loadBalancer: { - servers: targets - .filter((target: Target) => { + servers: (targets as TargetWithSite[]) + .filter((target: TargetWithSite) => { if (!target.enabled) { return false; } if ( - site.type === "local" || - site.type === "wireguard" + target.site.type === "local" || + target.site.type === "wireguard" ) { if (!target.ip || !target.port) { return false; } - } else if (site.type === "newt") { - if (!target.internalPort || !site.subnet) { + } else if (target.site.type === "newt") { + if (!target.internalPort || !target.site.subnet) { return false; } } return true; }) - .map((target: Target) => { + .map((target: TargetWithSite) => { if ( - site.type === "local" || - site.type === "wireguard" + target.site.type === "local" || + target.site.type === "wireguard" ) { return { address: `${target.ip}:${target.port}` }; - } else if (site.type === "newt") { - const ip = site.subnet!.split("/")[0]; + } else if (target.site.type === "newt") { + const ip = target.site.subnet!.split("/")[0]; return { address: `${ip}:${target.internalPort}` };