From ae4942ba29877f286d68245f3ca0a177f1b8a472 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 6 Apr 2022 19:17:28 +0200 Subject: [PATCH] feat: Able to change service version/tag --- src/lib/components/common.ts | 139 ++++++++++++++++++ src/lib/database/common.ts | 132 +---------------- src/lib/haproxy/configuration.ts | 3 +- src/lib/letsencrypt/index.ts | 3 +- .../databases/[id]/configuration/type.json.ts | 3 +- .../[id]/configuration/version.json.ts | 3 +- .../services/[id]/_Services/_Services.svelte | 17 ++- .../services/[id]/configuration/type.json.ts | 3 +- .../[id]/configuration/version.json.ts | 4 +- .../[id]/configuration/version.svelte | 24 ++- 10 files changed, 193 insertions(+), 138 deletions(-) diff --git a/src/lib/components/common.ts b/src/lib/components/common.ts index f6d0f232c..f8c28cdb2 100644 --- a/src/lib/components/common.ts +++ b/src/lib/components/common.ts @@ -43,3 +43,142 @@ export function changeQueryParams(buildId) { queryParams.set('buildId', buildId); return history.pushState(null, null, '?' + queryParams.toString()); } + +export const supportedDatabaseTypesAndVersions = [ + { + name: 'mongodb', + fancyName: 'MongoDB', + baseImage: 'bitnami/mongodb', + versions: ['5.0.5', '4.4.11', '4.2.18', '4.0.27'] + }, + { name: 'mysql', fancyName: 'MySQL', baseImage: 'bitnami/mysql', versions: ['8.0.27', '5.7.36'] }, + { + name: 'postgresql', + fancyName: 'PostgreSQL', + baseImage: 'bitnami/postgresql', + versions: ['14.1.0', '13.5.0', '12.9.0', '11.14.0', '10.19.0', '9.6.24'] + }, + { + name: 'redis', + fancyName: 'Redis', + baseImage: 'bitnami/redis', + versions: ['6.2.6', '6.0.16', '5.0.14'] + }, + { name: 'couchdb', fancyName: 'CouchDB', baseImage: 'bitnami/couchdb', versions: ['3.2.1'] } +]; +export const supportedServiceTypesAndVersions = [ + { + name: 'plausibleanalytics', + fancyName: 'Plausible Analytics', + baseImage: 'plausible/analytics', + images: ['bitnami/postgresql:13.2.0', 'yandex/clickhouse-server:21.3.2.5'], + versions: ['latest', 'stable'], + recommendedVersion: 'stable', + ports: { + main: 8000 + } + }, + { + name: 'nocodb', + fancyName: 'NocoDB', + baseImage: 'nocodb/nocodb', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 8080 + } + }, + { + name: 'minio', + fancyName: 'MinIO', + baseImage: 'minio/minio', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 9001 + } + }, + { + name: 'vscodeserver', + fancyName: 'VSCode Server', + baseImage: 'codercom/code-server', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 8080 + } + }, + { + name: 'wordpress', + fancyName: 'Wordpress', + baseImage: 'wordpress', + images: ['bitnami/mysql:5.7'], + versions: ['latest', 'php8.1', 'php8.0', 'php7.4', 'php7.3'], + recommendedVersion: 'latest', + ports: { + main: 80 + } + }, + { + name: 'vaultwarden', + fancyName: 'Vaultwarden', + baseImage: 'vaultwarden/server', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 80 + } + }, + { + name: 'languagetool', + fancyName: 'LanguageTool', + baseImage: 'silviof/docker-languagetool', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 8010 + } + }, + { + name: 'n8n', + fancyName: 'n8n', + baseImage: 'n8nio/n8n', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 5678 + } + }, + { + name: 'uptimekuma', + fancyName: 'Uptime Kuma', + baseImage: 'louislam/uptime-kuma', + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 3001 + } + }, + { + name: 'ghost', + fancyName: 'Ghost', + baseImage: 'bitnami/ghost', + images: ['bitnami/mariadb'], + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 2368 + } + }, + { + name: 'meilisearch', + fancyName: 'Meilisearch', + baseImage: 'getmeili/meilisearch', + images: [], + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 7700 + } + } +]; diff --git a/src/lib/database/common.ts b/src/lib/database/common.ts index 75366dbc9..287dcd834 100644 --- a/src/lib/database/common.ts +++ b/src/lib/database/common.ts @@ -1,5 +1,9 @@ import { dev } from '$app/env'; import { sentry } from '$lib/common'; +import { + supportedDatabaseTypesAndVersions, + supportedServiceTypesAndVersions +} from '$lib/components/common'; import * as Prisma from '@prisma/client'; import { default as ProdPrisma } from '@prisma/client'; import type { PrismaClientOptions } from '@prisma/client/runtime'; @@ -82,134 +86,6 @@ export async function generateSshKeyPair(): Promise<{ publicKey: string; private }); } -export const supportedDatabaseTypesAndVersions = [ - { - name: 'mongodb', - fancyName: 'MongoDB', - baseImage: 'bitnami/mongodb', - versions: ['5.0.5', '4.4.11', '4.2.18', '4.0.27'] - }, - { name: 'mysql', fancyName: 'MySQL', baseImage: 'bitnami/mysql', versions: ['8.0.27', '5.7.36'] }, - { - name: 'postgresql', - fancyName: 'PostgreSQL', - baseImage: 'bitnami/postgresql', - versions: ['14.1.0', '13.5.0', '12.9.0', '11.14.0', '10.19.0', '9.6.24'] - }, - { - name: 'redis', - fancyName: 'Redis', - baseImage: 'bitnami/redis', - versions: ['6.2.6', '6.0.16', '5.0.14'] - }, - { name: 'couchdb', fancyName: 'CouchDB', baseImage: 'bitnami/couchdb', versions: ['3.2.1'] } -]; -export const supportedServiceTypesAndVersions = [ - { - name: 'plausibleanalytics', - fancyName: 'Plausible Analytics', - baseImage: 'plausible/analytics', - images: ['bitnami/postgresql:13.2.0', 'yandex/clickhouse-server:21.3.2.5'], - versions: ['latest', 'stable'], - ports: { - main: 8000 - } - }, - { - name: 'nocodb', - fancyName: 'NocoDB', - baseImage: 'nocodb/nocodb', - versions: ['latest'], - ports: { - main: 8080 - } - }, - { - name: 'minio', - fancyName: 'MinIO', - baseImage: 'minio/minio', - versions: ['latest'], - ports: { - main: 9001 - } - }, - { - name: 'vscodeserver', - fancyName: 'VSCode Server', - baseImage: 'codercom/code-server', - versions: ['latest'], - ports: { - main: 8080 - } - }, - { - name: 'wordpress', - fancyName: 'Wordpress', - baseImage: 'wordpress', - images: ['bitnami/mysql:5.7'], - versions: ['latest', 'php8.1', 'php8.0', 'php7.4', 'php7.3'], - ports: { - main: 80 - } - }, - { - name: 'vaultwarden', - fancyName: 'Vaultwarden', - baseImage: 'vaultwarden/server', - versions: ['latest'], - ports: { - main: 80 - } - }, - { - name: 'languagetool', - fancyName: 'LanguageTool', - baseImage: 'silviof/docker-languagetool', - versions: ['latest'], - ports: { - main: 8010 - } - }, - { - name: 'n8n', - fancyName: 'n8n', - baseImage: 'n8nio/n8n', - versions: ['latest'], - ports: { - main: 5678 - } - }, - { - name: 'uptimekuma', - fancyName: 'Uptime Kuma', - baseImage: 'louislam/uptime-kuma', - versions: ['latest'], - ports: { - main: 3001 - } - }, - { - name: 'ghost', - fancyName: 'Ghost', - baseImage: 'bitnami/ghost', - images: ['bitnami/mariadb'], - versions: ['latest'], - ports: { - main: 2368 - } - }, - { - name: 'meilisearch', - fancyName: 'Meilisearch', - baseImage: 'getmeili/meilisearch', - images: [], - versions: ['latest'], - ports: { - main: 7700 - } - } -]; - export function getVersions(type) { const found = supportedDatabaseTypesAndVersions.find((t) => t.name === type); if (found) { diff --git a/src/lib/haproxy/configuration.ts b/src/lib/haproxy/configuration.ts index a7f223e0e..831d9490b 100644 --- a/src/lib/haproxy/configuration.ts +++ b/src/lib/haproxy/configuration.ts @@ -6,6 +6,7 @@ import crypto from 'crypto'; import * as db from '$lib/database'; import { checkContainer, checkHAProxy } from '.'; import { asyncExecShell, getDomain, getEngine } from '$lib/common'; +import { supportedServiceTypesAndVersions } from '$lib/components/common'; const url = dev ? 'http://localhost:5555' : 'http://coolify-haproxy:5555'; @@ -223,7 +224,7 @@ export async function configureHAProxy() { const { fqdn, id, type, destinationDocker, destinationDockerId, updatedAt } = service; if (destinationDockerId) { const { engine } = destinationDocker; - const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type); + const found = supportedServiceTypesAndVersions.find((a) => a.name === type); if (found) { const port = found.ports.main; const publicPort = service[type]?.publicPort; diff --git a/src/lib/letsencrypt/index.ts b/src/lib/letsencrypt/index.ts index eb74aa252..c9f9c037b 100644 --- a/src/lib/letsencrypt/index.ts +++ b/src/lib/letsencrypt/index.ts @@ -4,6 +4,7 @@ import * as db from '$lib/database'; import { dev } from '$app/env'; import cuid from 'cuid'; import getPort, { portNumbers } from 'get-port'; +import { supportedServiceTypesAndVersions } from '$lib/components/common'; export async function letsEncrypt(domain, id = null, isCoolify = false) { try { @@ -160,7 +161,7 @@ export async function generateSSLCerts() { type, destinationDocker: { engine } } = service; - const found = db.supportedServiceTypesAndVersions.find((a) => a.name === type); + const found = supportedServiceTypesAndVersions.find((a) => a.name === type); if (found) { const domain = getDomain(fqdn); const isHttps = fqdn.startsWith('https://'); diff --git a/src/routes/databases/[id]/configuration/type.json.ts b/src/routes/databases/[id]/configuration/type.json.ts index 6f797e415..8ab007891 100644 --- a/src/routes/databases/[id]/configuration/type.json.ts +++ b/src/routes/databases/[id]/configuration/type.json.ts @@ -1,6 +1,7 @@ import { getUserDetails } from '$lib/common'; +import { supportedDatabaseTypesAndVersions } from '$lib/components/common'; import * as db from '$lib/database'; -import { ErrorHandler, supportedDatabaseTypesAndVersions } from '$lib/database'; +import { ErrorHandler } from '$lib/database'; import type { RequestHandler } from '@sveltejs/kit'; export const get: RequestHandler = async (event) => { diff --git a/src/routes/databases/[id]/configuration/version.json.ts b/src/routes/databases/[id]/configuration/version.json.ts index 3477d832d..000717016 100644 --- a/src/routes/databases/[id]/configuration/version.json.ts +++ b/src/routes/databases/[id]/configuration/version.json.ts @@ -1,6 +1,7 @@ import { getUserDetails } from '$lib/common'; +import { supportedDatabaseTypesAndVersions } from '$lib/components/common'; import * as db from '$lib/database'; -import { ErrorHandler, supportedDatabaseTypesAndVersions } from '$lib/database'; +import { ErrorHandler } from '$lib/database'; import type { RequestHandler } from '@sveltejs/kit'; export const get: RequestHandler = async (event) => { diff --git a/src/routes/services/[id]/_Services/_Services.svelte b/src/routes/services/[id]/_Services/_Services.svelte index a36feb047..637944b65 100644 --- a/src/routes/services/[id]/_Services/_Services.svelte +++ b/src/routes/services/[id]/_Services/_Services.svelte @@ -92,7 +92,22 @@ /> - +
+ + + +
diff --git a/src/routes/services/[id]/configuration/type.json.ts b/src/routes/services/[id]/configuration/type.json.ts index daf1cc71a..42c5344e6 100644 --- a/src/routes/services/[id]/configuration/type.json.ts +++ b/src/routes/services/[id]/configuration/type.json.ts @@ -1,6 +1,7 @@ import { getUserDetails } from '$lib/common'; +import { supportedServiceTypesAndVersions } from '$lib/components/common'; import * as db from '$lib/database'; -import { ErrorHandler, supportedServiceTypesAndVersions } from '$lib/database'; +import { ErrorHandler } from '$lib/database'; import type { RequestHandler } from '@sveltejs/kit'; export const get: RequestHandler = async (event) => { diff --git a/src/routes/services/[id]/configuration/version.json.ts b/src/routes/services/[id]/configuration/version.json.ts index f1a1a9522..bf93e167b 100644 --- a/src/routes/services/[id]/configuration/version.json.ts +++ b/src/routes/services/[id]/configuration/version.json.ts @@ -1,6 +1,7 @@ import { getUserDetails } from '$lib/common'; +import { supportedServiceTypesAndVersions } from '$lib/components/common'; import * as db from '$lib/database'; -import { ErrorHandler, supportedServiceTypesAndVersions } from '$lib/database'; +import { ErrorHandler } from '$lib/database'; import type { RequestHandler } from '@sveltejs/kit'; export const get: RequestHandler = async (event) => { @@ -14,6 +15,7 @@ export const get: RequestHandler = async (event) => { return { status: 200, body: { + type, versions: supportedServiceTypesAndVersions.find((name) => name.name === type).versions } }; diff --git a/src/routes/services/[id]/configuration/version.svelte b/src/routes/services/[id]/configuration/version.svelte index 5f2930487..bda5bb46c 100644 --- a/src/routes/services/[id]/configuration/version.svelte +++ b/src/routes/services/[id]/configuration/version.svelte @@ -31,11 +31,16 @@ import { errorNotification } from '$lib/form'; import { goto } from '$app/navigation'; import { post } from '$lib/api'; + import { supportedServiceTypesAndVersions } from '$lib/components/common'; const { id } = $page.params; const from = $page.url.searchParams.get('from'); export let versions; + export let type; + let recommendedVersion = supportedServiceTypesAndVersions.find( + ({ name }) => name === type + )?.recommendedVersion; async function handleSubmit(version) { try { await post(`/services/${id}/configuration/version.json`, { version }); @@ -49,13 +54,26 @@
Select a Service version
- +{#if from} +
+ Warning: you are about to change the version of this service.
This could cause problem + after you restart the service, + like losing your data, incompatibility issues, etc.
Only do if you know what you are doing. +
+{/if}
{#each versions as version}
handleSubmit(version)}> - {version} + {#if recommendedVersion === version} + recommended + {/if}