From 5e7486859ff1df73edddf284635615b6b3ecfc00 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Wed, 25 Dec 2024 01:32:07 -0600 Subject: [PATCH] refactor: update --- packages/server/src/setup/traefik-setup.ts | 568 ++++++++++----------- 1 file changed, 284 insertions(+), 284 deletions(-) diff --git a/packages/server/src/setup/traefik-setup.ts b/packages/server/src/setup/traefik-setup.ts index 270a4447..a7b853a6 100644 --- a/packages/server/src/setup/traefik-setup.ts +++ b/packages/server/src/setup/traefik-setup.ts @@ -9,325 +9,325 @@ import type { FileConfig } from "../utils/traefik/file-types"; import type { MainTraefikConfig } from "../utils/traefik/types"; export const TRAEFIK_SSL_PORT = - Number.parseInt(process.env.TRAEFIK_SSL_PORT!, 10) || 443; + Number.parseInt(process.env.TRAEFIK_SSL_PORT!, 10) || 443; export const TRAEFIK_PORT = - Number.parseInt(process.env.TRAEFIK_PORT!, 10) || 80; + Number.parseInt(process.env.TRAEFIK_PORT!, 10) || 80; export const TRAEFIK_VERSION = process.env.TRAEFIK_VERSION || "3.1.2"; interface TraefikOptions { - enableDashboard?: boolean; - env?: string[]; - serverId?: string; - additionalPorts?: { - targetPort: number; - publishedPort: number; - publishMode?: "ingress" | "host"; - }[]; + enableDashboard?: boolean; + env?: string[]; + serverId?: string; + additionalPorts?: { + targetPort: number; + publishedPort: number; + publishMode?: "ingress" | "host"; + }[]; } export const initializeTraefik = async ({ - enableDashboard = false, - env, - serverId, - additionalPorts = [], + enableDashboard = false, + env, + serverId, + additionalPorts = [], }: TraefikOptions = {}) => { - const { MAIN_TRAEFIK_PATH, DYNAMIC_TRAEFIK_PATH } = paths(!!serverId); - const imageName = `traefik:v${TRAEFIK_VERSION}`; - const containerName = "dokploy-traefik"; - const settings: CreateServiceOptions = { - Name: containerName, - TaskTemplate: { - ContainerSpec: { - Image: imageName, - Env: env, - Mounts: [ - { - Type: "bind", - Source: `${MAIN_TRAEFIK_PATH}/traefik.yml`, - Target: "/etc/traefik/traefik.yml", - }, - { - Type: "bind", - Source: DYNAMIC_TRAEFIK_PATH, - Target: "/etc/dokploy/traefik/dynamic", - }, - { - Type: "bind", - Source: "/var/run/docker.sock", - Target: "/var/run/docker.sock", - }, - ], - }, - Networks: [{ Target: "dokploy-network" }], - Placement: { - Constraints: ["node.role==manager"], - }, - }, - Mode: { - Replicated: { - Replicas: 1, - }, - }, - Labels: { - "traefik.enable": "true", - }, - EndpointSpec: { - Ports: [ - { - TargetPort: 443, - PublishedPort: TRAEFIK_SSL_PORT, - PublishMode: "host", - }, - { - TargetPort: 80, - PublishedPort: TRAEFIK_PORT, - PublishMode: "host", - }, - ...(enableDashboard - ? [ - { - TargetPort: 8080, - PublishedPort: 8080, - PublishMode: "host" as const, - }, - ] - : []), - ...additionalPorts.map((port) => ({ - TargetPort: port.targetPort, - PublishedPort: port.publishedPort, - PublishMode: port.publishMode || ("host" as const), - })), - ], - }, - }; - const docker = await getRemoteDocker(serverId); - try { - if (serverId) { - await pullRemoteImage(imageName, serverId); - } else { - await pullImage(imageName); - } + const { MAIN_TRAEFIK_PATH, DYNAMIC_TRAEFIK_PATH } = paths(!!serverId); + const imageName = `traefik:v${TRAEFIK_VERSION}`; + const containerName = "dokploy-traefik"; + const settings: CreateServiceOptions = { + Name: containerName, + TaskTemplate: { + ContainerSpec: { + Image: imageName, + Env: env, + Mounts: [ + { + Type: "bind", + Source: `${MAIN_TRAEFIK_PATH}/traefik.yml`, + Target: "/etc/traefik/traefik.yml", + }, + { + Type: "bind", + Source: DYNAMIC_TRAEFIK_PATH, + Target: "/etc/dokploy/traefik/dynamic", + }, + { + Type: "bind", + Source: "/var/run/docker.sock", + Target: "/var/run/docker.sock", + }, + ], + }, + Networks: [{ Target: "dokploy-network" }], + Placement: { + Constraints: ["node.role==manager"], + }, + }, + Mode: { + Replicated: { + Replicas: 1, + }, + }, + Labels: { + "traefik.enable": "true", + }, + EndpointSpec: { + Ports: [ + { + TargetPort: TRAEFIK_SSL_PORT, + PublishedPort: TRAEFIK_SSL_PORT, + PublishMode: "host", + }, + { + TargetPort: TRAEFIK_PORT, + PublishedPort: TRAEFIK_PORT, + PublishMode: "host", + }, + ...(enableDashboard + ? [ + { + TargetPort: 8080, + PublishedPort: 8080, + PublishMode: "host" as const, + }, + ] + : []), + ...additionalPorts.map((port) => ({ + TargetPort: port.targetPort, + PublishedPort: port.publishedPort, + PublishMode: port.publishMode || ("host" as const), + })), + ], + }, + }; + const docker = await getRemoteDocker(serverId); + try { + if (serverId) { + await pullRemoteImage(imageName, serverId); + } else { + await pullImage(imageName); + } - const service = docker.getService(containerName); - const inspect = await service.inspect(); + const service = docker.getService(containerName); + const inspect = await service.inspect(); - const existingEnv = inspect.Spec.TaskTemplate.ContainerSpec.Env || []; - const updatedEnv = !env ? existingEnv : env; + const existingEnv = inspect.Spec.TaskTemplate.ContainerSpec.Env || []; + const updatedEnv = !env ? existingEnv : env; - const updatedSettings = { - ...settings, - TaskTemplate: { - ...settings.TaskTemplate, - ContainerSpec: { - ...(settings?.TaskTemplate as ContainerTaskSpec).ContainerSpec, - Env: updatedEnv, - }, - }, - }; - await service.update({ - version: Number.parseInt(inspect.Version.Index), - ...updatedSettings, - }); + const updatedSettings = { + ...settings, + TaskTemplate: { + ...settings.TaskTemplate, + ContainerSpec: { + ...(settings?.TaskTemplate as ContainerTaskSpec).ContainerSpec, + Env: updatedEnv, + }, + }, + }; + await service.update({ + version: Number.parseInt(inspect.Version.Index), + ...updatedSettings, + }); - console.log("Traefik Started ✅"); - } catch (error) { - await docker.createService(settings); - console.log("Traefik Not Found: Starting ✅"); - } + console.log("Traefik Started ✅"); + } catch (error) { + await docker.createService(settings); + console.log("Traefik Not Found: Starting ✅"); + } }; export const createDefaultServerTraefikConfig = () => { - const { DYNAMIC_TRAEFIK_PATH } = paths(); - const configFilePath = path.join(DYNAMIC_TRAEFIK_PATH, "dokploy.yml"); + const { DYNAMIC_TRAEFIK_PATH } = paths(); + const configFilePath = path.join(DYNAMIC_TRAEFIK_PATH, "dokploy.yml"); - if (existsSync(configFilePath)) { - console.log("Default traefik config already exists"); - return; - } + if (existsSync(configFilePath)) { + console.log("Default traefik config already exists"); + return; + } - const appName = "dokploy"; - const serviceURLDefault = `http://${appName}:${process.env.PORT || 3000}`; - const config: FileConfig = { - http: { - routers: { - [`${appName}-router-app`]: { - rule: `Host(\`${appName}.docker.localhost\`) && PathPrefix(\`/\`)`, - service: `${appName}-service-app`, - entryPoints: ["web"], - }, - }, - services: { - [`${appName}-service-app`]: { - loadBalancer: { - servers: [{ url: serviceURLDefault }], - passHostHeader: true, - }, - }, - }, - }, - }; + const appName = "dokploy"; + const serviceURLDefault = `http://${appName}:${process.env.PORT || 3000}`; + const config: FileConfig = { + http: { + routers: { + [`${appName}-router-app`]: { + rule: `Host(\`${appName}.docker.localhost\`) && PathPrefix(\`/\`)`, + service: `${appName}-service-app`, + entryPoints: ["web"], + }, + }, + services: { + [`${appName}-service-app`]: { + loadBalancer: { + servers: [{ url: serviceURLDefault }], + passHostHeader: true, + }, + }, + }, + }, + }; - const yamlStr = dump(config); - mkdirSync(DYNAMIC_TRAEFIK_PATH, { recursive: true }); - writeFileSync( - path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`), - yamlStr, - "utf8", - ); + const yamlStr = dump(config); + mkdirSync(DYNAMIC_TRAEFIK_PATH, { recursive: true }); + writeFileSync( + path.join(DYNAMIC_TRAEFIK_PATH, `${appName}.yml`), + yamlStr, + "utf8" + ); }; export const getDefaultTraefikConfig = () => { - const configObject: MainTraefikConfig = { - providers: { - ...(process.env.NODE_ENV === "development" - ? { - docker: { - defaultRule: - "Host(`{{ trimPrefix `/` .Name }}.docker.localhost`)", - }, - } - : { - swarm: { - exposedByDefault: false, - watch: false, - }, - docker: { - exposedByDefault: false, - }, - }), - file: { - directory: "/etc/dokploy/traefik/dynamic", - watch: true, - }, - }, - entryPoints: { - web: { - address: `:${TRAEFIK_PORT}`, - }, - websecure: { - address: `:${TRAEFIK_SSL_PORT}`, - ...(process.env.NODE_ENV === "production" && { - http: { - tls: { - certResolver: "letsencrypt", - }, - }, - }), - }, - }, - api: { - insecure: true, - }, - ...(process.env.NODE_ENV === "production" && { - certificatesResolvers: { - letsencrypt: { - acme: { - email: "test@localhost.com", - storage: "/etc/dokploy/traefik/dynamic/acme.json", - httpChallenge: { - entryPoint: "web", - }, - }, - }, - }, - }), - }; + const configObject: MainTraefikConfig = { + providers: { + ...(process.env.NODE_ENV === "development" + ? { + docker: { + defaultRule: + "Host(`{{ trimPrefix `/` .Name }}.docker.localhost`)", + }, + } + : { + swarm: { + exposedByDefault: false, + watch: false, + }, + docker: { + exposedByDefault: false, + }, + }), + file: { + directory: "/etc/dokploy/traefik/dynamic", + watch: true, + }, + }, + entryPoints: { + web: { + address: `:${TRAEFIK_PORT}`, + }, + websecure: { + address: `:${TRAEFIK_SSL_PORT}`, + ...(process.env.NODE_ENV === "production" && { + http: { + tls: { + certResolver: "letsencrypt", + }, + }, + }), + }, + }, + api: { + insecure: true, + }, + ...(process.env.NODE_ENV === "production" && { + certificatesResolvers: { + letsencrypt: { + acme: { + email: "test@localhost.com", + storage: "/etc/dokploy/traefik/dynamic/acme.json", + httpChallenge: { + entryPoint: "web", + }, + }, + }, + }, + }), + }; - const yamlStr = dump(configObject); + const yamlStr = dump(configObject); - return yamlStr; + return yamlStr; }; export const getDefaultServerTraefikConfig = () => { - const configObject: MainTraefikConfig = { - providers: { - swarm: { - exposedByDefault: false, - watch: false, - }, - docker: { - exposedByDefault: false, - }, - file: { - directory: "/etc/dokploy/traefik/dynamic", - watch: true, - }, - }, - entryPoints: { - web: { - address: `:${TRAEFIK_PORT}`, - }, - websecure: { - address: `:${TRAEFIK_SSL_PORT}`, - http: { - tls: { - certResolver: "letsencrypt", - }, - }, - }, - }, - api: { - insecure: true, - }, - certificatesResolvers: { - letsencrypt: { - acme: { - email: "test@localhost.com", - storage: "/etc/dokploy/traefik/dynamic/acme.json", - httpChallenge: { - entryPoint: "web", - }, - }, - }, - }, - }; + const configObject: MainTraefikConfig = { + providers: { + swarm: { + exposedByDefault: false, + watch: false, + }, + docker: { + exposedByDefault: false, + }, + file: { + directory: "/etc/dokploy/traefik/dynamic", + watch: true, + }, + }, + entryPoints: { + web: { + address: `:${TRAEFIK_PORT}`, + }, + websecure: { + address: `:${TRAEFIK_SSL_PORT}`, + http: { + tls: { + certResolver: "letsencrypt", + }, + }, + }, + }, + api: { + insecure: true, + }, + certificatesResolvers: { + letsencrypt: { + acme: { + email: "test@localhost.com", + storage: "/etc/dokploy/traefik/dynamic/acme.json", + httpChallenge: { + entryPoint: "web", + }, + }, + }, + }, + }; - const yamlStr = dump(configObject); + const yamlStr = dump(configObject); - return yamlStr; + return yamlStr; }; export const createDefaultTraefikConfig = () => { - const { MAIN_TRAEFIK_PATH, DYNAMIC_TRAEFIK_PATH } = paths(); - const mainConfig = path.join(MAIN_TRAEFIK_PATH, "traefik.yml"); - const acmeJsonPath = path.join(DYNAMIC_TRAEFIK_PATH, "acme.json"); + const { MAIN_TRAEFIK_PATH, DYNAMIC_TRAEFIK_PATH } = paths(); + const mainConfig = path.join(MAIN_TRAEFIK_PATH, "traefik.yml"); + const acmeJsonPath = path.join(DYNAMIC_TRAEFIK_PATH, "acme.json"); - if (existsSync(acmeJsonPath)) { - chmodSync(acmeJsonPath, "600"); - } - if (existsSync(mainConfig)) { - console.log("Main config already exists"); - return; - } - const yamlStr = getDefaultTraefikConfig(); - mkdirSync(MAIN_TRAEFIK_PATH, { recursive: true }); - writeFileSync(mainConfig, yamlStr, "utf8"); + if (existsSync(acmeJsonPath)) { + chmodSync(acmeJsonPath, "600"); + } + if (existsSync(mainConfig)) { + console.log("Main config already exists"); + return; + } + const yamlStr = getDefaultTraefikConfig(); + mkdirSync(MAIN_TRAEFIK_PATH, { recursive: true }); + writeFileSync(mainConfig, yamlStr, "utf8"); }; export const getDefaultMiddlewares = () => { - const defaultMiddlewares = { - http: { - middlewares: { - "redirect-to-https": { - redirectScheme: { - scheme: "https", - permanent: true, - }, - }, - }, - }, - }; - const yamlStr = dump(defaultMiddlewares); - return yamlStr; + const defaultMiddlewares = { + http: { + middlewares: { + "redirect-to-https": { + redirectScheme: { + scheme: "https", + permanent: true, + }, + }, + }, + }, + }; + const yamlStr = dump(defaultMiddlewares); + return yamlStr; }; export const createDefaultMiddlewares = () => { - const { DYNAMIC_TRAEFIK_PATH } = paths(); - const middlewaresPath = path.join(DYNAMIC_TRAEFIK_PATH, "middlewares.yml"); - if (existsSync(middlewaresPath)) { - console.log("Default middlewares already exists"); - return; - } - const yamlStr = getDefaultMiddlewares(); - mkdirSync(DYNAMIC_TRAEFIK_PATH, { recursive: true }); - writeFileSync(middlewaresPath, yamlStr, "utf8"); + const { DYNAMIC_TRAEFIK_PATH } = paths(); + const middlewaresPath = path.join(DYNAMIC_TRAEFIK_PATH, "middlewares.yml"); + if (existsSync(middlewaresPath)) { + console.log("Default middlewares already exists"); + return; + } + const yamlStr = getDefaultMiddlewares(); + mkdirSync(DYNAMIC_TRAEFIK_PATH, { recursive: true }); + writeFileSync(middlewaresPath, yamlStr, "utf8"); };