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/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.'); 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(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 reject(new Error('Build canceled')); + } + + 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,7 @@ 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); 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}