From c3d39e1dd4e512d9e9381479ad3ecf50d9693e43 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 09:31:36 +0100 Subject: [PATCH 1/8] fix: Be sure .env exists --- src/lib/queues/builder.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lib/queues/builder.ts b/src/lib/queues/builder.ts index 2bff0ba83..4c1ad631e 100644 --- a/src/lib/queues/builder.ts +++ b/src/lib/queues/builder.ts @@ -239,10 +239,16 @@ export default async function (job) { baseDirectory, publishDirectory }); + let envFound = false; + try { + envFound = !!(await fs.stat(`${workdir}/.env`)); + } catch (error) { + // + } try { saveBuildLog({ line: 'Deployment started.', buildId, applicationId }); const { stderr } = await asyncExecShell( - `DOCKER_HOST=${host} docker run --env-file=${workdir}/.env ${labels.join( + `DOCKER_HOST=${host} docker run ${envFound && `--env-file=${workdir}/.env`} ${labels.join( ' ' )} --name ${imageId} --network ${ docker.network From b56e28d27a8fd7767d697f2f5bbd8e5eec61c5f9 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 09:48:12 +0100 Subject: [PATCH 2/8] UI: colorful states --- src/routes/applications/[id]/__layout.svelte | 4 ++-- src/routes/databases/[id]/__layout.svelte | 4 ++-- src/routes/login/index.svelte | 8 +++++--- src/routes/services/[id]/__layout.svelte | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/routes/applications/[id]/__layout.svelte b/src/routes/applications/[id]/__layout.svelte index e25e63cc2..e95f95d05 100644 --- a/src/routes/applications/[id]/__layout.svelte +++ b/src/routes/applications/[id]/__layout.svelte @@ -128,7 +128,7 @@ title="Stop application" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-green-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 text-red-500" data-tooltip={$session.isAdmin ? 'Stop application' : 'You do not have permission to stop the application.'} @@ -153,7 +153,7 @@ title="Rebuild application" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-green-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:text-green-500" data-tooltip={$session.isAdmin ? 'Rebuild application' : 'You do not have permission to rebuild application.'} diff --git a/src/routes/databases/[id]/__layout.svelte b/src/routes/databases/[id]/__layout.svelte index 2da542993..ae08d48f7 100644 --- a/src/routes/databases/[id]/__layout.svelte +++ b/src/routes/databases/[id]/__layout.svelte @@ -120,7 +120,7 @@ title="Stop database" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-purple-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 text-red-500" data-tooltip={$session.isAdmin ? 'Stop database' : 'You do not have permission to stop the database.'} @@ -146,7 +146,7 @@ title="Start database" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-purple-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 text-green-500" data-tooltip={$session.isAdmin ? 'Start database' : 'You do not have permission to start the database.'} diff --git a/src/routes/login/index.svelte b/src/routes/login/index.svelte index 27193ddc9..b321bc086 100644 --- a/src/routes/login/index.svelte +++ b/src/routes/login/index.svelte @@ -71,12 +71,14 @@ class:text-stone-600={loading} class:bg-coollabs={!loading}>{loading ? 'Authenticating...' : 'Login'} + Register - goto('/reset')}>Reset password diff --git a/src/routes/services/[id]/__layout.svelte b/src/routes/services/[id]/__layout.svelte index 21012ad3e..e1f5b21a6 100644 --- a/src/routes/services/[id]/__layout.svelte +++ b/src/routes/services/[id]/__layout.svelte @@ -140,7 +140,7 @@ title="Stop Service" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-pink-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 text-red-500" data-tooltip={$session.isAdmin ? 'Stop Service' : 'You do not have permission to stop the service.'} @@ -166,7 +166,7 @@ title="Start Service" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-pink-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 text-green-500" data-tooltip={$session.isAdmin ? 'Start Service' : 'You do not have permission to start the service.'} From 5ff4197572e6ee1ca17713a18b449628a55f7a96 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 09:48:24 +0100 Subject: [PATCH 3/8] fix: missing fqdn for services --- src/lib/haproxy/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/haproxy/index.ts b/src/lib/haproxy/index.ts index 0d1d14fd2..fffba0ba7 100644 --- a/src/lib/haproxy/index.ts +++ b/src/lib/haproxy/index.ts @@ -620,6 +620,9 @@ export async function configureSimpleServiceProxyOn({ id, domain, port }) { } export async function configureSimpleServiceProxyOff(fqdn) { + if (!fqdn) { + return; + } const domain = getDomain(fqdn); const haproxy = await haproxyInstance(); await checkHAProxy(haproxy); From 58e0757bbd83cbdc0a3d970d2bef0fef26a7ebf1 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 09:50:47 +0100 Subject: [PATCH 4/8] fix: Default npm command --- src/lib/components/templates.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/templates.ts b/src/lib/components/templates.ts index 46998ab10..f09272634 100644 --- a/src/lib/components/templates.ts +++ b/src/lib/components/templates.ts @@ -1,7 +1,7 @@ function defaultBuildAndDeploy(packageManager) { return { installCommand: - packageManager === 'npm' ? `${packageManager} run install` : `${packageManager} install`, + packageManager === 'npm' ? `${packageManager} install` : `${packageManager} install`, buildCommand: packageManager === 'npm' ? `${packageManager} run build` : `${packageManager} build`, startCommand: From 49e58b39f5b8f350596f4032103335c2ccf33560 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 09:57:36 +0100 Subject: [PATCH 5/8] chore: version++ --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 616f39f29..81ea664eb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "coolify", "description": "An open-source & self-hostable Heroku / Netlify alternative.", - "version": "2.0.22", + "version": "2.0.23", "license": "AGPL-3.0", "scripts": { "dev": "docker-compose -f docker-compose-dev.yaml up -d && NODE_ENV=development svelte-kit dev --host 0.0.0.0", From 59a86b25fc959d89902a0f2806c7f9c95b49ec90 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 10:00:09 +0100 Subject: [PATCH 6/8] UI: Application start --- src/routes/applications/[id]/__layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/applications/[id]/__layout.svelte b/src/routes/applications/[id]/__layout.svelte index e95f95d05..c803bf515 100644 --- a/src/routes/applications/[id]/__layout.svelte +++ b/src/routes/applications/[id]/__layout.svelte @@ -182,7 +182,7 @@ title="Build and start application" type="submit" disabled={!$session.isAdmin} - class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 hover:bg-green-600 hover:text-white" + class="icons bg-transparent tooltip-bottom text-sm flex items-center space-x-2 text-green-500" data-tooltip={$session.isAdmin ? 'Build and start application' : 'You do not have permission to Build and start application.'} From 160412f6e49854ce7815b8a0b00f6c70fa44020d Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 10:09:34 +0100 Subject: [PATCH 7/8] fix: Add coolify-image label for build images --- src/lib/buildPacks/gatsby.ts | 1 + src/lib/buildPacks/nestjs.ts | 1 + src/lib/buildPacks/nextjs.ts | 1 + src/lib/buildPacks/node.ts | 1 + src/lib/buildPacks/nuxtjs.ts | 1 + src/lib/buildPacks/php.ts | 1 + src/lib/buildPacks/react.ts | 1 + src/lib/buildPacks/rust.ts | 1 + src/lib/buildPacks/static.ts | 1 + src/lib/buildPacks/svelte.ts | 1 + src/lib/buildPacks/vuejs.ts | 1 + src/lib/docker.ts | 1 + 12 files changed, 12 insertions(+) diff --git a/src/lib/buildPacks/gatsby.ts b/src/lib/buildPacks/gatsby.ts index fd1495995..9f2685ff0 100644 --- a/src/lib/buildPacks/gatsby.ts +++ b/src/lib/buildPacks/gatsby.ts @@ -7,6 +7,7 @@ const createDockerfile = async (data, imageforBuild): Promise => { Dockerfile.push(`FROM ${imageforBuild}`); Dockerfile.push('WORKDIR /usr/share/nginx/html'); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/src/app/${publishDirectory} ./`); Dockerfile.push(`EXPOSE 80`); Dockerfile.push('CMD ["nginx", "-g", "daemon off;"]'); diff --git a/src/lib/buildPacks/nestjs.ts b/src/lib/buildPacks/nestjs.ts index 0a8bf9f38..38ef3bce1 100644 --- a/src/lib/buildPacks/nestjs.ts +++ b/src/lib/buildPacks/nestjs.ts @@ -7,6 +7,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push( `COPY --from=${applicationId}:${tag}-cache /usr/src/app/${baseDirectory || ''} ./` ); diff --git a/src/lib/buildPacks/nextjs.ts b/src/lib/buildPacks/nextjs.ts index 648208d83..15e6dacca 100644 --- a/src/lib/buildPacks/nextjs.ts +++ b/src/lib/buildPacks/nextjs.ts @@ -16,6 +16,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); + Dockerfile.push(`LABEL coolify.image=true`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/node.ts b/src/lib/buildPacks/node.ts index 648208d83..15e6dacca 100644 --- a/src/lib/buildPacks/node.ts +++ b/src/lib/buildPacks/node.ts @@ -16,6 +16,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); + Dockerfile.push(`LABEL coolify.image=true`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/nuxtjs.ts b/src/lib/buildPacks/nuxtjs.ts index 648208d83..15e6dacca 100644 --- a/src/lib/buildPacks/nuxtjs.ts +++ b/src/lib/buildPacks/nuxtjs.ts @@ -16,6 +16,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); + Dockerfile.push(`LABEL coolify.image=true`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/php.ts b/src/lib/buildPacks/php.ts index 9bb345dec..64ac6a141 100644 --- a/src/lib/buildPacks/php.ts +++ b/src/lib/buildPacks/php.ts @@ -6,6 +6,7 @@ const createDockerfile = async (data, image): Promise => { const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push('RUN a2enmod rewrite'); Dockerfile.push('WORKDIR /var/www/html'); Dockerfile.push(`COPY ./${baseDirectory || ''} /var/www/html`); diff --git a/src/lib/buildPacks/react.ts b/src/lib/buildPacks/react.ts index 859544281..5db9c33b2 100644 --- a/src/lib/buildPacks/react.ts +++ b/src/lib/buildPacks/react.ts @@ -6,6 +6,7 @@ const createDockerfile = async (data, image): Promise => { const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push('WORKDIR /usr/share/nginx/html'); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/src/app/${publishDirectory} ./`); Dockerfile.push(`EXPOSE 80`); diff --git a/src/lib/buildPacks/rust.ts b/src/lib/buildPacks/rust.ts index 0af47c44c..49eb59815 100644 --- a/src/lib/buildPacks/rust.ts +++ b/src/lib/buildPacks/rust.ts @@ -8,6 +8,7 @@ const createDockerfile = async (data, image, name): Promise => { const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/src/app'); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/src/app/target target`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/local/cargo /usr/local/cargo`); Dockerfile.push(`COPY . .`); diff --git a/src/lib/buildPacks/static.ts b/src/lib/buildPacks/static.ts index d71eea6e1..f9fa4ee96 100644 --- a/src/lib/buildPacks/static.ts +++ b/src/lib/buildPacks/static.ts @@ -16,6 +16,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/share/nginx/html'); + Dockerfile.push(`LABEL coolify.image=true`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/svelte.ts b/src/lib/buildPacks/svelte.ts index 9a730eb63..3ce957a1b 100644 --- a/src/lib/buildPacks/svelte.ts +++ b/src/lib/buildPacks/svelte.ts @@ -7,6 +7,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/share/nginx/html'); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/src/app/${publishDirectory} ./`); Dockerfile.push(`EXPOSE 80`); Dockerfile.push('CMD ["nginx", "-g", "daemon off;"]'); diff --git a/src/lib/buildPacks/vuejs.ts b/src/lib/buildPacks/vuejs.ts index 859544281..f88f4ac2a 100644 --- a/src/lib/buildPacks/vuejs.ts +++ b/src/lib/buildPacks/vuejs.ts @@ -7,6 +7,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /usr/share/nginx/html'); + Dockerfile.push(`LABEL coolify.image=true`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/src/app/${publishDirectory} ./`); Dockerfile.push(`EXPOSE 80`); Dockerfile.push('CMD ["nginx", "-g", "daemon off;"]'); diff --git a/src/lib/docker.ts b/src/lib/docker.ts index b3cf89e37..477491f12 100644 --- a/src/lib/docker.ts +++ b/src/lib/docker.ts @@ -19,6 +19,7 @@ export async function buildCacheImageWithNode(data, imageForBuild) { const Dockerfile: Array = []; Dockerfile.push(`FROM ${imageForBuild}`); Dockerfile.push('WORKDIR /usr/src/app'); + Dockerfile.push(`LABEL coolify.image=true`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { From 88b3910d804283d988baf2f76c95bcbc5c997102 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 28 Feb 2022 10:12:04 +0100 Subject: [PATCH 8/8] fix: Cleanup old images, > 3 days --- src/lib/queues/cleanup.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib/queues/cleanup.ts b/src/lib/queues/cleanup.ts index dded603f9..981173a31 100644 --- a/src/lib/queues/cleanup.ts +++ b/src/lib/queues/cleanup.ts @@ -36,7 +36,7 @@ export default async function () { console.log(error); } if (!dev) { - //Cleanup images that are not managed by coolify + // Cleanup images that are not managed by coolify try { await asyncExecShell( `DOCKER_HOST=${host} docker image prune --filter 'label!=coolify.image=true' -a -f` @@ -44,12 +44,12 @@ export default async function () { } catch (error) { console.log(error); } - } - // Cleanup dangling images - try { - await asyncExecShell(`DOCKER_HOST=${host} docker image prune -f`); - } catch (error) { - console.log(error); + // Cleanup old images >3 days + try { + await asyncExecShell(`DOCKER_HOST=${host} docker image prune --filter "until=72h" -a -f`); + } catch (error) { + console.log(error); + } } } }