fix: cleanup stucked prisma-engines
This commit is contained in:
@@ -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/
|
||||||
|
@@ -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') {
|
||||||
|
@@ -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);
|
||||||
})();
|
})();
|
||||||
|
16
apps/api/src/jobs/cleanupPrismaEngines.ts
Normal file
16
apps/api/src/jobs/cleanupPrismaEngines.ts
Normal 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);
|
||||||
|
})();
|
@@ -35,6 +35,9 @@ const options: any = {
|
|||||||
{
|
{
|
||||||
name: 'cleanupStorage',
|
name: 'cleanupStorage',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'cleanupPrismaEngines',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'checkProxies',
|
name: 'checkProxies',
|
||||||
interval: '10s'
|
interval: '10s'
|
||||||
|
Reference in New Issue
Block a user