Fixing traefik problems

This commit is contained in:
Owen 2025-08-16 17:16:19 -07:00
parent 609435328e
commit 7ca507b1ce
No known key found for this signature in database
GPG key ID: 8271FDFFD9E0CCBD
2 changed files with 37 additions and 27 deletions

View file

@ -210,9 +210,9 @@ export class TraefikConfigManager {
} }
} }
// logger.debug( logger.debug(
// `Successfully retrieved traefik config: ${JSON.stringify(traefikConfig)}` `Successfully retrieved traefik config: ${JSON.stringify(traefikConfig)}`
// ); );
const badgerMiddlewareName = "badger"; const badgerMiddlewareName = "badger";
if (traefikConfig?.http?.middlewares) { if (traefikConfig?.http?.middlewares) {

View file

@ -81,6 +81,16 @@ export async function traefikConfigProvider(
} }
export async function getTraefikConfig(exitNodeId: number): Promise<any> { export async function getTraefikConfig(exitNodeId: number): Promise<any> {
// 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 // Get all resources with related data
const allResources = await db.transaction(async (tx) => { const allResources = await db.transaction(async (tx) => {
// Get resources with their targets and sites in a single optimized query // Get resources with their targets and sites in a single optimized query
@ -122,9 +132,10 @@ export async function getTraefikConfig(exitNodeId: number): Promise<any> {
eq(targets.enabled, true), eq(targets.enabled, true),
eq(resources.enabled, true), eq(resources.enabled, true),
or( or(
eq(sites.exitNodeId, currentExitNodeId), eq(sites.exitNodeId, exitNodeId),
isNull(sites.exitNodeId) isNull(sites.exitNodeId)
), ),
ne(targetHealthCheck.hcHealth, "unhealthy")
) )
); );
@ -192,7 +203,6 @@ export async function getTraefikConfig(exitNodeId: number): Promise<any> {
for (const resource of allResources) { for (const resource of allResources) {
const targets = resource.targets; const targets = resource.targets;
const site = resource.site;
const routerName = `${resource.resourceId}-router`; const routerName = `${resource.resourceId}-router`;
const serviceName = `${resource.resourceId}-service`; const serviceName = `${resource.resourceId}-service`;
@ -295,14 +305,14 @@ export async function getTraefikConfig(exitNodeId: number): Promise<any> {
config_output.http.services![serviceName] = { config_output.http.services![serviceName] = {
loadBalancer: { loadBalancer: {
servers: targets servers: (targets as TargetWithSite[])
.filter((target: Target) => { .filter((target: TargetWithSite) => {
if (!target.enabled) { if (!target.enabled) {
return false; return false;
} }
if ( if (
site.type === "local" || target.site.type === "local" ||
site.type === "wireguard" target.site.type === "wireguard"
) { ) {
if ( if (
!target.ip || !target.ip ||
@ -311,27 +321,27 @@ export async function getTraefikConfig(exitNodeId: number): Promise<any> {
) { ) {
return false; return false;
} }
} else if (site.type === "newt") { } else if (target.site.type === "newt") {
if ( if (
!target.internalPort || !target.internalPort ||
!target.method || !target.method ||
!site.subnet !target.site.subnet
) { ) {
return false; return false;
} }
} }
return true; return true;
}) })
.map((target: Target) => { .map((target: TargetWithSite) => {
if ( if (
site.type === "local" || target.site.type === "local" ||
site.type === "wireguard" target.site.type === "wireguard"
) { ) {
return { return {
url: `${target.method}://${target.ip}:${target.port}` url: `${target.method}://${target.ip}:${target.port}`
}; };
} else if (site.type === "newt") { } else if (target.site.type === "newt") {
const ip = site.subnet!.split("/")[0]; const ip = target.site.subnet!.split("/")[0];
return { return {
url: `${target.method}://${ip}:${target.internalPort}` url: `${target.method}://${ip}:${target.internalPort}`
}; };
@ -415,35 +425,35 @@ export async function getTraefikConfig(exitNodeId: number): Promise<any> {
config_output[protocol].services[serviceName] = { config_output[protocol].services[serviceName] = {
loadBalancer: { loadBalancer: {
servers: targets servers: (targets as TargetWithSite[])
.filter((target: Target) => { .filter((target: TargetWithSite) => {
if (!target.enabled) { if (!target.enabled) {
return false; return false;
} }
if ( if (
site.type === "local" || target.site.type === "local" ||
site.type === "wireguard" target.site.type === "wireguard"
) { ) {
if (!target.ip || !target.port) { if (!target.ip || !target.port) {
return false; return false;
} }
} else if (site.type === "newt") { } else if (target.site.type === "newt") {
if (!target.internalPort || !site.subnet) { if (!target.internalPort || !target.site.subnet) {
return false; return false;
} }
} }
return true; return true;
}) })
.map((target: Target) => { .map((target: TargetWithSite) => {
if ( if (
site.type === "local" || target.site.type === "local" ||
site.type === "wireguard" target.site.type === "wireguard"
) { ) {
return { return {
address: `${target.ip}:${target.port}` address: `${target.ip}:${target.port}`
}; };
} else if (site.type === "newt") { } else if (target.site.type === "newt") {
const ip = site.subnet!.split("/")[0]; const ip = target.site.subnet!.split("/")[0];
return { return {
address: `${ip}:${target.internalPort}` address: `${ip}:${target.internalPort}`
}; };