From c1a48dcf1ea7a47243d2fa4ad86c41308afd6518 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 25 Apr 2022 15:51:43 +0200 Subject: [PATCH] feat: Autoupdater --- src/lib/locales/en.json | 2 +- src/lib/queues/autoUpdater.ts | 55 +++++++++++++++++--------------- src/lib/queues/index.ts | 5 +-- src/routes/settings/index.svelte | 18 ++++++----- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index 573ca00e8..d77d2a1c1 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -304,7 +304,7 @@ "coolify_proxy_settings": "Coolify Proxy Settings", "credential_stat_explainer": "Credentials for stats page.", "auto_update_enabled": "Auto update enabled?", - "auto_update_enabled_explainer": "Enable automatic updates for Coolify." + "auto_update_enabled_explainer": "Enable automatic updates for Coolify. It will be done automatically behind the scenes, if there is no build process running." }, "team": { "pending_invitations": "Pending invitations", diff --git a/src/lib/queues/autoUpdater.ts b/src/lib/queues/autoUpdater.ts index 835010177..4bfb995c7 100644 --- a/src/lib/queues/autoUpdater.ts +++ b/src/lib/queues/autoUpdater.ts @@ -6,34 +6,37 @@ import compare from 'compare-versions'; import { dev } from '$app/env'; export default async function (): Promise { - const currentVersion = version; - const { isAutoUpdateEnabled } = await prisma.setting.findFirst(); - if (isAutoUpdateEnabled) { - const versions = await got - .get( - `https://get.coollabs.io/versions.json?appId=${process.env['COOLIFY_APP_ID']}&version=${currentVersion}` - ) - .json(); - const latestVersion = versions['coolify'].main.version; - const isUpdateAvailable = compare(latestVersion, currentVersion); - if (isUpdateAvailable === 1) { - const activeCount = await buildQueue.getActiveCount(); - if (activeCount === 0) { - if (!dev) { - console.log('Updating...'); - await asyncExecShell(`docker pull coollabsio/coolify:${latestVersion}`); - await asyncExecShell(`env | grep COOLIFY > .env`); - await asyncExecShell( - `docker run --rm -tid --env-file .env -v /var/run/docker.sock:/var/run/docker.sock -v coolify-db coollabsio/coolify:${latestVersion} /bin/sh -c "env | grep COOLIFY > .env && echo 'TAG=${latestVersion}' >> .env && docker stop -t 0 coolify coolify-redis && docker rm coolify coolify-redis && docker compose up -d --force-recreate"` - ); - } else { - console.log('Updating (not really in dev mode).'); + try { + const currentVersion = version; + const { isAutoUpdateEnabled } = await prisma.setting.findFirst(); + if (isAutoUpdateEnabled) { + const versions = await got + .get( + `https://get.coollabs.io/versions.json?appId=${process.env['COOLIFY_APP_ID']}&version=${currentVersion}` + ) + .json(); + const latestVersion = versions['coolify'].main.version; + const isUpdateAvailable = compare(latestVersion, currentVersion); + if (isUpdateAvailable === 1) { + const activeCount = await buildQueue.getActiveCount(); + if (activeCount === 0) { + if (!dev) { + await buildQueue.pause(); + console.log(`Updating Coolify to ${latestVersion}.`); + await asyncExecShell(`docker pull coollabsio/coolify:${latestVersion}`); + await asyncExecShell(`env | grep COOLIFY > .env`); + await asyncExecShell( + `docker run --rm -tid --env-file .env -v /var/run/docker.sock:/var/run/docker.sock -v coolify-db coollabsio/coolify:${latestVersion} /bin/sh -c "env | grep COOLIFY > .env && echo 'TAG=${latestVersion}' >> .env && docker stop -t 0 coolify coolify-redis && docker rm coolify coolify-redis && docker compose up -d --force-recreate"` + ); + } else { + await buildQueue.pause(); + console.log('Updating (not really in dev mode).'); + } } } - } else { - console.log('No update available.'); } - } else { - console.log('Auto update is disabled.'); + } catch (error) { + await buildQueue.resume(); + console.log(error); } } diff --git a/src/lib/queues/index.ts b/src/lib/queues/index.ts index 5f8ebfb11..60097680d 100644 --- a/src/lib/queues/index.ts +++ b/src/lib/queues/index.ts @@ -130,6 +130,9 @@ const buildWorker = new Worker(buildQueueName, async (job) => await builder(job) concurrency: 1, ...connectionOptions }); +buildQueue.resume().catch((err) => { + console.log('Build queue failed to resume!', err); +}); buildWorker.on('completed', async (job: Bullmq.Job) => { try { @@ -138,7 +141,6 @@ buildWorker.on('completed', async (job: Bullmq.Job) => { setTimeout(async () => { await prisma.build.update({ where: { id: job.data.build_id }, data: { status: 'success' } }); }, 1234); - console.log(error); } finally { const workdir = `/tmp/build-sources/${job.data.repository}/${job.data.build_id}`; if (!dev) await asyncExecShell(`rm -fr ${workdir}`); @@ -154,7 +156,6 @@ buildWorker.on('failed', async (job: Bullmq.Job, failedReason) => { setTimeout(async () => { await prisma.build.update({ where: { id: job.data.build_id }, data: { status: 'failed' } }); }, 1234); - console.log(error); } finally { const workdir = `/tmp/build-sources/${job.data.repository}`; if (!dev) await asyncExecShell(`rm -fr ${workdir}`); diff --git a/src/routes/settings/index.svelte b/src/routes/settings/index.svelte index 5040089ba..500fc1943 100644 --- a/src/routes/settings/index.svelte +++ b/src/routes/settings/index.svelte @@ -194,14 +194,16 @@ on:click={() => changeSettings('isRegistrationEnabled')} /> -
- changeSettings('isAutoUpdateEnabled')} - /> -
+ {#if browser && window.location.hostname === 'staging.coolify.io'} +
+ changeSettings('isAutoUpdateEnabled')} + /> +
+ {/if}