From 4e2026aa2d3b76d12227d9b02a8bc4cbffca42fd Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Sat, 26 Feb 2022 22:01:24 +0100 Subject: [PATCH] fix: Remove wrong/stuck proxy configurations --- src/lib/database/applications.ts | 3 +- src/lib/haproxy/index.ts | 53 +++++++++++++++++++ src/lib/queues/builder.ts | 8 ++- src/routes/services/[id]/minio/start.json.ts | 2 + src/routes/services/[id]/nocodb/start.json.ts | 2 + .../[id]/plausibleanalytics/start.json.ts | 2 + .../services/[id]/vaultwarden/start.json.ts | 2 + .../services/[id]/vscodeserver/start.json.ts | 2 + .../services/[id]/wordpress/start.json.ts | 2 + src/routes/settings/index.json.ts | 2 + 10 files changed, 76 insertions(+), 2 deletions(-) diff --git a/src/lib/database/applications.ts b/src/lib/database/applications.ts index ffcafbecd..b2d7ceacd 100644 --- a/src/lib/database/applications.ts +++ b/src/lib/database/applications.ts @@ -119,7 +119,8 @@ export async function getApplicationWebhook({ projectId, branch }) { } export async function getApplicationById({ id }) { const body = await prisma.application.findFirst({ - where: { id } + where: { id }, + include: { destinationDocker: true } }); return { ...body }; diff --git a/src/lib/haproxy/index.ts b/src/lib/haproxy/index.ts index 4e14be487..09d7badd7 100644 --- a/src/lib/haproxy/index.ts +++ b/src/lib/haproxy/index.ts @@ -187,6 +187,59 @@ 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 haproxy = await haproxyInstance(); + await checkHAProxy(haproxy); + try { + const stats: any = await haproxy.get(`v2/services/haproxy/stats/native`).json(); + for (const stat of stats[0].stats) { + if (stat.stats.status === 'DOWN' && stat.type === 'server') { + const { + name, + backend_name: backendName, + stats: { lastchg } + } = stat; + const application = await db.getApplicationById(name); + if (!application) { + const transactionId = await getNextTransactionId(); + await haproxy + .delete(`v2/services/haproxy/configuration/backends/${backendName}`, { + searchParams: { + transaction_id: transactionId + } + }) + .json(); + return await completeTransaction(transactionId); + } + const found = await checkContainer(application.destinationDocker.engine, name); + if (!found) { + const transactionId = await getNextTransactionId(); + await haproxy + .delete(`v2/services/haproxy/configuration/backends/${backendName}`, { + searchParams: { + transaction_id: transactionId + } + }) + .json(); + return await completeTransaction(transactionId); + } + if (lastchg > 120) { + const transactionId = await getNextTransactionId(); + await haproxy + .delete(`v2/services/haproxy/configuration/backends/${backendName}`, { + searchParams: { + transaction_id: transactionId + } + }) + .json(); + await completeTransaction(transactionId); + } + } + } + } catch (error) { + console.log(error); + } +} export async function configureProxyForApplication({ domain, imageId, applicationId, port }) { const haproxy = await haproxyInstance(); await checkHAProxy(haproxy); diff --git a/src/lib/queues/builder.ts b/src/lib/queues/builder.ts index c145619be..2bff0ba83 100644 --- a/src/lib/queues/builder.ts +++ b/src/lib/queues/builder.ts @@ -4,7 +4,12 @@ import * as buildpacks from '../buildPacks'; import * as importers from '../importers'; import { dockerInstance } from '../docker'; import { asyncExecShell, createDirectories, getDomain, getEngine, saveBuildLog } from '../common'; -import { configureProxyForApplication, reloadHaproxy, setWwwRedirection } from '../haproxy'; +import { + checkProxyConfigurations, + configureProxyForApplication, + reloadHaproxy, + setWwwRedirection +} from '../haproxy'; import * as db from '$lib/database'; import { decrypt } from '$lib/crypto'; import { sentry } from '$lib/common'; @@ -253,6 +258,7 @@ export default async function (job) { try { if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) { saveBuildLog({ line: 'Proxy configuration started!', buildId, applicationId }); + await checkProxyConfigurations(); await configureProxyForApplication({ domain, imageId, applicationId, port }); if (isHttps) await letsEncrypt({ domain, id: applicationId }); await setWwwRedirection(fqdn); diff --git a/src/routes/services/[id]/minio/start.json.ts b/src/routes/services/[id]/minio/start.json.ts index 13d1c9604..78372470a 100644 --- a/src/routes/services/[id]/minio/start.json.ts +++ b/src/routes/services/[id]/minio/start.json.ts @@ -6,6 +6,7 @@ import type { RequestHandler } from '@sveltejs/kit'; import { letsEncrypt } from '$lib/letsencrypt'; import { checkHAProxy, + checkProxyConfigurations, configureSimpleServiceProxyOn, reloadHaproxy, setWwwRedirection, @@ -95,6 +96,7 @@ 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); diff --git a/src/routes/services/[id]/nocodb/start.json.ts b/src/routes/services/[id]/nocodb/start.json.ts index e988c7eb4..b6606be7b 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 { letsEncrypt } from '$lib/letsencrypt'; import { checkHAProxy, + checkProxyConfigurations, configureSimpleServiceProxyOn, reloadHaproxy, setWwwRedirection @@ -55,6 +56,7 @@ 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) { diff --git a/src/routes/services/[id]/plausibleanalytics/start.json.ts b/src/routes/services/[id]/plausibleanalytics/start.json.ts index 94c2e46f1..14c4bf934 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 { letsEncrypt } from '$lib/letsencrypt'; import { checkHAProxy, + checkProxyConfigurations, configureSimpleServiceProxyOn, reloadHaproxy, setWwwRedirection @@ -186,6 +187,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) { diff --git a/src/routes/services/[id]/vaultwarden/start.json.ts b/src/routes/services/[id]/vaultwarden/start.json.ts index 4b6e3637a..37482faef 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 { letsEncrypt } from '$lib/letsencrypt'; import { checkHAProxy, + checkProxyConfigurations, configureSimpleServiceProxyOn, reloadHaproxy, setWwwRedirection @@ -73,6 +74,7 @@ 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) { diff --git a/src/routes/services/[id]/vscodeserver/start.json.ts b/src/routes/services/[id]/vscodeserver/start.json.ts index fb49b1b7a..8bd06b17c 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 { letsEncrypt } from '$lib/letsencrypt'; import { checkHAProxy, + checkProxyConfigurations, configureSimpleServiceProxyOn, reloadHaproxy, setWwwRedirection @@ -83,6 +84,7 @@ 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) { diff --git a/src/routes/services/[id]/wordpress/start.json.ts b/src/routes/services/[id]/wordpress/start.json.ts index e7c305deb..fde5cfe66 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 { letsEncrypt } from '$lib/letsencrypt'; import { checkHAProxy, + checkProxyConfigurations, configureSimpleServiceProxyOn, reloadHaproxy, setWwwRedirection @@ -120,6 +121,7 @@ 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) { diff --git a/src/routes/settings/index.json.ts b/src/routes/settings/index.json.ts index e9e867499..bb823ed58 100644 --- a/src/routes/settings/index.json.ts +++ b/src/routes/settings/index.json.ts @@ -3,6 +3,7 @@ import { getDomain, getUserDetails } from '$lib/common'; import * as db from '$lib/database'; import { listSettings, ErrorHandler } from '$lib/database'; import { + checkProxyConfigurations, configureCoolifyProxyOff, configureCoolifyProxyOn, forceSSLOnApplication, @@ -79,6 +80,7 @@ export const post: RequestHandler = async (event) => { const { fqdn, isRegistrationEnabled, dualCerts, minPort, maxPort } = await event.request.json(); try { + await checkProxyConfigurations(); const { id, fqdn: oldFqdn,