From 823fe2deb22104624ba85a3b24cc3cb45cb310f7 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 1 Mar 2022 11:10:10 +0100 Subject: [PATCH] refactor --- package.json | 2 +- src/lib/haproxy/configuration.ts | 183 ++- src/lib/haproxy/index.ts | 1061 ++++++----------- src/lib/letsencrypt.ts | 2 +- src/lib/queues/builder.ts | 21 - src/lib/queues/cleanup.ts | 79 +- src/lib/queues/proxy.ts | 98 +- .../applications/[id]/previews/index.svelte | 32 +- src/routes/applications/[id]/stop.json.ts | 13 +- src/routes/destinations/[id]/restart.json.ts | 17 +- src/routes/services/[id]/minio/start.json.ts | 22 +- src/routes/services/[id]/minio/stop.json.ts | 8 +- src/routes/services/[id]/nocodb/start.json.ts | 24 +- src/routes/services/[id]/nocodb/stop.json.ts | 10 +- .../[id]/plausibleanalytics/start.json.ts | 21 - .../[id]/plausibleanalytics/stop.json.ts | 11 +- .../services/[id]/vaultwarden/start.json.ts | 23 +- .../services/[id]/vaultwarden/stop.json.ts | 11 +- .../services/[id]/vscodeserver/start.json.ts | 22 - .../services/[id]/vscodeserver/stop.json.ts | 10 +- .../services/[id]/wordpress/start.json.ts | 21 - .../services/[id]/wordpress/stop.json.ts | 10 +- src/routes/settings/index.json.ts | 58 +- 23 files changed, 603 insertions(+), 1156 deletions(-) diff --git a/package.json b/package.json index ac087f1bc..dd531e946 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coolify", "description": "An open-source & self-hostable Heroku / Netlify alternative.", - "version": "2.0.23", + "version": "2.0.24", "license": "AGPL-3.0", "scripts": { "dev": "docker-compose -f docker-compose-dev.yaml up -d && NODE_ENV=development svelte-kit dev --host 0.0.0.0", diff --git a/src/lib/haproxy/configuration.ts b/src/lib/haproxy/configuration.ts index 76a2623f4..26b76d3fd 100644 --- a/src/lib/haproxy/configuration.ts +++ b/src/lib/haproxy/configuration.ts @@ -5,12 +5,12 @@ import crypto from 'crypto'; import * as db from '$lib/database'; import { checkContainer, checkHAProxy } from '.'; -import { getDomain } from '$lib/common'; +import { asyncExecShell, getDomain, getEngine } from '$lib/common'; +import { letsEncrypt } from '$lib/letsencrypt'; const url = dev ? 'http://localhost:5555' : 'http://coolify-haproxy:5555'; -let template = `#coolhash={{hash}} -program api +let template = `program api command /usr/bin/dataplaneapi -f /usr/local/etc/haproxy/dataplaneapi.hcl --userlist haproxy-dataplaneapi no option start-on-reload @@ -44,6 +44,26 @@ frontend http dev ? 302 : 301 } if { req.hdr(host) -i {{redirectTo}} } {{/applications}} + {{#services}} + {{#isHttps}} + http-request redirect scheme https code ${ + dev ? 302 : 301 + } if { hdr(host) -i {{domain}} } !{ ssl_fc } + {{/isHttps}} + http-request redirect location {{{redirectValue}}} code ${ + dev ? 302 : 301 + } if { req.hdr(host) -i {{redirectTo}} } + {{/services}} + {{#coolify}} + {{#isHttps}} + http-request redirect scheme https code ${ + dev ? 302 : 301 + } if { hdr(host) -i {{domain}} } !{ ssl_fc } + {{/isHttps}} + http-request redirect location {{{redirectValue}}} code ${ + dev ? 302 : 301 + } if { req.hdr(host) -i {{redirectTo}} } + {{/coolify}} use_backend backend-certbot if is_certbot use_backend %[req.hdr(host),lower] @@ -61,17 +81,28 @@ backend backend-certbot {{#applications}} {{#isRunning}} -backend {{domain}} - option forwardfor - server {{id}} {{id}}:{{port}} -{{/isRunning}} -{{/applications}} -{{#services}} backend {{domain}} option forwardfor - server {{id}} {{id}}:{{port}} + server {{id}} {{id}}:{{port}} check +{{/isRunning}} +{{/applications}} + +{{#services}} +{{#isRunning}} + +backend {{domain}} + option forwardfor + server {{id}} {{id}}:{{port}} check +{{/isRunning}} {{/services}} + +{{#coolify}} +backend {{domain}} + option forwardfor + option httpchk GET /undead.json + server {{id}} {{id}}:{{port}} check fall 10 +{{/coolify}} `; export async function haproxyInstance() { const { proxyPassword } = await db.listSettings(); @@ -85,26 +116,29 @@ export async function haproxyInstance() { export async function configureHAProxy() { const haproxy = await haproxyInstance(); await checkHAProxy(haproxy); + const ssls = []; const data = { applications: [], - services: [] + services: [], + coolify: [] }; const applications = await db.prisma.application.findMany({ - include: { destinationDocker: true } + include: { destinationDocker: true, settings: true } }); for (const application of applications) { const { fqdn, id, port, - destinationDocker: { engine } + destinationDocker: { engine, network }, + settings: { previews } } = application; const isRunning = await checkContainer(engine, id); + const domain = getDomain(fqdn); + const isHttps = fqdn.startsWith('https://'); + const isWWW = fqdn.includes('www.'); + const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; if (isRunning) { - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const isWWW = fqdn.includes('www.'); - const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; data.applications.push({ id, port, @@ -114,32 +148,90 @@ export async function configureHAProxy() { redirectValue, redirectTo: isWWW ? domain : 'www.' + domain }); + if (isHttps) ssls.push({ domain, id, isCoolify: false }); + } + if (previews) { + const host = getEngine(engine); + const { stdout } = await asyncExecShell( + `DOCKER_HOST=${host} docker container ls --filter="status=running" --filter="network=${network}" --filter="name=${id}-" --format="{{json .Names}}"` + ); + const containers = stdout + .trim() + .split('\n') + .filter((a) => a) + .map((c) => c.replace(/"/g, '')); + if (containers.length > 0) { + for (const container of containers) { + let previewDomain = `${container.split('-')[1]}.${domain}`; + data.applications.push({ + id: container, + port, + domain: previewDomain, + isRunning, + isHttps, + redirectValue, + redirectTo: isWWW ? previewDomain : 'www.' + previewDomain + }); + if (isHttps) ssls.push({ domain: previewDomain, id, isCoolify: false }); + } + } } } - // const services = await db.prisma.service.findMany({ - // include: { - // destinationDocker: true, - // minio: true, - // plausibleAnalytics: true, - // vscodeserver: true, - // wordpress: true - // } - // }); + const services = await db.prisma.service.findMany({ + include: { + destinationDocker: true, + minio: true, + plausibleAnalytics: true, + vscodeserver: true, + wordpress: true + } + }); - // for (const service of services) { - // const { - // fqdn, - // id, - // type, - // destinationDocker: { engine } - // } = service; - // const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type); - // if (found) { - // const port = found.ports.main; - // const publicPort = service[type]?.publicPort; - // const isRunning = await checkContainer(engine, id); - // } - // } + for (const service of services) { + const { + fqdn, + id, + type, + destinationDocker: { engine } + } = service; + const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type); + if (found) { + const port = found.ports.main; + const publicPort = service[type]?.publicPort; + const isRunning = await checkContainer(engine, id); + const domain = getDomain(fqdn); + const isHttps = fqdn.startsWith('https://'); + const isWWW = fqdn.includes('www.'); + const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; + data.services.push({ + id, + port, + publicPort, + domain, + isRunning, + isHttps, + redirectValue, + redirectTo: isWWW ? domain : 'www.' + domain + }); + if (isHttps) ssls.push({ domain, id, isCoolify: false }); + } + } + const { fqdn } = await db.prisma.setting.findFirst(); + if (fqdn) { + const domain = getDomain(fqdn); + const isHttps = fqdn.startsWith('https://'); + const isWWW = fqdn.includes('www.'); + const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; + data.coolify.push({ + id: dev ? 'host.docker.internal' : 'coolify', + port: 3000, + domain, + isHttps, + redirectValue, + redirectTo: isWWW ? domain : 'www.' + domain + }); + if (!dev && isHttps) ssls.push({ domain, id: 'coolify', isCoolify: true }); + } const output = mustache.render(template, data); const newHash = crypto.createHash('md5').update(output).digest('hex'); const { proxyHash, id } = await db.listSettings(); @@ -156,6 +248,15 @@ export async function configureHAProxy() { } }); } else { - console.log('HAProxy configuration is up to date'); + // console.log('HAProxy configuration is up to date'); + } + if (ssls.length > 0) { + for (const ssl of ssls) { + if (!dev) { + await letsEncrypt(ssl.domain, ssl.id, ssl.isCoolify); + } else { + // console.log('Generate ssl for', ssl.domain); + } + } } } diff --git a/src/lib/haproxy/index.ts b/src/lib/haproxy/index.ts index 734c3a038..f47c8c560 100644 --- a/src/lib/haproxy/index.ts +++ b/src/lib/haproxy/index.ts @@ -1,8 +1,7 @@ import { dev } from '$app/env'; -import { asyncExecShell, getDomain, getEngine } from '$lib/common'; +import { asyncExecShell, getEngine } from '$lib/common'; import got from 'got'; import * as db from '$lib/database'; -import { letsEncrypt } from '$lib/letsencrypt'; const url = dev ? 'http://localhost:5555' : 'http://coolify-haproxy:5555'; @@ -49,112 +48,112 @@ export async function completeTransaction(transactionId) { return await haproxy.put(`v2/services/haproxy/transactions/${transactionId}`); } -export async function removeProxyConfiguration(fqdn) { - const domain = getDomain(fqdn); - const haproxy = await haproxyInstance(); - const backendFound = await haproxy - .get(`v2/services/haproxy/configuration/backends/${domain}`) - .json(); - if (backendFound) { - const transactionId = await getNextTransactionId(); - await haproxy - .delete(`v2/services/haproxy/configuration/backends/${domain}`, { - searchParams: { - transaction_id: transactionId - } - }) - .json(); - await completeTransaction(transactionId); - } - await forceSSLOffApplication(domain); - await removeWwwRedirection(fqdn); -} -export async function forceSSLOffApplication(domain) { - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); +// export async function removeProxyConfiguration(fqdn) { +// const domain = getDomain(fqdn); +// const haproxy = await haproxyInstance(); +// const backendFound = await haproxy +// .get(`v2/services/haproxy/configuration/backends/${domain}`) +// .json(); +// if (backendFound) { +// const transactionId = await getNextTransactionId(); +// await haproxy +// .delete(`v2/services/haproxy/configuration/backends/${domain}`, { +// searchParams: { +// transaction_id: transactionId +// } +// }) +// .json(); +// await completeTransaction(transactionId); +// } +// await forceSSLOffApplication(domain); +// await removeWwwRedirection(fqdn); +// } +// export async function forceSSLOffApplication(domain) { +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); - let transactionId; +// let transactionId; - try { - const rules: any = await haproxy - .get(`v2/services/haproxy/configuration/http_request_rules`, { - searchParams: { - parent_name: 'http', - parent_type: 'frontend' - } - }) - .json(); - if (rules.data.length > 0) { - const rule = rules.data.find((rule) => - rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) - ); - if (rule) { - transactionId = await getNextTransactionId(); - await haproxy - .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { - searchParams: { - transaction_id: transactionId, - parent_name: 'http', - parent_type: 'frontend' - } - }) - .json(); - } - } - } catch (error) { - console.log(error); - } finally { - if (transactionId) await completeTransaction(transactionId); - } -} -export async function forceSSLOnApplication(domain) { - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); - let transactionId; - try { - const rules: any = await haproxy - .get(`v2/services/haproxy/configuration/http_request_rules`, { - searchParams: { - parent_name: 'http', - parent_type: 'frontend' - } - }) - .json(); - let nextRule = 0; - if (rules.data.length > 0) { - const rule = rules.data.find((rule) => - rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) - ); - if (rule) return; - nextRule = rules.data[rules.data.length - 1].index + 1; - } - transactionId = await getNextTransactionId(); +// try { +// const rules: any = await haproxy +// .get(`v2/services/haproxy/configuration/http_request_rules`, { +// searchParams: { +// parent_name: 'http', +// parent_type: 'frontend' +// } +// }) +// .json(); +// if (rules.data.length > 0) { +// const rule = rules.data.find((rule) => +// rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) +// ); +// if (rule) { +// transactionId = await getNextTransactionId(); +// await haproxy +// .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { +// searchParams: { +// transaction_id: transactionId, +// parent_name: 'http', +// parent_type: 'frontend' +// } +// }) +// .json(); +// } +// } +// } catch (error) { +// console.log(error); +// } finally { +// if (transactionId) await completeTransaction(transactionId); +// } +// } +// export async function forceSSLOnApplication(domain) { +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); +// let transactionId; +// try { +// const rules: any = await haproxy +// .get(`v2/services/haproxy/configuration/http_request_rules`, { +// searchParams: { +// parent_name: 'http', +// parent_type: 'frontend' +// } +// }) +// .json(); +// let nextRule = 0; +// if (rules.data.length > 0) { +// const rule = rules.data.find((rule) => +// rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) +// ); +// if (rule) return; +// nextRule = rules.data[rules.data.length - 1].index + 1; +// } +// transactionId = await getNextTransactionId(); - await haproxy - .post(`v2/services/haproxy/configuration/http_request_rules`, { - searchParams: { - transaction_id: transactionId, - parent_name: 'http', - parent_type: 'frontend' - }, - json: { - index: nextRule, - cond: 'if', - cond_test: `{ hdr(host) -i ${domain} } !{ ssl_fc }`, - type: 'redirect', - redir_type: 'scheme', - redir_value: 'https', - redir_code: dev ? 302 : 301 - } - }) - .json(); - } catch (error) { - console.log(error); - throw error; - } finally { - if (transactionId) await completeTransaction(transactionId); - } -} +// await haproxy +// .post(`v2/services/haproxy/configuration/http_request_rules`, { +// searchParams: { +// transaction_id: transactionId, +// parent_name: 'http', +// parent_type: 'frontend' +// }, +// json: { +// index: nextRule, +// cond: 'if', +// cond_test: `{ hdr(host) -i ${domain} } !{ ssl_fc }`, +// type: 'redirect', +// redir_type: 'scheme', +// redir_value: 'https', +// redir_code: dev ? 302 : 301 +// } +// }) +// .json(); +// } catch (error) { +// console.log(error); +// throw error; +// } finally { +// if (transactionId) await completeTransaction(transactionId); +// } +// } export async function deleteProxy({ id }) { const haproxy = await haproxyInstance(); @@ -189,355 +188,55 @@ export async function reloadHaproxy(engine) { const host = getEngine(engine); return await asyncExecShell(`DOCKER_HOST=${host} docker exec coolify-haproxy kill -HUP 1`); } -export async function checkProxyConfigurations() { - const timeout = 10; - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); - try { - const stats: any = await haproxy.get(`v2/services/haproxy/stats/native`).json(); - let transactionId = null; - for (const stat of stats[0].stats) { - if (stat.stats.status !== 'no check' && stat.type === 'server') { - if (!transactionId) await getNextTransactionId(); - const { backend_name: backendName } = stat; - await haproxy - .delete(`v2/services/haproxy/configuration/backends/${backendName}`, { - searchParams: { - transaction_id: transactionId - } - }) - .json(); - } - } - if (transactionId) await completeTransaction(transactionId); - } catch (error) { - console.log(error.response.body); - } -} -// export async function configureHAProxy( -// haproxy, -// transactionId, -// fqdn, -// id, -// port, -// containerRunning, -// engine -// ) { -// const domain = getDomain(fqdn); -// const isHttps = fqdn.startsWith('https://'); -// const isWWW = fqdn.includes('www.'); -// const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; -// const contTest = `{ req.hdr(host) -i ${isWWW ? domain.replace('www.', '') : `www.${domain}`} }`; - -// // console.log({ fqdn, domain, id, port, containerRunning, isHttps, isWWW }); - -// if (!containerRunning) { -// try { -// await haproxy.get(`v2/services/haproxy/configuration/backends/${domain}`).json(); -// console.log('removing', domain); -// transactionId = await getNextTransactionId(); -// await haproxy -// .delete(`v2/services/haproxy/configuration/backends/${domain}`, { -// searchParams: { -// transaction_id: transactionId -// } -// }) -// .json(); -// } catch (error) { -// if (error?.response?.body) { -// const json = JSON.parse(error.response.body); -// if (json.code === 400 && json.message.includes('could not resolve address')) { -// await stopCoolifyProxy(engine); -// await startCoolifyProxy(engine); -// } -// } -// // -// } -// try { -// let rules: any; -// // Force SSL off -// rules = await haproxy -// .get(`v2/services/haproxy/configuration/http_request_rules`, { -// searchParams: { -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// if (rules.data.length > 0) { -// const rule = rules.data.find((rule) => -// rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) -// ); -// if (rule) { -// if (!transactionId) transactionId = await getNextTransactionId(); -// await haproxy -// .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { -// searchParams: { -// transaction_id: transactionId, -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// } -// } - -// // Force WWW off -// rules = await haproxy -// .get(`v2/services/haproxy/configuration/http_request_rules`, { -// searchParams: { -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// if (rules.data.length > 0) { -// const rule = rules.data.find((rule) => rule.redir_value.includes(redirectValue)); -// if (rule) { -// if (!transactionId) transactionId = await getNextTransactionId(); -// await haproxy -// .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { -// searchParams: { -// transaction_id: transactionId, -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// } -// } -// } catch (error) { -// console.log(error); -// // -// } finally { -// try { -// if (transactionId) return transactionId; -// } catch (error) { -// if (error?.response?.body) { -// const json = JSON.parse(error.response.body); -// if (json.code === 400 && json.message.includes('could not resolve address')) { -// await stopCoolifyProxy(engine); -// await startCoolifyProxy(engine); -// } -// } -// } -// } -// return; -// } else { -// let serverConfigured = false; -// let backendAvailable: any = null; -// try { -// backendAvailable = await haproxy -// .get(`v2/services/haproxy/configuration/backends/${domain}`) -// .json(); -// const server: any = await haproxy -// .get(`v2/services/haproxy/configuration/servers/${id}`, { -// searchParams: { -// backend: domain -// } -// }) -// .json(); - -// if (backendAvailable && server) { -// // Very sophisticated way to check if the server is already configured in proxy -// if (backendAvailable.data.forwardfor.enabled === 'enabled') { -// if (backendAvailable.data.name === domain) { -// if (server.data.check === 'disabled') { -// if (server.data.address === id) { -// if (server.data.port === port) { -// serverConfigured = true; -// } -// } -// } -// } -// } -// } -// } catch (error) { -// // -// console.log(error); -// } -// if (serverConfigured) { -// console.log('server configured', domain); -// return; -// } - -// if (backendAvailable) { -// if (!transactionId) transactionId = await getNextTransactionId(); -// await haproxy -// .delete(`v2/services/haproxy/configuration/backends/${domain}`, { -// searchParams: { -// transaction_id: transactionId -// } -// }) -// .json(); -// } -// try { -// console.log('adding ', domain); -// if (!transactionId) transactionId = await getNextTransactionId(); -// await haproxy.post('v2/services/haproxy/configuration/backends', { -// searchParams: { -// transaction_id: transactionId -// }, -// json: { -// 'init-addr': 'last,libc,none', -// forwardfor: { enabled: 'enabled' }, -// name: domain -// } -// }); -// await haproxy.post('v2/services/haproxy/configuration/servers', { -// searchParams: { -// transaction_id: transactionId, -// backend: domain -// }, -// json: { -// address: id, -// check: 'disabled', -// name: id, -// port: port -// } -// }); -// let rules: any; - -// // Force SSL off -// rules = await haproxy -// .get(`v2/services/haproxy/configuration/http_request_rules`, { -// searchParams: { -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// if (rules.data.length > 0) { -// const rule = rules.data.find((rule) => -// rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) -// ); -// if (rule) { -// await haproxy -// .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { -// searchParams: { -// transaction_id: transactionId, -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// } -// } -// // Generate SSL && force SSL on -// if (isHttps) { -// await letsEncrypt(domain, id, false); -// rules = await haproxy -// .get(`v2/services/haproxy/configuration/http_request_rules`, { -// searchParams: { -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// let nextRule = 0; -// if (rules.data.length > 0) { -// const rule = rules.data.find((rule) => -// rule.cond_test.includes(`{ hdr(host) -i ${domain} } !{ ssl_fc }`) -// ); -// if (rule) return; -// nextRule = rules.data[rules.data.length - 1].index + 1; -// } - +// export async function checkProxyConfigurations() { +// const timeout = 10; +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); +// try { +// const stats: any = await haproxy.get(`v2/services/haproxy/stats/native`).json(); +// let transactionId = null; +// for (const stat of stats[0].stats) { +// if (stat.stats.status !== 'no check' && stat.type === 'server') { +// if (!transactionId) await getNextTransactionId(); +// const { backend_name: backendName } = stat; // await haproxy -// .post(`v2/services/haproxy/configuration/http_request_rules`, { +// .delete(`v2/services/haproxy/configuration/backends/${backendName}`, { // searchParams: { -// transaction_id: transactionId, -// parent_name: 'http', -// parent_type: 'frontend' -// }, -// json: { -// index: nextRule, -// cond: 'if', -// cond_test: `{ hdr(host) -i ${domain} } !{ ssl_fc }`, -// type: 'redirect', -// redir_type: 'scheme', -// redir_value: 'https', -// redir_code: dev ? 302 : 301 +// transaction_id: transactionId // } // }) // .json(); // } - -// // WWW redirect on -// rules = await haproxy -// .get(`v2/services/haproxy/configuration/http_request_rules`, { -// searchParams: { -// parent_name: 'http', -// parent_type: 'frontend' -// } -// }) -// .json(); -// let nextRule = 0; -// if (rules.data.length > 0) { -// const rule = rules.data.find((rule) => rule.redir_value.includes(redirectValue)); -// if (rule) return; -// nextRule = rules.data[rules.data.length - 1].index + 1; -// } - -// await haproxy -// .post(`v2/services/haproxy/configuration/http_request_rules`, { -// searchParams: { -// transaction_id: transactionId, -// parent_name: 'http', -// parent_type: 'frontend' -// }, -// json: { -// index: nextRule, -// cond: 'if', -// cond_test: contTest, -// type: 'redirect', -// redir_type: 'location', -// redir_value: redirectValue, -// redir_code: dev ? 302 : 301 -// } -// }) -// .json(); -// } catch (error) { -// console.log(error); -// } finally { -// try { -// if (transactionId) return transactionId; -// } catch (error) { -// if (error?.response?.body) { -// const json = JSON.parse(error.response.body); -// if (json.code === 400 && json.message.includes('could not resolve address')) { -// await stopCoolifyProxy(engine); -// await startCoolifyProxy(engine); -// } -// } -// } // } +// if (transactionId) await completeTransaction(transactionId); +// } catch (error) { +// console.log(error.response.body); // } // } -export async function configureCoolifyProxyOff(fqdn) { - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); +// export async function configureCoolifyProxyOff(fqdn) { +// const domain = getDomain(fqdn); +// const isHttps = fqdn.startsWith('https://'); +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); - try { - await haproxy.get(`v2/services/haproxy/configuration/backends/${domain}`).json(); - const transactionId = await getNextTransactionId(); - await haproxy - .delete(`v2/services/haproxy/configuration/backends/${domain}`, { - searchParams: { - transaction_id: transactionId - } - }) - .json(); - await completeTransaction(transactionId); - if (isHttps) await forceSSLOffApplication(domain); - await removeWwwRedirection(fqdn); - } catch (error) { - throw error?.response?.body || error; - } -} +// try { +// await haproxy.get(`v2/services/haproxy/configuration/backends/${domain}`).json(); +// const transactionId = await getNextTransactionId(); +// await haproxy +// .delete(`v2/services/haproxy/configuration/backends/${domain}`, { +// searchParams: { +// transaction_id: transactionId +// } +// }) +// .json(); +// await completeTransaction(transactionId); +// if (isHttps) await forceSSLOffApplication(domain); +// await removeWwwRedirection(fqdn); +// } catch (error) { +// throw error?.response?.body || error; +// } +// } export async function checkHAProxy(haproxy?: any) { if (!haproxy) haproxy = await haproxyInstance(); try { @@ -549,76 +248,76 @@ export async function checkHAProxy(haproxy?: any) { }; } } -export async function configureCoolifyProxyOn(fqdn) { - const domain = getDomain(fqdn); - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); - let serverConfigured = false; - let backendAvailable: any = null; - try { - backendAvailable = await haproxy - .get(`v2/services/haproxy/configuration/backends/${domain}`) - .json(); - const server: any = await haproxy - .get(`v2/services/haproxy/configuration/servers/coolify`, { - searchParams: { - backend: domain - } - }) - .json(); - if (backendAvailable && server) { - // Very sophisticated way to check if the server is already configured in proxy - if (backendAvailable.data.forwardfor.enabled === 'enabled') { - if (backendAvailable.data.name === domain) { - if (server.data.check === 'enabled') { - if (server.data.address === dev ? 'host.docker.internal' : 'coolify') { - if (server.data.port === 3000) { - serverConfigured = true; - } - } - } - } - } - } - } catch (error) {} - if (serverConfigured) return; - const transactionId = await getNextTransactionId(); - try { - await haproxy.post('v2/services/haproxy/configuration/backends', { - searchParams: { - transaction_id: transactionId - }, - json: { - adv_check: 'httpchk', - httpchk_params: { - method: 'GET', - uri: '/undead.json' - }, - 'init-addr': 'last,libc,none', - forwardfor: { enabled: 'enabled' }, - name: domain - } - }); - await haproxy.post('v2/services/haproxy/configuration/servers', { - searchParams: { - transaction_id: transactionId, - backend: domain - }, - json: { - address: dev ? 'host.docker.internal' : 'coolify', - check: 'enable', - fall: 10, - name: 'coolify', - port: 3000 - } - }); - } catch (error) { - console.log(error); - throw error; - } finally { - await completeTransaction(transactionId); - } -} +// export async function configureCoolifyProxyOn(fqdn) { +// const domain = getDomain(fqdn); +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); +// let serverConfigured = false; +// let backendAvailable: any = null; +// try { +// backendAvailable = await haproxy +// .get(`v2/services/haproxy/configuration/backends/${domain}`) +// .json(); +// const server: any = await haproxy +// .get(`v2/services/haproxy/configuration/servers/coolify`, { +// searchParams: { +// backend: domain +// } +// }) +// .json(); +// if (backendAvailable && server) { +// // Very sophisticated way to check if the server is already configured in proxy +// if (backendAvailable.data.forwardfor.enabled === 'enabled') { +// if (backendAvailable.data.name === domain) { +// if (server.data.check === 'enabled') { +// if (server.data.address === dev ? 'host.docker.internal' : 'coolify') { +// if (server.data.port === 3000) { +// serverConfigured = true; +// } +// } +// } +// } +// } +// } +// } catch (error) {} +// if (serverConfigured) return; +// const transactionId = await getNextTransactionId(); +// try { +// await haproxy.post('v2/services/haproxy/configuration/backends', { +// searchParams: { +// transaction_id: transactionId +// }, +// json: { +// adv_check: 'httpchk', +// httpchk_params: { +// method: 'GET', +// uri: '/undead.json' +// }, +// 'init-addr': 'last,libc,none', +// forwardfor: { enabled: 'enabled' }, +// name: domain +// } +// }); +// await haproxy.post('v2/services/haproxy/configuration/servers', { +// searchParams: { +// transaction_id: transactionId, +// backend: domain +// }, +// json: { +// address: dev ? 'host.docker.internal' : 'coolify', +// check: 'enable', +// fall: 10, +// name: 'coolify', +// port: 3000 +// } +// }); +// } catch (error) { +// console.log(error); +// throw error; +// } finally { +// await completeTransaction(transactionId); +// } +// } export async function stopTcpHttpProxy(destinationDocker, publicPort) { const { engine } = destinationDocker; @@ -748,179 +447,179 @@ export async function configureNetworkCoolifyProxy(engine) { }); } -export async function configureSimpleServiceProxyOn({ id, domain, port }) { - console.log({ service: true, id, domain, port }); - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); - let serverConfigured = false; - let backendAvailable: any = null; +// export async function configureSimpleServiceProxyOn({ id, domain, port }) { +// console.log({ service: true, id, domain, port }); +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); +// let serverConfigured = false; +// let backendAvailable: any = null; - try { - backendAvailable = await haproxy - .get(`v2/services/haproxy/configuration/backends/${domain}`) - .json(); - const server: any = await haproxy - .get(`v2/services/haproxy/configuration/servers/${id}`, { - searchParams: { - backend: domain - } - }) - .json(); - if (backendAvailable && server) { - // Very sophisticated way to check if the server is already configured in proxy - if (backendAvailable.data.forwardfor.enabled === 'enabled') { - if (backendAvailable.data.name === domain) { - if (server.data.check === 'enabled') { - if (server.data.address === id) { - if (server.data.port === port) { - serverConfigured = true; - } - } - } - } - } - } - } catch (error) {} - if (serverConfigured) return; - const transactionId = await getNextTransactionId(); - await haproxy.post('v2/services/haproxy/configuration/backends', { - searchParams: { - transaction_id: transactionId - }, - json: { - 'init-addr': 'last,libc,none', - forwardfor: { enabled: 'enabled' }, - name: domain - } - }); - await haproxy.post('v2/services/haproxy/configuration/servers', { - searchParams: { - transaction_id: transactionId, - backend: domain - }, - json: { - address: id, - check: 'enable', - name: id, - port: port - } - }); - await completeTransaction(transactionId); -} +// try { +// backendAvailable = await haproxy +// .get(`v2/services/haproxy/configuration/backends/${domain}`) +// .json(); +// const server: any = await haproxy +// .get(`v2/services/haproxy/configuration/servers/${id}`, { +// searchParams: { +// backend: domain +// } +// }) +// .json(); +// if (backendAvailable && server) { +// // Very sophisticated way to check if the server is already configured in proxy +// if (backendAvailable.data.forwardfor.enabled === 'enabled') { +// if (backendAvailable.data.name === domain) { +// if (server.data.check === 'enabled') { +// if (server.data.address === id) { +// if (server.data.port === port) { +// serverConfigured = true; +// } +// } +// } +// } +// } +// } +// } catch (error) {} +// if (serverConfigured) return; +// const transactionId = await getNextTransactionId(); +// await haproxy.post('v2/services/haproxy/configuration/backends', { +// searchParams: { +// transaction_id: transactionId +// }, +// json: { +// 'init-addr': 'last,libc,none', +// forwardfor: { enabled: 'enabled' }, +// name: domain +// } +// }); +// await haproxy.post('v2/services/haproxy/configuration/servers', { +// searchParams: { +// transaction_id: transactionId, +// backend: domain +// }, +// json: { +// address: id, +// check: 'enable', +// name: id, +// port: port +// } +// }); +// await completeTransaction(transactionId); +// } -export async function configureSimpleServiceProxyOff(fqdn) { - if (!fqdn) { - return; - } - const domain = getDomain(fqdn); - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); - try { - await haproxy.get(`v2/services/haproxy/configuration/backends/${domain}`).json(); - const transactionId = await getNextTransactionId(); - await haproxy - .delete(`v2/services/haproxy/configuration/backends/${domain}`, { - searchParams: { - transaction_id: transactionId - } - }) - .json(); - await completeTransaction(transactionId); - } catch (error) {} - await forceSSLOffApplication(domain); - await removeWwwRedirection(fqdn); - return; -} +// export async function configureSimpleServiceProxyOff(fqdn) { +// if (!fqdn) { +// return; +// } +// const domain = getDomain(fqdn); +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); +// try { +// await haproxy.get(`v2/services/haproxy/configuration/backends/${domain}`).json(); +// const transactionId = await getNextTransactionId(); +// await haproxy +// .delete(`v2/services/haproxy/configuration/backends/${domain}`, { +// searchParams: { +// transaction_id: transactionId +// } +// }) +// .json(); +// await completeTransaction(transactionId); +// } catch (error) {} +// await forceSSLOffApplication(domain); +// await removeWwwRedirection(fqdn); +// return; +// } -export async function removeWwwRedirection(fqdn) { - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; +// export async function removeWwwRedirection(fqdn) { +// const domain = getDomain(fqdn); +// const isHttps = fqdn.startsWith('https://'); +// const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; - const haproxy = await haproxyInstance(); - await checkHAProxy(); +// const haproxy = await haproxyInstance(); +// await checkHAProxy(); - let transactionId; +// let transactionId; - try { - const rules: any = await haproxy - .get(`v2/services/haproxy/configuration/http_request_rules`, { - searchParams: { - parent_name: 'http', - parent_type: 'frontend' - } - }) - .json(); - if (rules.data.length > 0) { - const rule = rules.data.find((rule) => rule.redir_value.includes(redirectValue)); - if (rule) { - transactionId = await getNextTransactionId(); - await haproxy - .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { - searchParams: { - transaction_id: transactionId, - parent_name: 'http', - parent_type: 'frontend' - } - }) - .json(); - } - } - } catch (error) { - console.log(error); - } finally { - if (transactionId) await completeTransaction(transactionId); - } -} -export async function setWwwRedirection(fqdn) { - const haproxy = await haproxyInstance(); - await checkHAProxy(haproxy); - let transactionId; +// try { +// const rules: any = await haproxy +// .get(`v2/services/haproxy/configuration/http_request_rules`, { +// searchParams: { +// parent_name: 'http', +// parent_type: 'frontend' +// } +// }) +// .json(); +// if (rules.data.length > 0) { +// const rule = rules.data.find((rule) => rule.redir_value.includes(redirectValue)); +// if (rule) { +// transactionId = await getNextTransactionId(); +// await haproxy +// .delete(`v2/services/haproxy/configuration/http_request_rules/${rule.index}`, { +// searchParams: { +// transaction_id: transactionId, +// parent_name: 'http', +// parent_type: 'frontend' +// } +// }) +// .json(); +// } +// } +// } catch (error) { +// console.log(error); +// } finally { +// if (transactionId) await completeTransaction(transactionId); +// } +// } +// export async function setWwwRedirection(fqdn) { +// const haproxy = await haproxyInstance(); +// await checkHAProxy(haproxy); +// let transactionId; - try { - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const isWWW = fqdn.includes('www.'); - const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; - const contTest = `{ req.hdr(host) -i ${isWWW ? domain.replace('www.', '') : `www.${domain}`} }`; - const rules: any = await haproxy - .get(`v2/services/haproxy/configuration/http_request_rules`, { - searchParams: { - parent_name: 'http', - parent_type: 'frontend' - } - }) - .json(); - let nextRule = 0; - if (rules.data.length > 0) { - const rule = rules.data.find((rule) => rule.redir_value.includes(redirectValue)); - if (rule) return; - nextRule = rules.data[rules.data.length - 1].index + 1; - } +// try { +// const domain = getDomain(fqdn); +// const isHttps = fqdn.startsWith('https://'); +// const isWWW = fqdn.includes('www.'); +// const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`; +// const contTest = `{ req.hdr(host) -i ${isWWW ? domain.replace('www.', '') : `www.${domain}`} }`; +// const rules: any = await haproxy +// .get(`v2/services/haproxy/configuration/http_request_rules`, { +// searchParams: { +// parent_name: 'http', +// parent_type: 'frontend' +// } +// }) +// .json(); +// let nextRule = 0; +// if (rules.data.length > 0) { +// const rule = rules.data.find((rule) => rule.redir_value.includes(redirectValue)); +// if (rule) return; +// nextRule = rules.data[rules.data.length - 1].index + 1; +// } - transactionId = await getNextTransactionId(); - await haproxy - .post(`v2/services/haproxy/configuration/http_request_rules`, { - searchParams: { - transaction_id: transactionId, - parent_name: 'http', - parent_type: 'frontend' - }, - json: { - index: nextRule, - cond: 'if', - cond_test: contTest, - type: 'redirect', - redir_type: 'location', - redir_value: redirectValue, - redir_code: dev ? 302 : 301 - } - }) - .json(); - } catch (error) { - console.log(error); - throw error; - } finally { - if (transactionId) await completeTransaction(transactionId); - } -} +// transactionId = await getNextTransactionId(); +// await haproxy +// .post(`v2/services/haproxy/configuration/http_request_rules`, { +// searchParams: { +// transaction_id: transactionId, +// parent_name: 'http', +// parent_type: 'frontend' +// }, +// json: { +// index: nextRule, +// cond: 'if', +// cond_test: contTest, +// type: 'redirect', +// redir_type: 'location', +// redir_value: redirectValue, +// redir_code: dev ? 302 : 301 +// } +// }) +// .json(); +// } catch (error) { +// console.log(error); +// throw error; +// } finally { +// if (transactionId) await completeTransaction(transactionId); +// } +// } diff --git a/src/lib/letsencrypt.ts b/src/lib/letsencrypt.ts index c062287ea..b3846eba7 100644 --- a/src/lib/letsencrypt.ts +++ b/src/lib/letsencrypt.ts @@ -13,7 +13,7 @@ export async function letsEncrypt(domain, id = null, isCoolify = false) { const nakedDomain = domain.replace('www.', ''); const wwwDomain = `www.${nakedDomain}`; const randomCuid = cuid(); - const randomPort = await getPort({ port: portNumbers(minPort, maxPort) }); + const randomPort = 9000; let host; let dualCerts = false; diff --git a/src/lib/queues/builder.ts b/src/lib/queues/builder.ts index 0de934bef..54976b050 100644 --- a/src/lib/queues/builder.ts +++ b/src/lib/queues/builder.ts @@ -256,26 +256,5 @@ export default async function (job) { throw new Error(error); } saveBuildLog({ line: 'Proxy will be configured shortly.', buildId, applicationId }); - // try { - // if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) { - // saveBuildLog({ line: 'Proxy configuration started!', buildId, applicationId }); - // await checkProxyConfigurations(); - // await configureProxyForApplication(domain, imageId, port); - // if (isHttps) await letsEncrypt({ domain, id: applicationId }); - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); - // saveBuildLog({ line: 'Proxy configuration successful!', buildId, applicationId }); - // } else { - // saveBuildLog({ - // line: 'Coolify Proxy is not configured for this destination. Nothing else to do.', - // buildId, - // applicationId - // }); - // } - // } catch (error) { - // saveBuildLog({ line: error.stdout || error, buildId, applicationId }); - // sentry.captureException(error); - // throw new Error(error); - // } } } diff --git a/src/lib/queues/cleanup.ts b/src/lib/queues/cleanup.ts index 981173a31..53c1896a7 100644 --- a/src/lib/queues/cleanup.ts +++ b/src/lib/queues/cleanup.ts @@ -8,48 +8,53 @@ export default async function () { for (const destinationDocker of destinationDockers) { const host = getEngine(destinationDocker.engine); // Tagging images with labels - try { - const images = [ - `coollabsio/${defaultProxyImageTcp}`, - `coollabsio/${defaultProxyImageHttp}`, - 'certbot/certbot:latest', - 'node:16.14.0-alpine', - 'alpine:latest', - 'nginx:stable-alpine', - 'node:lts', - 'php:apache', - 'rust:latest' - ]; - for (const image of images) { - try { - await asyncExecShell(`DOCKER_HOST=${host} docker image inspect ${image}`); - } catch (error) { - await asyncExecShell( - `DOCKER_HOST=${host} docker pull ${image} && echo "FROM ${image}" | docker build --label coolify.image="true" -t "${image}" -` - ); - } - } - } catch (error) {} + // try { + // const images = [ + // `coollabsio/${defaultProxyImageTcp}`, + // `coollabsio/${defaultProxyImageHttp}`, + // 'certbot/certbot:latest', + // 'node:16.14.0-alpine', + // 'alpine:latest', + // 'nginx:stable-alpine', + // 'node:lts', + // 'php:apache', + // 'rust:latest' + // ]; + // for (const image of images) { + // try { + // await asyncExecShell(`DOCKER_HOST=${host} docker image inspect ${image}`); + // } catch (error) { + // await asyncExecShell( + // `DOCKER_HOST=${host} docker pull ${image} && echo "FROM ${image}" | docker build --label coolify.image="true" -t "${image}" -` + // ); + // } + // } + // } catch (error) {} try { await asyncExecShell(`DOCKER_HOST=${host} docker container prune -f`); } catch (error) { console.log(error); } - if (!dev) { - // Cleanup images that are not managed by coolify - try { - await asyncExecShell( - `DOCKER_HOST=${host} docker image prune --filter 'label!=coolify.image=true' -a -f` - ); - } catch (error) { - console.log(error); - } - // Cleanup old images >3 days - try { - await asyncExecShell(`DOCKER_HOST=${host} docker image prune --filter "until=72h" -a -f`); - } catch (error) { - console.log(error); - } + try { + await asyncExecShell(`DOCKER_HOST=${host} docker image prune -f`); + } catch (error) { + console.log(error); } + // if (!dev) { + // // Cleanup images that are not managed by coolify + // try { + // await asyncExecShell( + // `DOCKER_HOST=${host} docker image prune --filter 'label!=coolify.image=true' -a -f` + // ); + // } catch (error) { + // console.log(error); + // } + // // Cleanup old images >3 days + // try { + // await asyncExecShell(`DOCKER_HOST=${host} docker image prune --filter "until=72h" -a -f`); + // } catch (error) { + // console.log(error); + // } + // } } } diff --git a/src/lib/queues/proxy.ts b/src/lib/queues/proxy.ts index 65949abf0..3d5f05181 100644 --- a/src/lib/queues/proxy.ts +++ b/src/lib/queues/proxy.ts @@ -1,104 +1,10 @@ +import { ErrorHandler } from '$lib/database'; import { configureHAProxy } from '$lib/haproxy/configuration'; export default async function () { try { return await configureHAProxy(); } catch (error) { - console.log(error.response.body || error); + ErrorHandler(error.response.body || error); } - // const haproxy = await haproxyInstance(); - // await checkHAProxy(haproxy); - // const transactionId = await getNextTransactionId(); - // let executeTransaction = { - // applications: false, - // services: false - // } - // try { - // await checkProxyConfigurations(); - // } catch (error) { - // console.log(error); - // } - // try { - // const applications = await db.prisma.application.findMany({ - // include: { destinationDocker: true } - // }); - - // for (const application of applications) { - // const { - // fqdn, - // id, - // port, - // destinationDocker: { engine } - // } = application; - // const containerRunning = await checkContainer(engine, id); - // executeTransaction.applications = await configureHAProxy( - // haproxy, - // transactionId, - // fqdn, - // id, - // port, - // containerRunning, - // engine - // ); - // } - - // const services = await db.prisma.service.findMany({ - // include: { - // destinationDocker: true, - // minio: true, - // plausibleAnalytics: true, - // vscodeserver: true, - // wordpress: true - // } - // }); - - // for (const service of services) { - // const { - // fqdn, - // id, - // type, - // destinationDocker: { engine } - // } = service; - // const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type); - // if (found) { - // console.log(found); - // const port = found.ports.main; - // const publicPort = service[type]?.publicPort; - // const containerRunning = await checkContainer(engine, id); - // executeTransaction.services = await configureHAProxy( - // haproxy, - // transactionId, - // fqdn, - // id, - // port, - // containerRunning, - // engine - // ); - // if (publicPort) { - // const containerFound = await checkContainer( - // service.destinationDocker.engine, - // `haproxy-for-${publicPort}` - // ); - // if (!containerFound) { - // await startHttpProxy(service.destinationDocker, id, publicPort, 9000); - // } - // } - // } - // } - // if (executeTransaction.applications || executeTransaction.services) { - // await haproxy.put(`v2/services/haproxy/transactions/${transactionId}`); - // } - // // Check Coolify FQDN and configure proxy if needed - // // const { fqdn } = await db.listSettings(); - // // if (fqdn) { - // // const domain = getDomain(fqdn); - // // await startCoolifyProxy('/var/run/docker.sock'); - // // await configureCoolifyProxyOn(fqdn); - // // await setWwwRedirection(fqdn); - // // const isHttps = fqdn.startsWith('https://'); - // // if (isHttps) await forceSSLOnApplication(domain); - // // } - // } catch (error) { - // throw error; - // } } diff --git a/src/routes/applications/[id]/previews/index.svelte b/src/routes/applications/[id]/previews/index.svelte index 59b1e4aa2..9ac2dd940 100644 --- a/src/routes/applications/[id]/previews/index.svelte +++ b/src/routes/applications/[id]/previews/index.svelte @@ -44,33 +44,19 @@
- - - - - - -
NameValueNeed during buildtime? + + + + + + + - + {#each applicationSecrets as secret} {#key secret.id} - + s.name === secret.name)} isPRMRSecret diff --git a/src/routes/applications/[id]/stop.json.ts b/src/routes/applications/[id]/stop.json.ts index 58064c07a..999d8c106 100644 --- a/src/routes/applications/[id]/stop.json.ts +++ b/src/routes/applications/[id]/stop.json.ts @@ -1,8 +1,7 @@ -import { getDomain, getUserDetails } from '$lib/common'; +import { asyncExecShell, getEngine, getUserDetails, removeDestinationDocker } from '$lib/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { removeProxyConfiguration } from '$lib/haproxy'; +import { checkContainer } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -17,10 +16,12 @@ export const post: RequestHandler = async (event) => { teamId }); if (destinationDockerId) { - const docker = dockerInstance({ destinationDocker }); - await docker.engine.getContainer(id).stop(); + const { engine } = destinationDocker; + const found = await checkContainer(engine, id); + if (found) { + await removeDestinationDocker({ id, engine }); + } } - // await removeProxyConfiguration(fqdn); return { status: 200 }; diff --git a/src/routes/destinations/[id]/restart.json.ts b/src/routes/destinations/[id]/restart.json.ts index 65a3e0cd4..9d2da459a 100644 --- a/src/routes/destinations/[id]/restart.json.ts +++ b/src/routes/destinations/[id]/restart.json.ts @@ -1,30 +1,19 @@ -import { getDomain, getUserDetails } from '$lib/common'; +import { getUserDetails } from '$lib/common'; import { ErrorHandler } from '$lib/database'; import * as db from '$lib/database'; -import { - configureCoolifyProxyOn, - forceSSLOnApplication, - setWwwRedirection, - startCoolifyProxy, - stopCoolifyProxy -} from '$lib/haproxy'; +import { startCoolifyProxy, stopCoolifyProxy } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { const { teamId, status, body } = await getUserDetails(event); if (status === 401) return { status, body }; - const { engine, fqdn } = await event.request.json(); + const { engine } = await event.request.json(); try { - const domain = getDomain(fqdn); await stopCoolifyProxy(engine); await startCoolifyProxy(engine); await db.setDestinationSettings({ engine, isCoolifyProxyUsed: true }); - await configureCoolifyProxyOn(fqdn); - await setWwwRedirection(fqdn); - const isHttps = fqdn.startsWith('https://'); - if (isHttps) await forceSSLOnApplication(domain); return { status: 200 }; diff --git a/src/routes/services/[id]/minio/start.json.ts b/src/routes/services/[id]/minio/start.json.ts index 1d1a0655e..5512bded8 100644 --- a/src/routes/services/[id]/minio/start.json.ts +++ b/src/routes/services/[id]/minio/start.json.ts @@ -3,15 +3,7 @@ import * as db from '$lib/database'; import { promises as fs } from 'fs'; import yaml from 'js-yaml'; import type { RequestHandler } from '@sveltejs/kit'; -import { letsEncrypt } from '$lib/letsencrypt'; -import { - checkHAProxy, - checkProxyConfigurations, - configureSimpleServiceProxyOn, - reloadHaproxy, - setWwwRedirection, - startHttpProxy -} from '$lib/haproxy'; +import { startHttpProxy } from '$lib/haproxy'; import getPort, { portNumbers } from 'get-port'; import { getDomain } from '$lib/components/common'; import { ErrorHandler } from '$lib/database'; @@ -24,7 +16,6 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; try { - // await checkHAProxy(); const service = await db.getService({ id, teamId }); const { type, @@ -38,9 +29,6 @@ export const post: RequestHandler = async (event) => { const data = await db.prisma.setting.findFirst(); const { minPort, maxPort } = data; - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); @@ -96,16 +84,8 @@ export const post: RequestHandler = async (event) => { } try { await asyncExecShell(`DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up -d`); - // await checkProxyConfigurations(); - // await configureSimpleServiceProxyOn({ id, domain, port: consolePort }); await db.updateMinioService({ id, publicPort }); await startHttpProxy(destinationDocker, id, publicPort, apiPort); - - // if (isHttps) { - // await letsEncrypt({ domain, id }); - // } - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); return { status: 200 }; diff --git a/src/routes/services/[id]/minio/stop.json.ts b/src/routes/services/[id]/minio/stop.json.ts index 0285e776c..3e2340237 100644 --- a/src/routes/services/[id]/minio/stop.json.ts +++ b/src/routes/services/[id]/minio/stop.json.ts @@ -1,9 +1,7 @@ -import { getEngine, getUserDetails, removeDestinationDocker } from '$lib/common'; -import { getDomain } from '$lib/components/common'; +import { getUserDetails, removeDestinationDocker } from '$lib/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { checkContainer, configureSimpleServiceProxyOff, stopTcpHttpProxy } from '$lib/haproxy'; +import { checkContainer, stopTcpHttpProxy } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -21,7 +19,6 @@ export const post: RequestHandler = async (event) => { minio: { publicPort } } = service; await db.updateMinioService({ id, publicPort: null }); - const domain = getDomain(fqdn); if (destinationDockerId) { const engine = destinationDocker.engine; @@ -35,7 +32,6 @@ export const post: RequestHandler = async (event) => { } try { await stopTcpHttpProxy(destinationDocker, publicPort); - // await configureSimpleServiceProxyOff(fqdn); } catch (error) { console.log(error); } diff --git a/src/routes/services/[id]/nocodb/start.json.ts b/src/routes/services/[id]/nocodb/start.json.ts index 82ccd2a1c..ef9ac485c 100644 --- a/src/routes/services/[id]/nocodb/start.json.ts +++ b/src/routes/services/[id]/nocodb/start.json.ts @@ -3,15 +3,6 @@ import * as db from '$lib/database'; import { promises as fs } from 'fs'; import yaml from 'js-yaml'; import type { RequestHandler } from '@sveltejs/kit'; -import { letsEncrypt } from '$lib/letsencrypt'; -import { - checkHAProxy, - checkProxyConfigurations, - configureSimpleServiceProxyOn, - reloadHaproxy, - setWwwRedirection -} from '$lib/haproxy'; -import { getDomain } from '$lib/components/common'; import { ErrorHandler } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; @@ -22,13 +13,8 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; try { - await checkHAProxy(); const service = await db.getService({ id, teamId }); - const { type, version, fqdn, destinationDockerId, destinationDocker } = service; - - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - + const { type, version, destinationDockerId, destinationDocker } = service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); @@ -56,14 +42,6 @@ export const post: RequestHandler = async (event) => { try { await asyncExecShell(`DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up -d`); - // await checkProxyConfigurations(); - // await configureSimpleServiceProxyOn({ id, domain, port: 8080 }); - - // if (isHttps) { - // await letsEncrypt({ domain, id }); - // } - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); return { status: 200 }; diff --git a/src/routes/services/[id]/nocodb/stop.json.ts b/src/routes/services/[id]/nocodb/stop.json.ts index f15ba1012..c604e1cc3 100644 --- a/src/routes/services/[id]/nocodb/stop.json.ts +++ b/src/routes/services/[id]/nocodb/stop.json.ts @@ -1,9 +1,7 @@ import { getUserDetails, removeDestinationDocker } from '$lib/common'; -import { getDomain } from '$lib/components/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { checkContainer, configureSimpleServiceProxyOff } from '$lib/haproxy'; +import { checkContainer } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -15,7 +13,6 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); const { destinationDockerId, destinationDocker, fqdn } = service; - const domain = getDomain(fqdn); if (destinationDockerId) { const engine = destinationDocker.engine; @@ -27,11 +24,6 @@ export const post: RequestHandler = async (event) => { } catch (error) { console.error(error); } - try { - await configureSimpleServiceProxyOff(fqdn); - } catch (error) { - console.log(error); - } } return { diff --git a/src/routes/services/[id]/plausibleanalytics/start.json.ts b/src/routes/services/[id]/plausibleanalytics/start.json.ts index fe0171267..70de54499 100644 --- a/src/routes/services/[id]/plausibleanalytics/start.json.ts +++ b/src/routes/services/[id]/plausibleanalytics/start.json.ts @@ -3,15 +3,6 @@ import * as db from '$lib/database'; import { promises as fs } from 'fs'; import yaml from 'js-yaml'; import type { RequestHandler } from '@sveltejs/kit'; -import { letsEncrypt } from '$lib/letsencrypt'; -import { - checkHAProxy, - checkProxyConfigurations, - configureSimpleServiceProxyOn, - reloadHaproxy, - setWwwRedirection -} from '$lib/haproxy'; -import { getDomain } from '$lib/components/common'; import { ErrorHandler } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; @@ -22,7 +13,6 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; try { - await checkHAProxy(); const service = await db.getService({ id, teamId }); const { type, @@ -42,9 +32,6 @@ export const post: RequestHandler = async (event) => { } } = service; - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const config = { plausibleAnalytics: { image: `plausible/analytics:${version}`, @@ -83,7 +70,6 @@ export const post: RequestHandler = async (event) => { }; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); - const engine = destinationDocker.engine; const { workdir } = await createDirectories({ repository: type, buildId: id }); @@ -187,14 +173,7 @@ COPY ./init-db.sh /docker-entrypoint-initdb.d/init-db.sh`; await asyncExecShell( `DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up --build -d` ); - // await checkProxyConfigurations(); - // await configureSimpleServiceProxyOn({ id, domain, port: 8000 }); - // if (isHttps) { - // await letsEncrypt({ domain, id }); - // } - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); return { status: 200 }; diff --git a/src/routes/services/[id]/plausibleanalytics/stop.json.ts b/src/routes/services/[id]/plausibleanalytics/stop.json.ts index d9b42d7b3..6ff3cac3b 100644 --- a/src/routes/services/[id]/plausibleanalytics/stop.json.ts +++ b/src/routes/services/[id]/plausibleanalytics/stop.json.ts @@ -1,9 +1,7 @@ import { getUserDetails, removeDestinationDocker } from '$lib/common'; -import { getDomain } from '$lib/components/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { checkContainer, configureSimpleServiceProxyOff } from '$lib/haproxy'; +import { checkContainer } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -15,7 +13,6 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); const { destinationDockerId, destinationDocker, fqdn } = service; - const domain = getDomain(fqdn); if (destinationDockerId) { const engine = destinationDocker.engine; @@ -36,12 +33,6 @@ export const post: RequestHandler = async (event) => { } catch (error) { console.error(error); } - - try { - await configureSimpleServiceProxyOff(fqdn); - } catch (error) { - console.log(error); - } } return { diff --git a/src/routes/services/[id]/vaultwarden/start.json.ts b/src/routes/services/[id]/vaultwarden/start.json.ts index 5dcacbea3..f42481200 100644 --- a/src/routes/services/[id]/vaultwarden/start.json.ts +++ b/src/routes/services/[id]/vaultwarden/start.json.ts @@ -3,15 +3,6 @@ import * as db from '$lib/database'; import { promises as fs } from 'fs'; import yaml from 'js-yaml'; import type { RequestHandler } from '@sveltejs/kit'; -import { letsEncrypt } from '$lib/letsencrypt'; -import { - checkHAProxy, - checkProxyConfigurations, - configureSimpleServiceProxyOn, - reloadHaproxy, - setWwwRedirection -} from '$lib/haproxy'; -import { getDomain } from '$lib/components/common'; import { getServiceImage, ErrorHandler } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; @@ -22,12 +13,8 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; try { - await checkHAProxy(); const service = await db.getService({ id, teamId }); - const { type, version, fqdn, destinationDockerId, destinationDocker } = service; - - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); + const { type, version, destinationDockerId, destinationDocker } = service; const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); @@ -74,14 +61,6 @@ export const post: RequestHandler = async (event) => { } try { await asyncExecShell(`DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up -d`); - // await checkProxyConfigurations(); - // await configureSimpleServiceProxyOn({ id, domain, port: 80 }); - - // if (isHttps) { - // await letsEncrypt({ domain, id }); - // } - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); return { status: 200 }; diff --git a/src/routes/services/[id]/vaultwarden/stop.json.ts b/src/routes/services/[id]/vaultwarden/stop.json.ts index f15ba1012..3c3bfbc62 100644 --- a/src/routes/services/[id]/vaultwarden/stop.json.ts +++ b/src/routes/services/[id]/vaultwarden/stop.json.ts @@ -1,9 +1,7 @@ import { getUserDetails, removeDestinationDocker } from '$lib/common'; -import { getDomain } from '$lib/components/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { checkContainer, configureSimpleServiceProxyOff } from '$lib/haproxy'; +import { checkContainer } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -15,7 +13,6 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); const { destinationDockerId, destinationDocker, fqdn } = service; - const domain = getDomain(fqdn); if (destinationDockerId) { const engine = destinationDocker.engine; @@ -27,13 +24,7 @@ export const post: RequestHandler = async (event) => { } catch (error) { console.error(error); } - try { - await configureSimpleServiceProxyOff(fqdn); - } catch (error) { - console.log(error); - } } - return { status: 200 }; diff --git a/src/routes/services/[id]/vscodeserver/start.json.ts b/src/routes/services/[id]/vscodeserver/start.json.ts index ee5f2670b..29bf3326a 100644 --- a/src/routes/services/[id]/vscodeserver/start.json.ts +++ b/src/routes/services/[id]/vscodeserver/start.json.ts @@ -3,15 +3,6 @@ import * as db from '$lib/database'; import { promises as fs } from 'fs'; import yaml from 'js-yaml'; import type { RequestHandler } from '@sveltejs/kit'; -import { letsEncrypt } from '$lib/letsencrypt'; -import { - checkHAProxy, - checkProxyConfigurations, - configureSimpleServiceProxyOn, - reloadHaproxy, - setWwwRedirection -} from '$lib/haproxy'; -import { getDomain } from '$lib/components/common'; import { ErrorHandler } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; @@ -22,20 +13,15 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; try { - await checkHAProxy(); const service = await db.getService({ id, teamId }); const { type, version, - fqdn, destinationDockerId, destinationDocker, vscodeserver: { password } } = service; - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); @@ -84,14 +70,6 @@ export const post: RequestHandler = async (event) => { try { await asyncExecShell(`DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up -d`); - // await checkProxyConfigurations(); - // await configureSimpleServiceProxyOn({ id, domain, port: 8080 }); - - // if (isHttps) { - // await letsEncrypt({ domain, id }); - // } - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); return { status: 200 }; diff --git a/src/routes/services/[id]/vscodeserver/stop.json.ts b/src/routes/services/[id]/vscodeserver/stop.json.ts index cf748b709..3c3bfbc62 100644 --- a/src/routes/services/[id]/vscodeserver/stop.json.ts +++ b/src/routes/services/[id]/vscodeserver/stop.json.ts @@ -1,9 +1,7 @@ import { getUserDetails, removeDestinationDocker } from '$lib/common'; -import { getDomain } from '$lib/components/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { checkContainer, configureSimpleServiceProxyOff } from '$lib/haproxy'; +import { checkContainer } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -15,7 +13,6 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); const { destinationDockerId, destinationDocker, fqdn } = service; - const domain = getDomain(fqdn); if (destinationDockerId) { const engine = destinationDocker.engine; @@ -27,11 +24,6 @@ export const post: RequestHandler = async (event) => { } catch (error) { console.error(error); } - try { - await configureSimpleServiceProxyOff(fqdn); - } catch (error) { - console.log(error); - } } return { status: 200 diff --git a/src/routes/services/[id]/wordpress/start.json.ts b/src/routes/services/[id]/wordpress/start.json.ts index 76e113bce..54080478e 100644 --- a/src/routes/services/[id]/wordpress/start.json.ts +++ b/src/routes/services/[id]/wordpress/start.json.ts @@ -3,15 +3,6 @@ import * as db from '$lib/database'; import { promises as fs } from 'fs'; import yaml from 'js-yaml'; import type { RequestHandler } from '@sveltejs/kit'; -import { letsEncrypt } from '$lib/letsencrypt'; -import { - checkHAProxy, - checkProxyConfigurations, - configureSimpleServiceProxyOn, - reloadHaproxy, - setWwwRedirection -} from '$lib/haproxy'; -import { getDomain } from '$lib/components/common'; import { ErrorHandler } from '$lib/database'; import { makeLabelForServices } from '$lib/buildPacks/common'; @@ -22,7 +13,6 @@ export const post: RequestHandler = async (event) => { const { id } = event.params; try { - await checkHAProxy(); const service = await db.getService({ id, teamId }); const { type, @@ -40,9 +30,6 @@ export const post: RequestHandler = async (event) => { } } = service; - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - const network = destinationDockerId && destinationDocker.network; const host = getEngine(destinationDocker.engine); @@ -121,14 +108,6 @@ export const post: RequestHandler = async (event) => { try { await asyncExecShell(`DOCKER_HOST=${host} docker compose -f ${composeFileDestination} up -d`); - // await checkProxyConfigurations(); - // await configureSimpleServiceProxyOn({ id, domain, port: 80 }); - - // if (isHttps) { - // await letsEncrypt({ domain, id }); - // } - // await setWwwRedirection(fqdn); - // await reloadHaproxy(destinationDocker.engine); return { status: 200 }; diff --git a/src/routes/services/[id]/wordpress/stop.json.ts b/src/routes/services/[id]/wordpress/stop.json.ts index 800a62de3..2fc32b5a1 100644 --- a/src/routes/services/[id]/wordpress/stop.json.ts +++ b/src/routes/services/[id]/wordpress/stop.json.ts @@ -1,9 +1,7 @@ import { getUserDetails, removeDestinationDocker } from '$lib/common'; -import { getDomain } from '$lib/components/common'; import * as db from '$lib/database'; import { ErrorHandler } from '$lib/database'; -import { dockerInstance } from '$lib/docker'; -import { checkContainer, configureSimpleServiceProxyOff } from '$lib/haproxy'; +import { checkContainer } from '$lib/haproxy'; import type { RequestHandler } from '@sveltejs/kit'; export const post: RequestHandler = async (event) => { @@ -15,7 +13,6 @@ export const post: RequestHandler = async (event) => { try { const service = await db.getService({ id, teamId }); const { destinationDockerId, destinationDocker, fqdn } = service; - const domain = getDomain(fqdn); if (destinationDockerId) { const engine = destinationDocker.engine; try { @@ -30,11 +27,6 @@ export const post: RequestHandler = async (event) => { } catch (error) { console.error(error); } - try { - await configureSimpleServiceProxyOff(fqdn); - } catch (error) { - console.log(error); - } } return { diff --git a/src/routes/settings/index.json.ts b/src/routes/settings/index.json.ts index bb823ed58..163877fb0 100644 --- a/src/routes/settings/index.json.ts +++ b/src/routes/settings/index.json.ts @@ -1,18 +1,6 @@ -import { dev } from '$app/env'; -import { getDomain, getUserDetails } from '$lib/common'; +import { getUserDetails } from '$lib/common'; import * as db from '$lib/database'; import { listSettings, ErrorHandler } from '$lib/database'; -import { - checkProxyConfigurations, - configureCoolifyProxyOff, - configureCoolifyProxyOn, - forceSSLOnApplication, - reloadHaproxy, - removeWwwRedirection, - setWwwRedirection, - startCoolifyProxy -} from '$lib/haproxy'; -import { letsEncrypt } from '$lib/letsencrypt'; import type { RequestHandler } from '@sveltejs/kit'; import { promises as dns } from 'dns'; @@ -52,10 +40,7 @@ export const del: RequestHandler = async (event) => { // Do not care. } try { - const domain = getDomain(fqdn); await db.prisma.setting.update({ where: { fqdn }, data: { fqdn: null } }); - await configureCoolifyProxyOff(fqdn); - await removeWwwRedirection(domain); return { status: 200, body: { @@ -80,50 +65,19 @@ export const post: RequestHandler = async (event) => { const { fqdn, isRegistrationEnabled, dualCerts, minPort, maxPort } = await event.request.json(); try { - await checkProxyConfigurations(); - const { - id, - fqdn: oldFqdn, - isRegistrationEnabled: oldIsRegistrationEnabled, - dualCerts: oldDualCerts - } = await db.listSettings(); - if (oldIsRegistrationEnabled !== isRegistrationEnabled) { + const { id } = await db.listSettings(); + if (isRegistrationEnabled) { await db.prisma.setting.update({ where: { id }, data: { isRegistrationEnabled } }); } - if (oldDualCerts !== dualCerts) { - await db.prisma.setting.update({ where: { id }, data: { dualCerts } }); - } - if (oldFqdn && oldFqdn !== fqdn) { - if (oldFqdn) { - const oldDomain = getDomain(oldFqdn); - await configureCoolifyProxyOff(oldFqdn); - await removeWwwRedirection(oldDomain); - } - } if (fqdn) { - await startCoolifyProxy('/var/run/docker.sock'); - const domain = getDomain(fqdn); - const isHttps = fqdn.startsWith('https://'); - if (domain) { - await configureCoolifyProxyOn(fqdn); - await setWwwRedirection(fqdn); - if (isHttps) { - await letsEncrypt({ domain, isCoolify: true }); - await forceSSLOnApplication(domain); - await reloadHaproxy('/var/run/docker.sock'); - } - } - await db.prisma.setting.update({ where: { id }, data: { fqdn } }); - await db.prisma.destinationDocker.updateMany({ - where: { engine: '/var/run/docker.sock' }, - data: { isCoolifyProxyUsed: true } - }); + } + if (dualCerts) { + await db.prisma.setting.update({ where: { id }, data: { dualCerts } }); } if (minPort && maxPort) { await db.prisma.setting.update({ where: { id }, data: { minPort, maxPort } }); } - return { status: 201 };
NameValueNeed during buildtime?Action