diff --git a/src/lib/database/checks.ts b/src/lib/database/checks.ts index 7cc066605..35af8dc00 100644 --- a/src/lib/database/checks.ts +++ b/src/lib/database/checks.ts @@ -21,16 +21,35 @@ export async function isSecretExists({ id, name }) { export async function isDomainConfigured({ id, fqdn }) { const domain = getDomain(fqdn); + const nakedDomain = domain.replace('www.', ''); const foundApp = await prisma.application.findFirst({ - where: { fqdn: { endsWith: `//${domain}` }, id: { not: id } }, + where: { + OR: [ + { fqdn: { endsWith: `//${nakedDomain}` } }, + { fqdn: { endsWith: `//www.${nakedDomain}` } } + ], + id: { not: id } + }, select: { fqdn: true } }); const foundService = await prisma.service.findFirst({ - where: { fqdn: { endsWith: `//${domain}` }, id: { not: id } }, + where: { + OR: [ + { fqdn: { endsWith: `//${nakedDomain}` } }, + { fqdn: { endsWith: `//www.${nakedDomain}` } } + ], + id: { not: id } + }, select: { fqdn: true } }); const coolifyFqdn = await prisma.setting.findFirst({ - where: { fqdn: { endsWith: `//${domain}` }, id: { not: id } }, + where: { + OR: [ + { fqdn: { endsWith: `//${nakedDomain}` } }, + { fqdn: { endsWith: `//www.${nakedDomain}` } } + ], + id: { not: id } + }, select: { fqdn: true } }); if (foundApp || foundService || coolifyFqdn) return true; diff --git a/src/lib/letsencrypt.ts b/src/lib/letsencrypt.ts index a75888b61..8e51d4f58 100644 --- a/src/lib/letsencrypt.ts +++ b/src/lib/letsencrypt.ts @@ -46,30 +46,29 @@ export async function letsEncrypt({ domain, isCoolify = false, id = null }) { } } } - if (!dev) { - if (dualCerts) { - await asyncExecShell( - `DOCKER_HOST=${host} docker run --rm --name certbot-${randomCuid} -p ${randomPort}:${randomPort} -v "coolify-letsencrypt:/etc/letsencrypt" certbot/certbot --logs-dir /etc/letsencrypt/logs certonly --standalone --preferred-challenges http --http-01-address 0.0.0.0 --http-01-port ${randomPort} -d ${nakedDomain} -d ${wwwDomain} --expand --agree-tos --non-interactive --register-unsafely-without-email` - ); - await asyncExecShell( - `DOCKER_HOST=${host} docker run --rm -v "coolify-letsencrypt:/etc/letsencrypt" -v "coolify-ssl-certs:/app/ssl" alpine:latest sh -c "test -d /etc/letsencrypt/live/${nakedDomain}/ && cat /etc/letsencrypt/live/${nakedDomain}/fullchain.pem /etc/letsencrypt/live/${nakedDomain}/privkey.pem > /app/ssl/${nakedDomain}.pem || cat /etc/letsencrypt/live/${wwwDomain}/fullchain.pem /etc/letsencrypt/live/${wwwDomain}/privkey.pem > /app/ssl/${wwwDomain}.pem"` - ); - } else { - await asyncExecShell( - `DOCKER_HOST=${host} docker run --rm --name certbot-${randomCuid} -p ${randomPort}:${randomPort} -v "coolify-letsencrypt:/etc/letsencrypt" certbot/certbot --logs-dir /etc/letsencrypt/logs certonly --standalone --preferred-challenges http --http-01-address 0.0.0.0 --http-01-port ${randomPort} -d ${domain} --expand --agree-tos --non-interactive --register-unsafely-without-email` - ); - await asyncExecShell( - `DOCKER_HOST=${host} docker run --rm -v "coolify-letsencrypt:/etc/letsencrypt" -v "coolify-ssl-certs:/app/ssl" alpine:latest sh -c "cat /etc/letsencrypt/live/${domain}/fullchain.pem /etc/letsencrypt/live/${domain}/privkey.pem > /app/ssl/${domain}.pem"` - ); - } + if (dualCerts) { + await asyncExecShell( + `DOCKER_HOST=${host} docker run --rm --name certbot-${randomCuid} -p ${randomPort}:${randomPort} -v "coolify-letsencrypt:/etc/letsencrypt" certbot/certbot --logs-dir /etc/letsencrypt/logs certonly --standalone --preferred-challenges http --http-01-address 0.0.0.0 --http-01-port ${randomPort} -d ${nakedDomain} -d ${wwwDomain} --expand --agree-tos --non-interactive --register-unsafely-without-email ${ + dev && '--test-cert' + }` + ); + await asyncExecShell( + `DOCKER_HOST=${host} docker run --rm -v "coolify-letsencrypt:/etc/letsencrypt" -v "coolify-ssl-certs:/app/ssl" alpine:latest sh -c "test -d /etc/letsencrypt/live/${nakedDomain}/ && cat /etc/letsencrypt/live/${nakedDomain}/fullchain.pem /etc/letsencrypt/live/${nakedDomain}/privkey.pem > /app/ssl/${nakedDomain}.pem || cat /etc/letsencrypt/live/${wwwDomain}/fullchain.pem /etc/letsencrypt/live/${wwwDomain}/privkey.pem > /app/ssl/${wwwDomain}.pem"` + ); } else { - console.log({ dualCerts, host, wwwDomain, nakedDomain, domain }); + await asyncExecShell( + `DOCKER_HOST=${host} docker run --rm --name certbot-${randomCuid} -p ${randomPort}:${randomPort} -v "coolify-letsencrypt:/etc/letsencrypt" certbot/certbot --logs-dir /etc/letsencrypt/logs certonly --standalone --preferred-challenges http --http-01-address 0.0.0.0 --http-01-port ${randomPort} -d ${domain} --expand --agree-tos --non-interactive --register-unsafely-without-email ${ + dev && '--test-cert' + }` + ); + await asyncExecShell( + `DOCKER_HOST=${host} docker run --rm -v "coolify-letsencrypt:/etc/letsencrypt" -v "coolify-ssl-certs:/app/ssl" alpine:latest sh -c "cat /etc/letsencrypt/live/${domain}/fullchain.pem /etc/letsencrypt/live/${domain}/privkey.pem > /app/ssl/${domain}.pem"` + ); } if (!isCoolify) { await forceSSLOnApplication({ domain }); } } catch (error) { - console.log(error); throw error; } } diff --git a/src/lib/queues/builder.ts b/src/lib/queues/builder.ts index 41b11dc1e..05c9b19dd 100644 --- a/src/lib/queues/builder.ts +++ b/src/lib/queues/builder.ts @@ -239,6 +239,8 @@ export default async function (job) { if (stderr) console.log(stderr); saveBuildLog({ line: 'Deployment successful!', buildId, applicationId }); } catch (error) { + saveBuildLog({ line: error, buildId, applicationId }); + sentry.captureException(error); throw new Error(error); } try { @@ -257,6 +259,7 @@ export default async function (job) { }); } } catch (error) { + saveBuildLog({ line: error.stdout || error, buildId, applicationId }); sentry.captureException(error); } } diff --git a/src/routes/applications/[id]/check.json.ts b/src/routes/applications/[id]/check.json.ts index 267f7c384..36e87b616 100644 --- a/src/routes/applications/[id]/check.json.ts +++ b/src/routes/applications/[id]/check.json.ts @@ -16,7 +16,7 @@ export const post: RequestHandler = async (event) => { const found = await db.isDomainConfigured({ id, fqdn }); if (found) { throw { - message: `Domain ${getDomain(fqdn)} is already configured.` + message: `Domain ${getDomain(fqdn).replace('www.', '')} is already configured.` }; } return { diff --git a/src/routes/services/[id]/check.json.ts b/src/routes/services/[id]/check.json.ts index 5fb1915a0..861daee84 100644 --- a/src/routes/services/[id]/check.json.ts +++ b/src/routes/services/[id]/check.json.ts @@ -17,7 +17,7 @@ export const post: RequestHandler = async (event) => { return { status: found ? 500 : 200, body: { - error: found && `Domain ${getDomain(fqdn)} is already configured` + error: found && `Domain ${getDomain(fqdn).replace('www.', '')} is already configured` } }; } catch (error) { diff --git a/src/routes/settings/check.json.ts b/src/routes/settings/check.json.ts index 0d099abe6..15d91613f 100644 --- a/src/routes/settings/check.json.ts +++ b/src/routes/settings/check.json.ts @@ -16,7 +16,7 @@ export const post: RequestHandler = async (event) => { return { status: found ? 500 : 200, body: { - error: found && `Domain ${fqdn} is already configured` + error: found && `Domain ${fqdn.replace('www.', '')} is already configured` } }; } catch (error) {