feat: Autoupdater

This commit is contained in:
Andras Bacsai
2022-04-25 15:51:43 +02:00
parent 11d74c0c1f
commit c1a48dcf1e
4 changed files with 43 additions and 37 deletions

View File

@@ -304,7 +304,7 @@
"coolify_proxy_settings": "Coolify Proxy Settings", "coolify_proxy_settings": "Coolify Proxy Settings",
"credential_stat_explainer": "Credentials for <a class=\"text-white font-bold\" href=\"{{link}}\" target=\"_blank\">stats</a> page.", "credential_stat_explainer": "Credentials for <a class=\"text-white font-bold\" href=\"{{link}}\" target=\"_blank\">stats</a> page.",
"auto_update_enabled": "Auto update enabled?", "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": { "team": {
"pending_invitations": "Pending invitations", "pending_invitations": "Pending invitations",

View File

@@ -6,34 +6,37 @@ import compare from 'compare-versions';
import { dev } from '$app/env'; import { dev } from '$app/env';
export default async function (): Promise<void> { export default async function (): Promise<void> {
const currentVersion = version; try {
const { isAutoUpdateEnabled } = await prisma.setting.findFirst(); const currentVersion = version;
if (isAutoUpdateEnabled) { const { isAutoUpdateEnabled } = await prisma.setting.findFirst();
const versions = await got if (isAutoUpdateEnabled) {
.get( const versions = await got
`https://get.coollabs.io/versions.json?appId=${process.env['COOLIFY_APP_ID']}&version=${currentVersion}` .get(
) `https://get.coollabs.io/versions.json?appId=${process.env['COOLIFY_APP_ID']}&version=${currentVersion}`
.json(); )
const latestVersion = versions['coolify'].main.version; .json();
const isUpdateAvailable = compare(latestVersion, currentVersion); const latestVersion = versions['coolify'].main.version;
if (isUpdateAvailable === 1) { const isUpdateAvailable = compare(latestVersion, currentVersion);
const activeCount = await buildQueue.getActiveCount(); if (isUpdateAvailable === 1) {
if (activeCount === 0) { const activeCount = await buildQueue.getActiveCount();
if (!dev) { if (activeCount === 0) {
console.log('Updating...'); if (!dev) {
await asyncExecShell(`docker pull coollabsio/coolify:${latestVersion}`); await buildQueue.pause();
await asyncExecShell(`env | grep COOLIFY > .env`); console.log(`Updating Coolify to ${latestVersion}.`);
await asyncExecShell( await asyncExecShell(`docker pull coollabsio/coolify:${latestVersion}`);
`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"` await asyncExecShell(`env | grep COOLIFY > .env`);
); await asyncExecShell(
} else { `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"`
console.log('Updating (not really in dev mode).'); );
} else {
await buildQueue.pause();
console.log('Updating (not really in dev mode).');
}
} }
} }
} else {
console.log('No update available.');
} }
} else { } catch (error) {
console.log('Auto update is disabled.'); await buildQueue.resume();
console.log(error);
} }
} }

View File

@@ -130,6 +130,9 @@ const buildWorker = new Worker(buildQueueName, async (job) => await builder(job)
concurrency: 1, concurrency: 1,
...connectionOptions ...connectionOptions
}); });
buildQueue.resume().catch((err) => {
console.log('Build queue failed to resume!', err);
});
buildWorker.on('completed', async (job: Bullmq.Job) => { buildWorker.on('completed', async (job: Bullmq.Job) => {
try { try {
@@ -138,7 +141,6 @@ buildWorker.on('completed', async (job: Bullmq.Job) => {
setTimeout(async () => { setTimeout(async () => {
await prisma.build.update({ where: { id: job.data.build_id }, data: { status: 'success' } }); await prisma.build.update({ where: { id: job.data.build_id }, data: { status: 'success' } });
}, 1234); }, 1234);
console.log(error);
} finally { } finally {
const workdir = `/tmp/build-sources/${job.data.repository}/${job.data.build_id}`; const workdir = `/tmp/build-sources/${job.data.repository}/${job.data.build_id}`;
if (!dev) await asyncExecShell(`rm -fr ${workdir}`); if (!dev) await asyncExecShell(`rm -fr ${workdir}`);
@@ -154,7 +156,6 @@ buildWorker.on('failed', async (job: Bullmq.Job, failedReason) => {
setTimeout(async () => { setTimeout(async () => {
await prisma.build.update({ where: { id: job.data.build_id }, data: { status: 'failed' } }); await prisma.build.update({ where: { id: job.data.build_id }, data: { status: 'failed' } });
}, 1234); }, 1234);
console.log(error);
} finally { } finally {
const workdir = `/tmp/build-sources/${job.data.repository}`; const workdir = `/tmp/build-sources/${job.data.repository}`;
if (!dev) await asyncExecShell(`rm -fr ${workdir}`); if (!dev) await asyncExecShell(`rm -fr ${workdir}`);

View File

@@ -194,14 +194,16 @@
on:click={() => changeSettings('isRegistrationEnabled')} on:click={() => changeSettings('isRegistrationEnabled')}
/> />
</div> </div>
<div class="grid grid-cols-2 items-center"> {#if browser && window.location.hostname === 'staging.coolify.io'}
<Setting <div class="grid grid-cols-2 items-center">
bind:setting={isAutoUpdateEnabled} <Setting
title={$t('setting.auto_update_enabled')} bind:setting={isAutoUpdateEnabled}
description={$t('setting.auto_update_enabled_explainer')} title={$t('setting.auto_update_enabled')}
on:click={() => changeSettings('isAutoUpdateEnabled')} description={$t('setting.auto_update_enabled_explainer')}
/> on:click={() => changeSettings('isAutoUpdateEnabled')}
</div> />
</div>
{/if}
</div> </div>
</form> </form>
<div class="flex space-x-1 pt-6 font-bold"> <div class="flex space-x-1 pt-6 font-bold">