From f94e17134e511ffcc7e5fce91f88922bd2ad33de Mon Sep 17 00:00:00 2001 From: Aaron Styles Date: Sat, 30 Apr 2022 22:47:00 +1000 Subject: [PATCH] Added expose port for Services --- .../migration.sql | 2 ++ prisma/schema.prisma | 1 + src/lib/components/common.ts | 8 +++++ src/lib/database/services.ts | 32 ++++++++++++++----- src/lib/queues/builder.ts | 2 +- .../services/[id]/_Services/_Services.svelte | 27 ++++++++++++++++ src/routes/services/[id]/ghost/index.json.ts | 3 +- src/routes/services/[id]/ghost/start.json.ts | 5 +++ .../services/[id]/languagetool/index.json.ts | 6 ++-- .../services/[id]/languagetool/start.json.ts | 6 +++- .../services/[id]/meilisearch/index.json.ts | 5 +-- .../services/[id]/meilisearch/start.json.ts | 6 +++- src/routes/services/[id]/minio/index.json.ts | 5 +-- src/routes/services/[id]/minio/start.json.ts | 4 +++ src/routes/services/[id]/n8n/index.json.ts | 5 +-- src/routes/services/[id]/n8n/start.json.ts | 5 ++- src/routes/services/[id]/nocodb/index.json.ts | 5 +-- src/routes/services/[id]/nocodb/start.json.ts | 6 +++- .../[id]/plausibleanalytics/index.json.ts | 4 ++- .../[id]/plausibleanalytics/start.json.ts | 4 +++ src/routes/services/[id]/umami/index.json.ts | 5 +-- src/routes/services/[id]/umami/start.json.ts | 4 +++ .../services/[id]/uptimekuma/index.json.ts | 5 +-- .../services/[id]/uptimekuma/start.json.ts | 6 +++- .../services/[id]/vaultwarden/index.json.ts | 5 +-- .../services/[id]/vaultwarden/start.json.ts | 6 +++- .../services/[id]/vscodeserver/index.json.ts | 5 +-- .../services/[id]/vscodeserver/start.json.ts | 4 +++ .../services/[id]/wordpress/index.json.ts | 4 ++- .../services/[id]/wordpress/start.json.ts | 4 +++ 30 files changed, 153 insertions(+), 36 deletions(-) create mode 100644 prisma/migrations/20220430124553_expose_port_for_services/migration.sql diff --git a/prisma/migrations/20220430124553_expose_port_for_services/migration.sql b/prisma/migrations/20220430124553_expose_port_for_services/migration.sql new file mode 100644 index 000000000..fdbab5713 --- /dev/null +++ b/prisma/migrations/20220430124553_expose_port_for_services/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Service" ADD COLUMN "exposePort" INTEGER; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6cd94b395..20f655cee 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -287,6 +287,7 @@ model Service { id String @id @default(cuid()) name String fqdn String? + exposePort Int? dualCerts Boolean @default(false) type String? version String? diff --git a/src/lib/components/common.ts b/src/lib/components/common.ts index 760653cfa..e39c529bb 100644 --- a/src/lib/components/common.ts +++ b/src/lib/components/common.ts @@ -193,3 +193,11 @@ export const supportedServiceTypesAndVersions = [ } } ]; + +export const getServiceMainPort = (service: string) => { + const serviceType = supportedServiceTypesAndVersions.find((s) => s.name === service); + if (serviceType) { + return serviceType.ports.main; + } + return null; +}; diff --git a/src/lib/database/services.ts b/src/lib/database/services.ts index 4cb2e8b22..1831385cb 100644 --- a/src/lib/database/services.ts +++ b/src/lib/database/services.ts @@ -276,95 +276,109 @@ export async function updatePlausibleAnalyticsService({ id, fqdn, email, + exposePort, username, name }: { id: string; fqdn: string; + exposePort?: number; name: string; email: string; username: string; }): Promise { await prisma.plausibleAnalytics.update({ where: { serviceId: id }, data: { email, username } }); - await prisma.service.update({ where: { id }, data: { name, fqdn } }); + await prisma.service.update({ where: { id }, data: { name, fqdn, exposePort } }); } export async function updateService({ id, fqdn, + exposePort, name }: { id: string; fqdn: string; + exposePort?: number; name: string; }): Promise { - return await prisma.service.update({ where: { id }, data: { fqdn, name } }); + return await prisma.service.update({ where: { id }, data: { fqdn, name, exposePort } }); } export async function updateLanguageToolService({ id, fqdn, + exposePort, name }: { id: string; fqdn: string; + exposePort?: number; name: string; }): Promise { - return await prisma.service.update({ where: { id }, data: { fqdn, name } }); + return await prisma.service.update({ where: { id }, data: { fqdn, name, exposePort } }); } export async function updateMeiliSearchService({ id, fqdn, + exposePort, name }: { id: string; fqdn: string; + exposePort?: number; name: string; }): Promise { - return await prisma.service.update({ where: { id }, data: { fqdn, name } }); + return await prisma.service.update({ where: { id }, data: { fqdn, name, exposePort } }); } export async function updateVaultWardenService({ id, fqdn, + exposePort, name }: { id: string; fqdn: string; + exposePort?: number; name: string; }): Promise { - return await prisma.service.update({ where: { id }, data: { fqdn, name } }); + return await prisma.service.update({ where: { id }, data: { fqdn, name, exposePort } }); } export async function updateVsCodeServer({ id, fqdn, + exposePort, name }: { id: string; fqdn: string; + exposePort?: number; name: string; }): Promise { - return await prisma.service.update({ where: { id }, data: { fqdn, name } }); + return await prisma.service.update({ where: { id }, data: { fqdn, name, exposePort } }); } export async function updateWordpress({ id, fqdn, name, + exposePort, mysqlDatabase, extraConfig }: { id: string; fqdn: string; name: string; + exposePort?: number; mysqlDatabase: string; extraConfig: string; }): Promise { return await prisma.service.update({ where: { id }, - data: { fqdn, name, wordpress: { update: { mysqlDatabase, extraConfig } } } + data: { fqdn, name, exposePort, wordpress: { update: { mysqlDatabase, extraConfig } } } }); } @@ -382,16 +396,18 @@ export async function updateGhostService({ id, fqdn, name, + exposePort, mariadbDatabase }: { id: string; fqdn: string; name: string; + exposePort?: number; mariadbDatabase: string; }): Promise { return await prisma.service.update({ where: { id }, - data: { fqdn, name, ghost: { update: { mariadbDatabase } } } + data: { fqdn, name, exposePort, ghost: { update: { mariadbDatabase } } } }); } diff --git a/src/lib/queues/builder.ts b/src/lib/queues/builder.ts index a6cf0af75..6d5cbb263 100644 --- a/src/lib/queues/builder.ts +++ b/src/lib/queues/builder.ts @@ -189,7 +189,7 @@ export default async function (job: Job): Promise !isRunning && changeSettings('dualCerts')} /> +
+ { + showExposePort = !showExposePort; + service.exposePort = undefined; + }} + title={$t('application.expose_a_port')} + description="Expose a port to the host system" + /> +
+ + {#if showExposePort} +
+ + +
+ {/if} + {#if service.type === 'plausibleanalytics'} {:else if service.type === 'minio'} diff --git a/src/routes/services/[id]/ghost/index.json.ts b/src/routes/services/[id]/ghost/index.json.ts index 81ca8ade1..1b1225f59 100644 --- a/src/routes/services/[id]/ghost/index.json.ts +++ b/src/routes/services/[id]/ghost/index.json.ts @@ -11,11 +11,12 @@ export const post: RequestHandler = async (event) => { let { name, fqdn, + exposePort, ghost: { mariadbDatabase } } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); try { - await db.updateGhostService({ id, fqdn, name, mariadbDatabase }); + await db.updateGhostService({ id, fqdn, name, exposePort, mariadbDatabase }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/ghost/start.json.ts b/src/routes/services/[id]/ghost/start.json.ts index 45c6936fe..67e9364b9 100644 --- a/src/routes/services/[id]/ghost/start.json.ts +++ b/src/routes/services/[id]/ghost/start.json.ts @@ -12,6 +12,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -19,6 +20,8 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; + const port = getServiceMainPort('ghost'); + try { const service = await db.getService({ id, teamId }); const { @@ -27,6 +30,7 @@ export const post: RequestHandler = async (event) => { destinationDockerId, destinationDocker, serviceSecret, + exposePort, fqdn, ghost: { defaultEmail, @@ -89,6 +93,7 @@ export const post: RequestHandler = async (event) => { volumes: [config.ghost.volume], environment: config.ghost.environmentVariables, restart: 'always', + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), labels: makeLabelForServices('ghost'), depends_on: [`${id}-mariadb`], deploy: { diff --git a/src/routes/services/[id]/languagetool/index.json.ts b/src/routes/services/[id]/languagetool/index.json.ts index d717502c5..dcba0b6f8 100644 --- a/src/routes/services/[id]/languagetool/index.json.ts +++ b/src/routes/services/[id]/languagetool/index.json.ts @@ -9,13 +9,15 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { + console.log(error); return ErrorHandler(error); } }; diff --git a/src/routes/services/[id]/languagetool/start.json.ts b/src/routes/services/[id]/languagetool/start.json.ts index e11263161..0818ac6f7 100644 --- a/src/routes/services/[id]/languagetool/start.json.ts +++ b/src/routes/services/[id]/languagetool/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -15,9 +16,11 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); - const { type, version, destinationDockerId, destinationDocker, serviceSecret } = service; + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort } = + service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('languagetool'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -42,6 +45,7 @@ export const post: RequestHandler = async (event) => { networks: [network], environment: config.environmentVariables, restart: 'always', + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), volumes: [config.volume], labels: makeLabelForServices('languagetool'), deploy: { diff --git a/src/routes/services/[id]/meilisearch/index.json.ts b/src/routes/services/[id]/meilisearch/index.json.ts index d717502c5..ff98ede6d 100644 --- a/src/routes/services/[id]/meilisearch/index.json.ts +++ b/src/routes/services/[id]/meilisearch/index.json.ts @@ -9,11 +9,12 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/meilisearch/start.json.ts b/src/routes/services/[id]/meilisearch/start.json.ts index 1f11054a8..b019d69b9 100644 --- a/src/routes/services/[id]/meilisearch/start.json.ts +++ b/src/routes/services/[id]/meilisearch/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -18,9 +19,11 @@ export const post: RequestHandler = async (event) => { const { meiliSearch: { masterKey } } = service; - const { type, version, destinationDockerId, destinationDocker, serviceSecret } = service; + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort } = + service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('meilisearch'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -47,6 +50,7 @@ export const post: RequestHandler = async (event) => { networks: [network], environment: config.environmentVariables, restart: 'always', + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), volumes: [config.volume], labels: makeLabelForServices('meilisearch'), deploy: { diff --git a/src/routes/services/[id]/minio/index.json.ts b/src/routes/services/[id]/minio/index.json.ts index d717502c5..ff98ede6d 100644 --- a/src/routes/services/[id]/minio/index.json.ts +++ b/src/routes/services/[id]/minio/index.json.ts @@ -9,11 +9,12 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/minio/start.json.ts b/src/routes/services/[id]/minio/start.json.ts index c744eae80..3782bf467 100644 --- a/src/routes/services/[id]/minio/start.json.ts +++ b/src/routes/services/[id]/minio/start.json.ts @@ -7,6 +7,7 @@ import { startHttpProxy } from '$lib/haproxy'; import { ErrorHandler, getFreePort, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -22,12 +23,14 @@ export const post: RequestHandler = async (event) => { fqdn, destinationDockerId, destinationDocker, + exposePort, minio: { rootUser, rootUserPassword }, serviceSecret } = service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('minio'); const publicPort = await getFreePort(); @@ -62,6 +65,7 @@ export const post: RequestHandler = async (event) => { networks: [network], volumes: [config.volume], restart: 'always', + ...(exposePort && { ports: [`${port}:${port}`] }), labels: makeLabelForServices('minio'), deploy: { restart_policy: { diff --git a/src/routes/services/[id]/n8n/index.json.ts b/src/routes/services/[id]/n8n/index.json.ts index 5ec3fa69a..e269e8fe7 100644 --- a/src/routes/services/[id]/n8n/index.json.ts +++ b/src/routes/services/[id]/n8n/index.json.ts @@ -8,11 +8,12 @@ export const post: RequestHandler = async (event) => { if (status === 401) return { status, body }; const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/n8n/start.json.ts b/src/routes/services/[id]/n8n/start.json.ts index 7386a4fd9..cca55b61e 100644 --- a/src/routes/services/[id]/n8n/start.json.ts +++ b/src/routes/services/[id]/n8n/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -15,9 +16,11 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); - const { type, version, destinationDockerId, destinationDocker, serviceSecret } = service; + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort } = + service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('n8n'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); diff --git a/src/routes/services/[id]/nocodb/index.json.ts b/src/routes/services/[id]/nocodb/index.json.ts index 5ec3fa69a..e269e8fe7 100644 --- a/src/routes/services/[id]/nocodb/index.json.ts +++ b/src/routes/services/[id]/nocodb/index.json.ts @@ -8,11 +8,12 @@ export const post: RequestHandler = async (event) => { if (status === 401) return { status, body }; const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/nocodb/start.json.ts b/src/routes/services/[id]/nocodb/start.json.ts index 4933a5347..bf3a702df 100644 --- a/src/routes/services/[id]/nocodb/start.json.ts +++ b/src/routes/services/[id]/nocodb/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -15,9 +16,11 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); - const { type, version, destinationDockerId, destinationDocker, serviceSecret } = service; + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort } = + service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('nocodb'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -40,6 +43,7 @@ export const post: RequestHandler = async (event) => { networks: [network], environment: config.environmentVariables, restart: 'always', + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), labels: makeLabelForServices('nocodb'), deploy: { restart_policy: { diff --git a/src/routes/services/[id]/plausibleanalytics/index.json.ts b/src/routes/services/[id]/plausibleanalytics/index.json.ts index 519b582a2..0a5d375e7 100644 --- a/src/routes/services/[id]/plausibleanalytics/index.json.ts +++ b/src/routes/services/[id]/plausibleanalytics/index.json.ts @@ -11,14 +11,16 @@ export const post: RequestHandler = async (event) => { let { name, fqdn, + exposePort, plausibleAnalytics: { email, username } } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); if (email) email = email.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updatePlausibleAnalyticsService({ id, fqdn, name, email, username }); + await db.updatePlausibleAnalyticsService({ id, fqdn, name, email, username, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/plausibleanalytics/start.json.ts b/src/routes/services/[id]/plausibleanalytics/start.json.ts index 8b61e1ff8..8adce773a 100644 --- a/src/routes/services/[id]/plausibleanalytics/start.json.ts +++ b/src/routes/services/[id]/plausibleanalytics/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -22,6 +23,7 @@ export const post: RequestHandler = async (event) => { destinationDockerId, destinationDocker, serviceSecret, + exposePort, plausibleAnalytics: { id: plausibleDbId, username, @@ -78,6 +80,7 @@ export const post: RequestHandler = async (event) => { } const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('plausibleanalytics'); const { workdir } = await createDirectories({ repository: type, buildId: id }); @@ -132,6 +135,7 @@ COPY ./init-db.sh /docker-entrypoint-initdb.d/init-db.sh`; networks: [network], environment: config.plausibleAnalytics.environmentVariables, restart: 'always', + ...(exposePort && { ports: [`${port}:${exposePort}`] }), depends_on: [`${id}-postgresql`, `${id}-clickhouse`], labels: makeLabelForServices('plausibleAnalytics'), deploy: { diff --git a/src/routes/services/[id]/umami/index.json.ts b/src/routes/services/[id]/umami/index.json.ts index d717502c5..ff98ede6d 100644 --- a/src/routes/services/[id]/umami/index.json.ts +++ b/src/routes/services/[id]/umami/index.json.ts @@ -9,11 +9,12 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/umami/start.json.ts b/src/routes/services/[id]/umami/start.json.ts index 6a51e5cde..c2cd78fe4 100644 --- a/src/routes/services/[id]/umami/start.json.ts +++ b/src/routes/services/[id]/umami/start.json.ts @@ -8,6 +8,7 @@ import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; import type { Service, DestinationDocker, Prisma } from '@prisma/client'; import bcrypt from 'bcryptjs'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -24,6 +25,7 @@ export const post: RequestHandler = async (event) => { destinationDockerId, destinationDocker, serviceSecret, + exposePort, umami: { umamiAdminPassword, postgresqlUser, @@ -34,6 +36,7 @@ export const post: RequestHandler = async (event) => { } = service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('umami'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -156,6 +159,7 @@ export const post: RequestHandler = async (event) => { networks: [network], volumes: [], restart: 'always', + ...(exposePort ? { ports: [`${port}:${port}`] } : {}), labels: makeLabelForServices('umami'), deploy: { restart_policy: { diff --git a/src/routes/services/[id]/uptimekuma/index.json.ts b/src/routes/services/[id]/uptimekuma/index.json.ts index 5ec3fa69a..e269e8fe7 100644 --- a/src/routes/services/[id]/uptimekuma/index.json.ts +++ b/src/routes/services/[id]/uptimekuma/index.json.ts @@ -8,11 +8,12 @@ export const post: RequestHandler = async (event) => { if (status === 401) return { status, body }; const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/uptimekuma/start.json.ts b/src/routes/services/[id]/uptimekuma/start.json.ts index 6327db0ec..9032ce469 100644 --- a/src/routes/services/[id]/uptimekuma/start.json.ts +++ b/src/routes/services/[id]/uptimekuma/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -15,9 +16,11 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); - const { type, version, destinationDockerId, destinationDocker, serviceSecret } = service; + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort } = + service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('uptimekuma'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -42,6 +45,7 @@ export const post: RequestHandler = async (event) => { volumes: [config.volume], environment: config.environmentVariables, restart: 'always', + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), labels: makeLabelForServices('uptimekuma'), deploy: { restart_policy: { diff --git a/src/routes/services/[id]/vaultwarden/index.json.ts b/src/routes/services/[id]/vaultwarden/index.json.ts index 5ec3fa69a..e269e8fe7 100644 --- a/src/routes/services/[id]/vaultwarden/index.json.ts +++ b/src/routes/services/[id]/vaultwarden/index.json.ts @@ -8,11 +8,12 @@ export const post: RequestHandler = async (event) => { if (status === 401) return { status, body }; const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/vaultwarden/start.json.ts b/src/routes/services/[id]/vaultwarden/start.json.ts index 511b040a3..41b790266 100644 --- a/src/routes/services/[id]/vaultwarden/start.json.ts +++ b/src/routes/services/[id]/vaultwarden/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { getServiceImage, ErrorHandler } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -15,10 +16,12 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); - const { type, version, destinationDockerId, destinationDocker, serviceSecret } = service; + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort } = + service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('vaultwarden'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -43,6 +46,7 @@ export const post: RequestHandler = async (event) => { networks: [network], volumes: [config.volume], restart: 'always', + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), labels: makeLabelForServices('vaultWarden'), deploy: { restart_policy: { diff --git a/src/routes/services/[id]/vscodeserver/index.json.ts b/src/routes/services/[id]/vscodeserver/index.json.ts index d717502c5..ff98ede6d 100644 --- a/src/routes/services/[id]/vscodeserver/index.json.ts +++ b/src/routes/services/[id]/vscodeserver/index.json.ts @@ -9,11 +9,12 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; - let { name, fqdn } = await event.request.json(); + let { name, fqdn, exposePort } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateService({ id, fqdn, name }); + await db.updateService({ id, fqdn, name, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/vscodeserver/start.json.ts b/src/routes/services/[id]/vscodeserver/start.json.ts index 4ca29c215..1501a43c6 100644 --- a/src/routes/services/[id]/vscodeserver/start.json.ts +++ b/src/routes/services/[id]/vscodeserver/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -22,11 +23,13 @@ export const post: RequestHandler = async (event) => { destinationDocker, serviceSecret, persistentStorage, + exposePort, vscodeserver: { password } } = service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); + const port = getServiceMainPort('vscodeserver'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const image = getServiceImage(type); @@ -75,6 +78,7 @@ export const post: RequestHandler = async (event) => { networks: [network], volumes: [config.volume, ...volumes], restart: 'always', + ...(exposePort ? { ports: [`${port}:${exposePort}`] } : {}), labels: makeLabelForServices('vscodeServer'), deploy: { restart_policy: { diff --git a/src/routes/services/[id]/wordpress/index.json.ts b/src/routes/services/[id]/wordpress/index.json.ts index 413bd1f75..c76cd1a92 100644 --- a/src/routes/services/[id]/wordpress/index.json.ts +++ b/src/routes/services/[id]/wordpress/index.json.ts @@ -11,12 +11,14 @@ export const post: RequestHandler = async (event) => { let { name, fqdn, + exposePort, wordpress: { extraConfig, mysqlDatabase } } = await event.request.json(); if (fqdn) fqdn = fqdn.toLowerCase(); + if (exposePort) exposePort = Number(exposePort); try { - await db.updateWordpress({ id, fqdn, name, extraConfig, mysqlDatabase }); + await db.updateWordpress({ id, fqdn, name, extraConfig, mysqlDatabase, exposePort }); return { status: 201 }; } catch (error) { return ErrorHandler(error); diff --git a/src/routes/services/[id]/wordpress/start.json.ts b/src/routes/services/[id]/wordpress/start.json.ts index 0572be971..43bab2e9d 100644 --- a/src/routes/services/[id]/wordpress/start.json.ts +++ b/src/routes/services/[id]/wordpress/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { ErrorHandler, getServiceImage } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; import type { ComposeFile } from '$lib/types/composeFile'; +import { getServiceMainPort } from '$lib/components/common'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); @@ -22,6 +23,7 @@ export const post: RequestHandler = async (event) => { destinationDockerId, serviceSecret, destinationDocker, + exposePort, wordpress: { mysqlDatabase, mysqlUser, @@ -35,6 +37,7 @@ export const post: RequestHandler = async (event) => { const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); const image = getServiceImage(type); + const port = getServiceMainPort('wordpress'); const { workdir } = await createDirectories({ repository: type, buildId: id }); const config = { @@ -76,6 +79,7 @@ export const post: RequestHandler = async (event) => { volumes: [config.wordpress.volume], networks: [network], restart: 'always', + ...(exposePort ? { ports: [`${port}:${port}`] } : {}), depends_on: [`${id}-mysql`], labels: makeLabelForServices('wordpress'), deploy: {