From 5750c89b92ef291ddd49687aaf4db2bc79f9cf1f Mon Sep 17 00:00:00 2001 From: Milo Schwartz Date: Sat, 28 Sep 2024 23:19:39 -0400 Subject: [PATCH] make fields in provider endpoint optional --- server/db/schema.ts | 1 + server/migrations/.gitkeep | 0 .../traefik-config-provider/configSchema.ts | 8 ++-- server/traefik-config-provider/index.ts | 44 ++++++++++++------- 4 files changed, 32 insertions(+), 21 deletions(-) delete mode 100644 server/migrations/.gitkeep diff --git a/server/db/schema.ts b/server/db/schema.ts index 08222235..bf358d34 100644 --- a/server/db/schema.ts +++ b/server/db/schema.ts @@ -44,6 +44,7 @@ export const targets = sqliteTable("targets", { method: text("method").notNull(), port: integer("port").notNull(), protocol: text("protocol"), + enabled: integer("enabled", { mode: "boolean" }).notNull().default(true), }); // Exit Nodes table diff --git a/server/migrations/.gitkeep b/server/migrations/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/server/traefik-config-provider/configSchema.ts b/server/traefik-config-provider/configSchema.ts index d23630b6..3f61a822 100644 --- a/server/traefik-config-provider/configSchema.ts +++ b/server/traefik-config-provider/configSchema.ts @@ -1,11 +1,11 @@ export type DynamicTraefikConfig = { - http: Http; + http?: Http; }; export type Http = { - routers: Routers; - services: Services; - middlewares: Middlewares; + routers?: Routers; + services?: Services; + middlewares?: Middlewares; }; export type Routers = { diff --git a/server/traefik-config-provider/index.ts b/server/traefik-config-provider/index.ts index 1de0a3e9..16a00684 100644 --- a/server/traefik-config-provider/index.ts +++ b/server/traefik-config-provider/index.ts @@ -2,13 +2,14 @@ import { Request, Response } from "express"; import db from "@server/db"; import * as schema from "@server/db/schema"; import { DynamicTraefikConfig } from "./configSchema"; -import { like } from "drizzle-orm"; +import { and, like, eq } from "drizzle-orm"; import logger from "@server/logger"; export async function traefikConfigProvider(_: Request, res: Response) { try { const targets = await getAllTargets(); const traefikConfig = buildTraefikConfig(targets); + logger.debug("Built traefik config"); res.status(200).send(traefikConfig); } catch (e) { logger.error(`Failed to build traefik config: ${e}`); @@ -21,35 +22,39 @@ export function buildTraefikConfig( ): DynamicTraefikConfig { const middlewareName = "gerbil"; + if (!targets.length) { + return {}; + } + const http: DynamicTraefikConfig["http"] = { routers: {}, services: {}, - middlewares: { - [middlewareName]: { - plugin: { - [middlewareName]: { - // These are temporary values - APIEndpoint: - "http://host.docker.internal:3001/api/v1/gerbil", - ValidToken: "abc123", - }, - }, - }, - }, + // middlewares: { + // [middlewareName]: { + // plugin: { + // [middlewareName]: { + // // These are temporary values + // APIEndpoint: + // "http://host.docker.internal:3001/api/v1/gerbil", + // ValidToken: "abc123", + // }, + // }, + // }, + // }, }; for (const target of targets) { const routerName = `router-${target.targetId}`; const serviceName = `service-${target.targetId}`; - http.routers[routerName] = { + http.routers![routerName] = { entryPoints: [target.method], - middlewares: [middlewareName], + middlewares: [], service: serviceName, rule: `Host(\`${target.resourceId}\`)`, // assuming resourceId is a valid full hostname }; - http.services[serviceName] = { + http.services![serviceName] = { loadBalancer: { servers: [ { url: `${target.method}://${target.ip}:${target.port}` }, @@ -65,6 +70,11 @@ export async function getAllTargets(): Promise { const all = await db .select() .from(schema.targets) - .where(like(schema.targets.resourceId, "%.%")); // any resourceId with a dot is a valid hostname; otherwise it's a UUID placeholder + .where( + and( + eq(schema.targets.enabled, true), + like(schema.targets.resourceId, "%.%"), + ), + ); // any resourceId with a dot is a valid hostname; otherwise it's a UUID placeholder return all; }