From e4c0a157e3d5c1b83732fec2deeb032b9c0f3630 Mon Sep 17 00:00:00 2001 From: Owen Date: Sun, 5 Oct 2025 15:46:46 -0700 Subject: [PATCH] Add to oss traefik config and fix create/update --- server/lib/traefik/getTraefikConfig.ts | 36 ++++++++++++++++++++++---- server/routers/target/createTarget.ts | 5 +++- server/routers/target/updateTarget.ts | 5 +++- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/server/lib/traefik/getTraefikConfig.ts b/server/lib/traefik/getTraefikConfig.ts index 598ce984..97a6826d 100644 --- a/server/lib/traefik/getTraefikConfig.ts +++ b/server/lib/traefik/getTraefikConfig.ts @@ -1,5 +1,5 @@ import { db, exitNodes, targetHealthCheck } from "@server/db"; -import { and, eq, inArray, or, isNull, ne, isNotNull } from "drizzle-orm"; +import { and, eq, inArray, or, isNull, ne, isNotNull, desc } from "drizzle-orm"; import logger from "@server/logger"; import config from "@server/lib/config"; import { orgs, resources, sites, Target, targets } from "@server/db"; @@ -124,6 +124,8 @@ export async function getTraefikConfig( pathMatchType: targets.pathMatchType, rewritePath: targets.rewritePath, rewritePathType: targets.rewritePathType, + priority: targets.priority, + // Site fields siteId: sites.siteId, siteType: sites.type, @@ -152,7 +154,8 @@ export async function getTraefikConfig( ? isNotNull(resources.http) // ignore the http check if allow_raw_resources is true : eq(resources.http, true) ) - ); + ) + .orderBy(desc(targets.priority), targets.targetId); // stable ordering // Group by resource and include targets with their unique site data const resourcesMap = new Map(); @@ -163,6 +166,7 @@ export async function getTraefikConfig( const pathMatchType = row.pathMatchType || ""; const rewritePath = row.rewritePath || ""; const rewritePathType = row.rewritePathType || ""; + const priority = row.priority ?? 100; // Create a unique key combining resourceId, path config, and rewrite config const pathKey = [targetPath, pathMatchType, rewritePath, rewritePathType] @@ -202,7 +206,8 @@ export async function getTraefikConfig( path: row.path, // the targets will all have the same path pathMatchType: row.pathMatchType, // the targets will all have the same pathMatchType rewritePath: row.rewritePath, - rewritePathType: row.rewritePathType + rewritePathType: row.rewritePathType, + priority: priority // may be null, we fallback later }); } @@ -217,6 +222,7 @@ export async function getTraefikConfig( enabled: row.targetEnabled, rewritePath: row.rewritePath, rewritePathType: row.rewritePathType, + priority: row.priority, site: { siteId: row.siteId, type: row.siteType, @@ -402,10 +408,30 @@ export async function getTraefikConfig( // Build routing rules let rule = `Host(\`${fullDomain}\`)`; - let priority = 100; + + // priority logic + let priority: number; + if (resource.priority && resource.priority != 100) { + priority = resource.priority; + } else { + priority = 100; + if (resource.path && resource.pathMatchType) { + priority += 10; + if (resource.pathMatchType === "exact") { + priority += 5; + } else if (resource.pathMatchType === "prefix") { + priority += 3; + } else if (resource.pathMatchType === "regex") { + priority += 2; + } + if (resource.path === "/") { + priority = 1; // lowest for catch-all + } + } + } if (resource.path && resource.pathMatchType) { - priority += 1; + // priority += 1; // add path to rule based on match type let path = resource.path; // if the path doesn't start with a /, add it diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index d5be025b..73e21521 100644 --- a/server/routers/target/createTarget.ts +++ b/server/routers/target/createTarget.ts @@ -211,7 +211,10 @@ export async function createTarget( internalPort, enabled: targetData.enabled, path: targetData.path, - pathMatchType: targetData.pathMatchType + pathMatchType: targetData.pathMatchType, + rewritePath: targetData.rewritePath, + rewritePathType: targetData.rewritePathType, + priority: targetData.priority }) .returning(); diff --git a/server/routers/target/updateTarget.ts b/server/routers/target/updateTarget.ts index d66c7cd0..d332609d 100644 --- a/server/routers/target/updateTarget.ts +++ b/server/routers/target/updateTarget.ts @@ -199,7 +199,10 @@ export async function updateTarget( internalPort, enabled: parsedBody.data.enabled, path: parsedBody.data.path, - pathMatchType: parsedBody.data.pathMatchType + pathMatchType: parsedBody.data.pathMatchType, + priority: parsedBody.data.priority, + rewritePath: parsedBody.data.rewritePath, + rewritePathType: parsedBody.data.rewritePathType }) .where(eq(targets.targetId, targetId)) .returning();