From 7cc760eecfdfedbd0bed6b0513870c6668707f1f Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 6 May 2022 14:43:28 +0200 Subject: [PATCH 1/3] fix: Disable sentry for now --- src/lib/common.ts | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/lib/common.ts b/src/lib/common.ts index f9c77f3d3..61009d42f 100644 --- a/src/lib/common.ts +++ b/src/lib/common.ts @@ -20,21 +20,21 @@ import { t } from './translations'; try { if (!dev) { - Sentry.init({ - dsn: process.env['COOLIFY_SENTRY_DSN'], - tracesSampleRate: 0, - environment: 'production', - debug: true, - release: currentVersion, - initialScope: { - tags: { - appId: process.env['COOLIFY_APP_ID'], - 'os.arch': getOsArch(), - 'os.platform': os.platform(), - 'os.release': os.release() - } - } - }); + // Sentry.init({ + // dsn: process.env['COOLIFY_SENTRY_DSN'], + // tracesSampleRate: 0, + // environment: 'production', + // debug: true, + // release: currentVersion, + // initialScope: { + // tags: { + // appId: process.env['COOLIFY_APP_ID'], + // 'os.arch': getOsArch(), + // 'os.platform': os.platform(), + // 'os.release': os.release() + // } + // } + // }); } } catch (err) { console.log('Could not initialize Sentry, no worries.'); From fa5f439858af748f69d68347cf7d65613a5b8afd Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 6 May 2022 14:45:50 +0200 Subject: [PATCH 2/3] fix: Cancel --- src/routes/applications/[id]/cancel.json.ts | 108 +++++++++--------- .../[id]/logs/build/_BuildLog.svelte | 33 +++--- 2 files changed, 76 insertions(+), 65 deletions(-) diff --git a/src/routes/applications/[id]/cancel.json.ts b/src/routes/applications/[id]/cancel.json.ts index edaa22c95..e09c954f7 100644 --- a/src/routes/applications/[id]/cancel.json.ts +++ b/src/routes/applications/[id]/cancel.json.ts @@ -3,6 +3,61 @@ import { buildQueue } from '$lib/queues'; import type { RequestHandler } from '@sveltejs/kit'; import * as db from '$lib/database'; +async function cleanupDB(buildId: string) { + const data = await db.prisma.build.findUnique({ where: { id: buildId } }); + if (data?.status === 'queued' || data?.status === 'running') { + await db.prisma.build.update({ where: { id: buildId }, data: { status: 'failed' } }); + } +} + +async function stopBuild(buildId, applicationId) { + let count = 0; + await new Promise(async (resolve, reject) => { + const job = await buildQueue.getJob(buildId); + if (!job) { + await cleanupDB(buildId); + return resolve(); + } + const { + destinationDocker: { engine } + } = job?.data; + const host = getEngine(engine); + let interval = setInterval(async () => { + try { + const data = await db.prisma.build.findUnique({ where: { id: buildId } }); + if (data?.status === 'failed') { + clearInterval(interval); + return resolve(); + } + if (count > 100) { + clearInterval(interval); + return resolve(); + } + + const { stdout: buildContainers } = await asyncExecShell( + `DOCKER_HOST=${host} docker container ls --filter "label=coolify.buildId=${buildId}" --format '{{json .}}'` + ); + if (buildContainers) { + const containersArray = buildContainers.trim().split('\n'); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id = containerObj.ID; + if (!containerObj.Names.startsWith(`${applicationId}`)) { + await removeDestinationDocker({ id, engine }); + clearInterval(interval); + await saveBuildLog({ + line: 'Canceled by user!', + buildId: job.data.build_id, + applicationId: job.data.id + }); + } + } + } + count++; + } catch (error) {} + }, 100); + }); +} export const post: RequestHandler = async (event) => { const { buildId, applicationId } = await event.request.json(); if (!buildId) { @@ -14,57 +69,8 @@ export const post: RequestHandler = async (event) => { }; } try { - let count = 0; - await new Promise(async (resolve, reject) => { - const job = await buildQueue.getJob(buildId); - if (!job) { - return resolve(); - } - const { - destinationDocker: { engine } - } = job?.data; - const host = getEngine(engine); - let interval = setInterval(async () => { - try { - const data = await db.prisma.build.findUnique({ where: { id: buildId } }); - if (data?.status === 'failed') { - clearInterval(interval); - return resolve(); - } - if (count > 60) { - clearInterval(interval); - reject(new Error('Could not cancel build.')); - } - - const { stdout: buildContainers } = await asyncExecShell( - `DOCKER_HOST=${host} docker container ls --filter "label=coolify.buildId=${buildId}" --format '{{json .}}'` - ); - if (buildContainers) { - const containersArray = buildContainers.trim().split('\n'); - for (const container of containersArray) { - const containerObj = JSON.parse(container); - const id = containerObj.ID; - if (!containerObj.Names.startsWith(`${applicationId}`)) { - await removeDestinationDocker({ id, engine }); - clearInterval(interval); - await saveBuildLog({ - line: 'Canceled by user!', - buildId: job.data.build_id, - applicationId: job.data.id - }); - } - } - } - count++; - } catch (error) {} - }, 1000); - - resolve(); - }); - const data = await db.prisma.build.findUnique({ where: { id: buildId } }); - if (data?.status === 'queued' || data?.status === 'running') { - await db.prisma.build.update({ where: { id: buildId }, data: { status: 'failed' } }); - } + await stopBuild(buildId, applicationId); + await cleanupDB(buildId); return { status: 200, body: { diff --git a/src/routes/applications/[id]/logs/build/_BuildLog.svelte b/src/routes/applications/[id]/logs/build/_BuildLog.svelte index 378e58c2c..b95e295f1 100644 --- a/src/routes/applications/[id]/logs/build/_BuildLog.svelte +++ b/src/routes/applications/[id]/logs/build/_BuildLog.svelte @@ -129,23 +129,28 @@ {#if currentStatus === 'running'} {/if} From 6a6426fe6bd732b200c8aad773a40deaaebe4eec Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 6 May 2022 15:40:07 +0200 Subject: [PATCH 3/3] fix: Sentry --- src/hooks.ts | 2 +- src/lib/database/common.ts | 126 ++++++++++---------- src/lib/queues/builder.ts | 2 +- src/routes/applications/[id]/cancel.json.ts | 3 +- 4 files changed, 66 insertions(+), 67 deletions(-) diff --git a/src/hooks.ts b/src/hooks.ts index 50624b22f..639bab353 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -114,5 +114,5 @@ export const getSession: GetSession = function ({ locals }) { }; export async function handleError({ error, event }) { - if (!dev) sentry.captureException(error, event); + // if (!dev) sentry.captureException(error, event); } diff --git a/src/lib/database/common.ts b/src/lib/database/common.ts index e83308878..c6293e76f 100644 --- a/src/lib/database/common.ts +++ b/src/lib/database/common.ts @@ -58,7 +58,7 @@ export function ErrorHandler(e: { truncatedError.message = 'git clone failed'; } if (!e.message?.includes('Coolify Proxy is not running')) { - sentry.captureException(truncatedError); + // sentry.captureException(truncatedError); } const payload = { status: truncatedError.status || 500, @@ -127,73 +127,73 @@ export function getServiceImages(type: string): string[] { export function generateDatabaseConfiguration(database: Database & { settings: DatabaseSettings }): | { - volume: string; - image: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - MYSQL_DATABASE: string; - MYSQL_PASSWORD: string; - MYSQL_ROOT_USER: string; - MYSQL_USER: string; - MYSQL_ROOT_PASSWORD: string; - }; - } + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MYSQL_DATABASE: string; + MYSQL_PASSWORD: string; + MYSQL_ROOT_USER: string; + MYSQL_USER: string; + MYSQL_ROOT_PASSWORD: string; + }; + } | { - volume: string; - image: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - MONGODB_ROOT_USER: string; - MONGODB_ROOT_PASSWORD: string; - }; - } + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MONGODB_ROOT_USER: string; + MONGODB_ROOT_PASSWORD: string; + }; + } | { - volume: string; - image: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - MARIADB_ROOT_USER: string; - MARIADB_ROOT_PASSWORD: string; - MARIADB_USER: string; - MARIADB_PASSWORD: string; - MARIADB_DATABASE: string; - }; - } + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + MARIADB_ROOT_USER: string; + MARIADB_ROOT_PASSWORD: string; + MARIADB_USER: string; + MARIADB_PASSWORD: string; + MARIADB_DATABASE: string; + }; + } | { - volume: string; - image: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - POSTGRESQL_POSTGRES_PASSWORD: string; - POSTGRESQL_USERNAME: string; - POSTGRESQL_PASSWORD: string; - POSTGRESQL_DATABASE: string; - }; - } + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + POSTGRESQL_POSTGRES_PASSWORD: string; + POSTGRESQL_USERNAME: string; + POSTGRESQL_PASSWORD: string; + POSTGRESQL_DATABASE: string; + }; + } | { - volume: string; - image: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - REDIS_AOF_ENABLED: string; - REDIS_PASSWORD: string; - }; - } + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + REDIS_AOF_ENABLED: string; + REDIS_PASSWORD: string; + }; + } | { - volume: string; - image: string; - ulimits: Record; - privatePort: number; - environmentVariables: { - COUCHDB_PASSWORD: string; - COUCHDB_USER: string; - }; - } { + volume: string; + image: string; + ulimits: Record; + privatePort: number; + environmentVariables: { + COUCHDB_PASSWORD: string; + COUCHDB_USER: string; + }; + } { const { id, dbUser, diff --git a/src/lib/queues/builder.ts b/src/lib/queues/builder.ts index 7c7740945..c69ffb678 100644 --- a/src/lib/queues/builder.ts +++ b/src/lib/queues/builder.ts @@ -328,7 +328,7 @@ export default async function (job: Job): Promise 100) { clearInterval(interval); - return resolve(); + return reject(new Error('Build canceled')); } const { stdout: buildContainers } = await asyncExecShell( @@ -70,7 +70,6 @@ export const post: RequestHandler = async (event) => { } try { await stopBuild(buildId, applicationId); - await cleanupDB(buildId); return { status: 200, body: {