diff --git a/apps/api/src/jobs/cleanupStorage.ts b/apps/api/src/jobs/cleanupStorage.ts index dd8636175..50f7582d8 100644 --- a/apps/api/src/jobs/cleanupStorage.ts +++ b/apps/api/src/jobs/cleanupStorage.ts @@ -1,20 +1,21 @@ import { parentPort } from 'node:worker_threads'; -import { asyncExecShell, cleanupDockerStorage, isDev, prisma, version } from '../lib/common'; +import { asyncExecShell, cleanupDockerStorage, executeDockerCmd, isDev, prisma, version } from '../lib/common'; import { getEngine } from '../lib/docker'; (async () => { if (parentPort) { const destinationDockers = await prisma.destinationDocker.findMany(); - const engines = [...new Set(destinationDockers.map(({ engine }) => engine))]; - for (const engine of engines) { + let enginesDone = new Set() + for (const destination of destinationDockers) { + if (enginesDone.has(destination.engine) || enginesDone.has(destination.remoteIpAddress)) return + if (destination.engine) enginesDone.add(destination.engine) + if (destination.remoteIpAddress) enginesDone.add(destination.remoteIpAddress) + let lowDiskSpace = false; - const host = getEngine(engine); try { let stdout = null if (!isDev) { - const output = await asyncExecShell( - `DOCKER_HOST=${host} docker exec coolify sh -c 'df -kPT /'` - ); + const output = await executeDockerCmd({ dockerId: destination.id, command: `docker exec coolify sh -c 'df -kPT /'` }) stdout = output.stdout; } else { const output = await asyncExecShell( @@ -53,7 +54,7 @@ import { getEngine } from '../lib/docker'; } catch (error) { console.log(error); } - await cleanupDockerStorage(host, lowDiskSpace, false) + await cleanupDockerStorage(destination.id, lowDiskSpace, false) } await prisma.$disconnect(); } else process.exit(0); diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 52ab8b651..d4fd27d03 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -1530,15 +1530,14 @@ export function convertTolOldVolumeNames(type) { // const { data } = await axios.get(`https://gist.githubusercontent.com/andrasbacsai/4aac36d8d6214dbfc34fa78110554a50/raw/5b27e6c37d78aaeedc1148d797112c827a2f43cf/availableServices.json`) // return data // } -export async function cleanupDockerStorage(host, lowDiskSpace, force) { +export async function cleanupDockerStorage(dockerId, lowDiskSpace, force) { // Cleanup old coolify images try { - let { stdout: images } = await asyncExecShell( - `DOCKER_HOST=${host} docker images coollabsio/coolify --filter before="coollabsio/coolify:${version}" -q | xargs ` - ); + let { stdout: images } = await executeDockerCmd({ dockerId, command: `docker images coollabsio/coolify --filter before="coollabsio/coolify:${version}" -q | xargs` }) + images = images.trim(); if (images) { - await asyncExecShell(`DOCKER_HOST=${host} docker rmi -f ${images}`); + await executeDockerCmd({ dockerId, command: `docker rmi -f ${images}" -q | xargs` }) } } catch (error) { //console.log(error); @@ -1549,17 +1548,17 @@ export async function cleanupDockerStorage(host, lowDiskSpace, force) { return } try { - await asyncExecShell(`DOCKER_HOST=${host} docker container prune -f`); + await executeDockerCmd({ dockerId, command: `docker container prune -f` }) } catch (error) { //console.log(error); } try { - await asyncExecShell(`DOCKER_HOST=${host} docker image prune -f`); + await executeDockerCmd({ dockerId, command: `docker image prune -f` }) } catch (error) { //console.log(error); } try { - await asyncExecShell(`DOCKER_HOST=${host} docker image prune -a -f`); + await executeDockerCmd({ dockerId, command: `docker image prune -a -f` }) } catch (error) { //console.log(error); } diff --git a/apps/api/src/routes/api/v1/handlers.ts b/apps/api/src/routes/api/v1/handlers.ts index 4b62f3845..bb94149a5 100644 --- a/apps/api/src/routes/api/v1/handlers.ts +++ b/apps/api/src/routes/api/v1/handlers.ts @@ -17,7 +17,8 @@ export async function hashPassword(password: string): Promise { export async function cleanupManually() { try { - await cleanupDockerStorage('unix:///var/run/docker.sock', true, true) + const destination = await prisma.destinationDocker.findFirst({ where: { engine: '/var/run/docker.sock' } }) + await cleanupDockerStorage(destination.id, true, true) return {} } catch ({ status, message }) { return errorHandler({ status, message })