fix: cleanup stucked prisma-engines

This commit is contained in:
Andras Bacsai
2022-08-12 09:38:11 +02:00
parent 0a44867240
commit e92d0914c2
5 changed files with 99 additions and 74 deletions

View File

@@ -23,7 +23,7 @@ ENV PRISMA_QUERY_ENGINE_BINARY=/app/prisma-engines/query-engine \
COPY --from=coollabsio/prisma-engine:3.15 /prisma-engines/query-engine /prisma-engines/migration-engine /prisma-engines/introspection-engine /prisma-engines/prisma-fmt /app/prisma-engines/ COPY --from=coollabsio/prisma-engine:3.15 /prisma-engines/query-engine /prisma-engines/migration-engine /prisma-engines/introspection-engine /prisma-engines/prisma-fmt /app/prisma-engines/
RUN apk add --no-cache git git-lfs openssh-client curl jq cmake sqlite openssl RUN apk add --no-cache git git-lfs openssh-client curl jq cmake sqlite openssl psmisc
RUN curl -sL https://unpkg.com/@pnpm/self-installer | node RUN curl -sL https://unpkg.com/@pnpm/self-installer | node
RUN mkdir -p ~/.docker/cli-plugins/ RUN mkdir -p ~/.docker/cli-plugins/

View File

@@ -104,6 +104,7 @@ fastify.listen({ port, host }, async (err: any, address: any) => {
await initServer(); await initServer();
await scheduler.start('deployApplication'); await scheduler.start('deployApplication');
await scheduler.start('cleanupStorage'); await scheduler.start('cleanupStorage');
await scheduler.start('cleanupPrismaEngines');
await scheduler.start('checkProxies'); await scheduler.start('checkProxies');
// Check if no build is running // Check if no build is running
@@ -116,14 +117,14 @@ fastify.listen({ port, host }, async (err: any, address: any) => {
scheduler.workers.get('deployApplication').postMessage("status:autoUpdater"); scheduler.workers.get('deployApplication').postMessage("status:autoUpdater");
} }
} }
}, 60000 * 15) }, isDev ? 5000 : 60000 * 15)
// Cleanup storage // Cleanup storage
setInterval(async () => { setInterval(async () => {
if (scheduler.workers.has('deployApplication')) { if (scheduler.workers.has('deployApplication')) {
scheduler.workers.get('deployApplication').postMessage("status:cleanupStorage"); scheduler.workers.get('deployApplication').postMessage("status:cleanupStorage");
} }
}, 60000 * 10) }, isDev ? 5000 : 60000 * 10)
scheduler.on('worker deleted', async (name) => { scheduler.on('worker deleted', async (name) => {
if (name === 'autoUpdater' || name === 'cleanupStorage') { if (name === 'autoUpdater' || name === 'cleanupStorage') {

View File

@@ -4,87 +4,92 @@ import { checkContainer } from '../lib/docker';
(async () => { (async () => {
if (parentPort) { if (parentPort) {
// Coolify Proxy local try {
const engine = '/var/run/docker.sock'; // Coolify Proxy local
const localDocker = await prisma.destinationDocker.findFirst({ const engine = '/var/run/docker.sock';
where: { engine, network: 'coolify' } const localDocker = await prisma.destinationDocker.findFirst({
}); where: { engine, network: 'coolify' }
if (localDocker && localDocker.isCoolifyProxyUsed) { });
// Remove HAProxy if (localDocker && localDocker.isCoolifyProxyUsed) {
const found = await checkContainer({ dockerId: localDocker.id, container: 'coolify-haproxy' });
if (found) {
await executeDockerCmd({
dockerId: localDocker.id,
command: `docker stop -t 0 coolify-haproxy && docker rm coolify-haproxy`
})
}
await startTraefikProxy(localDocker.id);
}
// TCP Proxies
const databasesWithPublicPort = await prisma.database.findMany({
where: { publicPort: { not: null } },
include: { settings: true, destinationDocker: true }
});
for (const database of databasesWithPublicPort) {
const { destinationDockerId, destinationDocker, publicPort, id } = database;
if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) {
const { privatePort } = generateDatabaseConfiguration(database);
// Remove HAProxy // Remove HAProxy
const found = await checkContainer({ const found = await checkContainer({ dockerId: localDocker.id, container: 'coolify-haproxy' });
dockerId: localDocker.id, container: `haproxy-for-${publicPort}`
});
if (found) { if (found) {
await executeDockerCmd({ await executeDockerCmd({
dockerId: localDocker.id, dockerId: localDocker.id,
command: `docker stop -t 0 haproxy-for-${publicPort} && docker rm haproxy-for-${publicPort}` command: `docker stop -t 0 coolify-haproxy && docker rm coolify-haproxy`
}) })
} }
await startTraefikTCPProxy(destinationDocker, id, publicPort, privatePort); await startTraefikProxy(localDocker.id);
}
} // TCP Proxies
} const databasesWithPublicPort = await prisma.database.findMany({
const wordpressWithFtp = await prisma.wordpress.findMany({ where: { publicPort: { not: null } },
where: { ftpPublicPort: { not: null } }, include: { settings: true, destinationDocker: true }
include: { service: { include: { destinationDocker: true } } } });
}); for (const database of databasesWithPublicPort) {
for (const ftp of wordpressWithFtp) { const { destinationDockerId, destinationDocker, publicPort, id } = database;
const { service, ftpPublicPort } = ftp; if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) {
const { destinationDockerId, destinationDocker, id } = service; const { privatePort } = generateDatabaseConfiguration(database);
if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) { // Remove HAProxy
// Remove HAProxy const found = await checkContainer({
const found = await checkContainer({ dockerId: localDocker.id, container: `haproxy-for-${ftpPublicPort}` }); dockerId: localDocker.id, container: `haproxy-for-${publicPort}`
if (found) { });
await executeDockerCmd({ if (found) {
dockerId: localDocker.id, await executeDockerCmd({
command: `docker stop -t 0 haproxy -for-${ftpPublicPort} && docker rm haproxy-for-${ftpPublicPort}` dockerId: localDocker.id,
}) command: `docker stop -t 0 haproxy-for-${publicPort} && docker rm haproxy-for-${publicPort}`
})
}
await startTraefikTCPProxy(destinationDocker, id, publicPort, privatePort);
} }
await startTraefikTCPProxy(destinationDocker, id, ftpPublicPort, 22, 'wordpressftp');
} }
const wordpressWithFtp = await prisma.wordpress.findMany({
where: { ftpPublicPort: { not: null } },
include: { service: { include: { destinationDocker: true } } }
});
for (const ftp of wordpressWithFtp) {
const { service, ftpPublicPort } = ftp;
const { destinationDockerId, destinationDocker, id } = service;
if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) {
// Remove HAProxy
const found = await checkContainer({ dockerId: localDocker.id, container: `haproxy-for-${ftpPublicPort}` });
if (found) {
await executeDockerCmd({
dockerId: localDocker.id,
command: `docker stop -t 0 haproxy -for-${ftpPublicPort} && docker rm haproxy-for-${ftpPublicPort}`
})
}
await startTraefikTCPProxy(destinationDocker, id, ftpPublicPort, 22, 'wordpressftp');
}
}
// HTTP Proxies
const minioInstances = await prisma.minio.findMany({
where: { publicPort: { not: null } },
include: { service: { include: { destinationDocker: true } } }
});
for (const minio of minioInstances) {
const { service, publicPort } = minio;
const { destinationDockerId, destinationDocker, id } = service;
if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) {
// Remove HAProxy
const found = await checkContainer({ dockerId: localDocker.id, container: `${id}-${publicPort}` });
if (found) {
await executeDockerCmd({
dockerId: localDocker.id,
command: `docker stop -t 0 ${id}-${publicPort} && docker rm ${id}-${publicPort} `
})
}
await startTraefikTCPProxy(destinationDocker, id, publicPort, 9000);
}
}
} catch (error) {
} finally {
await prisma.$disconnect();
} }
// HTTP Proxies
const minioInstances = await prisma.minio.findMany({
where: { publicPort: { not: null } },
include: { service: { include: { destinationDocker: true } } }
});
for (const minio of minioInstances) {
const { service, publicPort } = minio;
const { destinationDockerId, destinationDocker, id } = service;
if (destinationDockerId && destinationDocker.isCoolifyProxyUsed) {
// Remove HAProxy
const found = await checkContainer({ dockerId: localDocker.id, container: `${id}-${publicPort}` });
if (found) {
await executeDockerCmd({
dockerId: localDocker.id,
command: `docker stop -t 0 ${id}-${publicPort} && docker rm ${id}-${publicPort} `
})
}
await startTraefikTCPProxy(destinationDocker, id, publicPort, 9000);
}
}
await prisma.$disconnect();
} else process.exit(0); } else process.exit(0);
})(); })();

View File

@@ -0,0 +1,16 @@
import { parentPort } from 'node:worker_threads';
import { asyncExecShell, isDev, prisma } from '../lib/common';
(async () => {
if (parentPort) {
if (!isDev) {
try {
await asyncExecShell(`killall -q -e /app/prisma-engines/query-engine -o 10m`)
} catch (error) {
console.log(error);
} finally {
await prisma.$disconnect();
}
}
} else process.exit(0);
})();

View File

@@ -35,6 +35,9 @@ const options: any = {
{ {
name: 'cleanupStorage', name: 'cleanupStorage',
}, },
{
name: 'cleanupPrismaEngines',
},
{ {
name: 'checkProxies', name: 'checkProxies',
interval: '10s' interval: '10s'