This commit is contained in:
Andras Bacsai
2022-03-01 15:22:11 +01:00
parent dbcbac0137
commit f51f7bc82a
3 changed files with 142 additions and 130 deletions

View File

@@ -113,143 +113,153 @@ export async function haproxyInstance() {
} }
export async function configureHAProxy() { export async function configureHAProxy() {
const haproxy = await haproxyInstance(); try {
await checkHAProxy(haproxy); const haproxy = await haproxyInstance();
const data = { await checkHAProxy(haproxy);
applications: [], const data = {
services: [], applications: [],
coolify: [] services: [],
}; coolify: []
const applications = await db.prisma.application.findMany({ };
include: { destinationDocker: true, settings: true } const applications = await db.prisma.application.findMany({
}); include: { destinationDocker: true, settings: true }
for (const application of applications) { });
const { for (const application of applications) {
fqdn, const {
id, fqdn,
port,
destinationDocker: { engine, network },
settings: { previews },
updatedAt
} = application;
const isRunning = await checkContainer(engine, id);
const domain = getDomain(fqdn);
const isHttps = fqdn.startsWith('https://');
const isWWW = fqdn.includes('www.');
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
if (isRunning) {
data.applications.push({
id, id,
port: port || 3000, port,
destinationDocker,
destinationDockerId,
settings: { previews },
updatedAt
} = application;
if (destinationDockerId) {
const { engine, network } = destinationDocker;
const isRunning = await checkContainer(engine, id);
if (fqdn) {
const domain = getDomain(fqdn);
const isHttps = fqdn.startsWith('https://');
const isWWW = fqdn.includes('www.');
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
if (isRunning) {
data.applications.push({
id,
port: port || 3000,
domain,
isRunning,
isHttps,
redirectValue,
redirectTo: isWWW ? domain : 'www.' + domain,
updatedAt: updatedAt.getTime()
});
}
if (previews) {
const host = getEngine(engine);
const { stdout } = await asyncExecShell(
`DOCKER_HOST=${host} docker container ls --filter="status=running" --filter="network=${network}" --filter="name=${id}-" --format="{{json .Names}}"`
);
const containers = stdout
.trim()
.split('\n')
.filter((a) => a)
.map((c) => c.replace(/"/g, ''));
if (containers.length > 0) {
for (const container of containers) {
let previewDomain = `${container.split('-')[1]}.${domain}`;
data.applications.push({
id: container,
port: port || 3000,
domain: previewDomain,
isRunning,
isHttps,
redirectValue,
redirectTo: isWWW ? previewDomain : 'www.' + previewDomain,
updatedAt: updatedAt.getTime()
});
}
}
}
}
}
}
const services = await db.prisma.service.findMany({
include: {
destinationDocker: true,
minio: true,
plausibleAnalytics: true,
vscodeserver: true,
wordpress: true
}
});
for (const service of services) {
const { fqdn, id, type, destinationDocker, destinationDockerId, updatedAt } = service;
if (destinationDockerId) {
const { engine } = destinationDocker;
const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type);
if (found) {
const port = found.ports.main;
const publicPort = service[type]?.publicPort;
const isRunning = await checkContainer(engine, id);
if (fqdn) {
const domain = getDomain(fqdn);
const isHttps = fqdn.startsWith('https://');
const isWWW = fqdn.includes('www.');
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
if (isRunning) {
data.services.push({
id,
port,
publicPort,
domain,
isRunning,
isHttps,
redirectValue,
redirectTo: isWWW ? domain : 'www.' + domain,
updatedAt: updatedAt.getTime()
});
}
}
}
}
}
const { fqdn, updatedAt } = await db.prisma.setting.findFirst();
if (fqdn) {
const domain = getDomain(fqdn);
const isHttps = fqdn.startsWith('https://');
const isWWW = fqdn.includes('www.');
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
data.coolify.push({
id: dev ? 'host.docker.internal' : 'coolify',
port: 3000,
domain, domain,
isRunning,
isHttps, isHttps,
redirectValue, redirectValue,
redirectTo: isWWW ? domain : 'www.' + domain, redirectTo: isWWW ? domain : 'www.' + domain,
updatedAt: updatedAt.getTime() updatedAt: updatedAt.getTime()
}); });
} }
if (previews) { const output = mustache.render(template, data);
const host = getEngine(engine); const newHash = crypto.createHash('md5').update(output).digest('hex');
const { stdout } = await asyncExecShell( const { proxyHash, id } = await db.listSettings();
`DOCKER_HOST=${host} docker container ls --filter="status=running" --filter="network=${network}" --filter="name=${id}-" --format="{{json .Names}}"` console.log({ proxyHash, newHash, output });
); if (proxyHash !== newHash) {
const containers = stdout await db.prisma.setting.update({ where: { id }, data: { proxyHash: newHash } });
.trim() console.log('HAProxy configuration changed, updating...');
.split('\n') await haproxy.post(`v2/services/haproxy/configuration/raw`, {
.filter((a) => a) searchParams: {
.map((c) => c.replace(/"/g, '')); skip_version: true
if (containers.length > 0) { },
for (const container of containers) { body: output,
let previewDomain = `${container.split('-')[1]}.${domain}`; headers: {
data.applications.push({ 'Content-Type': 'text/plain'
id: container,
port: port || 3000,
domain: previewDomain,
isRunning,
isHttps,
redirectValue,
redirectTo: isWWW ? previewDomain : 'www.' + previewDomain,
updatedAt: updatedAt.getTime()
});
} }
} });
} else {
console.log('HAProxy configuration is up to date');
} }
} } catch (error) {
const services = await db.prisma.service.findMany({ throw error;
include: {
destinationDocker: true,
minio: true,
plausibleAnalytics: true,
vscodeserver: true,
wordpress: true
}
});
for (const service of services) {
const {
fqdn,
id,
type,
destinationDocker: { engine },
updatedAt
} = service;
const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type);
if (found) {
const port = found.ports.main;
const publicPort = service[type]?.publicPort;
const isRunning = await checkContainer(engine, id);
const domain = getDomain(fqdn);
const isHttps = fqdn.startsWith('https://');
const isWWW = fqdn.includes('www.');
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
if (isRunning) {
data.services.push({
id,
port,
publicPort,
domain,
isRunning,
isHttps,
redirectValue,
redirectTo: isWWW ? domain : 'www.' + domain,
updatedAt: updatedAt.getTime()
});
}
}
}
const { fqdn, updatedAt } = await db.prisma.setting.findFirst();
if (fqdn) {
const domain = getDomain(fqdn);
const isHttps = fqdn.startsWith('https://');
const isWWW = fqdn.includes('www.');
const redirectValue = `${isHttps ? 'https://' : 'http://'}${domain}%[capture.req.uri]`;
data.coolify.push({
id: dev ? 'host.docker.internal' : 'coolify',
port: 3000,
domain,
isHttps,
redirectValue,
redirectTo: isWWW ? domain : 'www.' + domain,
updatedAt
});
}
const output = mustache.render(template, data);
const newHash = crypto.createHash('md5').update(output).digest('hex');
const { proxyHash, id } = await db.listSettings();
if (proxyHash !== newHash) {
await db.prisma.setting.update({ where: { id }, data: { proxyHash: newHash } });
console.log('HAProxy configuration changed, updating...');
await haproxy.post(`v2/services/haproxy/configuration/raw`, {
searchParams: {
skip_version: true
},
body: output,
headers: {
'Content-Type': 'text/plain'
}
});
} else {
// console.log('HAProxy configuration is up to date');
} }
} }

View File

@@ -70,7 +70,7 @@ export async function deleteProxy({ id }) {
}) })
.json(); .json();
} catch (error) { } catch (error) {
console.log(error.response.body); console.log(error.response?.body || error);
} finally { } finally {
if (transactionId) await completeTransaction(transactionId); if (transactionId) await completeTransaction(transactionId);
} }

View File

@@ -1,3 +1,4 @@
import { dev } from '$app/env';
import { ErrorHandler } from '$lib/database'; import { ErrorHandler } from '$lib/database';
import { configureHAProxy } from '$lib/haproxy/configuration'; import { configureHAProxy } from '$lib/haproxy/configuration';
@@ -5,6 +6,7 @@ export default async function () {
try { try {
return await configureHAProxy(); return await configureHAProxy();
} catch (error) { } catch (error) {
ErrorHandler(error.response.body || error); console.log(error.response?.body || error);
return ErrorHandler(error.response?.body || error);
} }
} }