From 7df532fa727141c277746f2ad5923faf6c11fd2e Mon Sep 17 00:00:00 2001 From: David Mydlarz Date: Fri, 9 Sep 2022 00:17:47 +0900 Subject: [PATCH] Grafana Dashboard service completed --- apps/api/src/lib/services/common.ts | 7 +++ apps/api/src/lib/services/handlers.ts | 57 ++++++++++++++++++ .../api/src/lib/services/supportedVersions.ts | 11 ++++ .../components/svg/services/Grafana.svelte | 9 +++ .../svg/services/ServiceIcons.svelte | 4 +- .../src/lib/components/svg/services/index.ts | 3 +- .../routes/services/[id]/_ServiceLinks.svelte | 4 ++ apps/ui/static/grafana.png | Bin 0 -> 1118 bytes 8 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 apps/ui/src/lib/components/svg/services/Grafana.svelte create mode 100644 apps/ui/static/grafana.png diff --git a/apps/api/src/lib/services/common.ts b/apps/api/src/lib/services/common.ts index f6174ca69..b627eb5bb 100644 --- a/apps/api/src/lib/services/common.ts +++ b/apps/api/src/lib/services/common.ts @@ -350,6 +350,13 @@ export async function configureServiceType({ } } }); + } else if (type === 'grafana') { + await prisma.service.update({ + where: { id }, + data: { + type + } + }); } else { await prisma.service.update({ where: { id }, diff --git a/apps/api/src/lib/services/handlers.ts b/apps/api/src/lib/services/handlers.ts index 7f13f7219..41ce8e0e7 100644 --- a/apps/api/src/lib/services/handlers.ts +++ b/apps/api/src/lib/services/handlers.ts @@ -69,6 +69,9 @@ export async function startService(request: FastifyRequest) { if (type === 'taiga') { return await startTaigaService(request) } + if (type === 'grafana') { + return await startGrafanaService(request) + } throw `Service type ${type} not supported.` } catch (error) { throw { status: 500, message: error?.message || error } @@ -2590,3 +2593,57 @@ async function startTaigaService(request: FastifyRequest) { } } +async function startGrafanaService(request: FastifyRequest) { + try { + const { id } = request.params; + const teamId = request.user.teamId; + const service = await getServiceFromDB({ id, teamId }); + const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort, persistentStorage } = + service; + const network = destinationDockerId && destinationDocker.network; + const port = getServiceMainPort('grafana'); + + const { workdir } = await createDirectories({ repository: type, buildId: id }); + const image = getServiceImage(type); + + const config = { + grafana: { + image: `${image}:${version}`, + volumes: [`${id}-grafana:/var/lib/grafana`], + environmentVariables: {} + } + }; + if (serviceSecret.length > 0) { + serviceSecret.forEach((secret) => { + config.grafana.environmentVariables[secret.name] = secret.value; + }); + } + const { volumeMounts } = persistentVolumes(id, persistentStorage, config) + const composeFile: ComposeFile = { + version: '3.8', + services: { + [id]: { + container_name: id, + image: config.grafana.image, + volumes: config.grafana.volumes, + environment: config.grafana.environmentVariables, + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), + labels: makeLabelForServices('grafana'), + ...defaultComposeConfiguration(network), + } + }, + networks: { + [network]: { + external: true + } + }, + volumes: volumeMounts + }; + const composeFileDestination = `${workdir}/docker-compose.yaml`; + await fs.writeFile(composeFileDestination, yaml.dump(composeFile)); + await startServiceContainers(destinationDocker.id, composeFileDestination) + return {} + } catch ({ status, message }) { + return errorHandler({ status, message }) + } +} \ No newline at end of file diff --git a/apps/api/src/lib/services/supportedVersions.ts b/apps/api/src/lib/services/supportedVersions.ts index 145d7395b..7539cfc23 100644 --- a/apps/api/src/lib/services/supportedVersions.ts +++ b/apps/api/src/lib/services/supportedVersions.ts @@ -212,4 +212,15 @@ export const supportedServiceTypesAndVersions = [ // main: 80 // } // }, + { + name: 'grafana', + fancyName: 'Grafana Dashboard', + baseImage: 'grafana/grafana', + images: [], + versions: ['latest', '9.1.3', '9.1.2', '9.0.8', '8.3.11', '8.4.11', '8.5.11'], + recommendedVersion: 'latest', + ports: { + main: 3000 + } + }, ]; \ No newline at end of file diff --git a/apps/ui/src/lib/components/svg/services/Grafana.svelte b/apps/ui/src/lib/components/svg/services/Grafana.svelte new file mode 100644 index 000000000..8701f58e7 --- /dev/null +++ b/apps/ui/src/lib/components/svg/services/Grafana.svelte @@ -0,0 +1,9 @@ + + +grafana logo diff --git a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte index 4cc5426b2..6daf5bc97 100644 --- a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte +++ b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte @@ -42,4 +42,6 @@ {:else if type === 'weblate'} -{/if} +{:else if type === 'grafana'} + +{/if} \ No newline at end of file diff --git a/apps/ui/src/lib/components/svg/services/index.ts b/apps/ui/src/lib/components/svg/services/index.ts index 22f7702c9..4c62fd549 100644 --- a/apps/ui/src/lib/components/svg/services/index.ts +++ b/apps/ui/src/lib/components/svg/services/index.ts @@ -17,4 +17,5 @@ export { default as Appwrite } from './Appwrite.svelte'; export { default as Moodle } from './Moodle.svelte'; export { default as GlitchTip } from './GlitchTip.svelte'; export { default as Searxng } from './Searxng.svelte'; -export { default as Weblate } from './Weblate.svelte'; \ No newline at end of file +export { default as Weblate } from './Weblate.svelte'; +export { default as Grafana } from './Grafana.svelte'; \ No newline at end of file diff --git a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte index d68a3eae0..e29df196f 100644 --- a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte +++ b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte @@ -75,4 +75,8 @@ +{:else if service.type === 'grafana'} + + + {/if} diff --git a/apps/ui/static/grafana.png b/apps/ui/static/grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..af2a31715e7af469c53eebf20e0b20c1b8714c9e GIT binary patch literal 1118 zcmV-k1flzhP){=!Pdq2VH zKx+xRrm)jdfn6aGQ5*q6&=?mq6eJN16c8TbDZm?nkf`i@K|(=|k=BAP%NJl0Cs27f zvmVF$m|Z(qjC8c?J2Us5y^on|MiY!*7fb_>HJ}94(jVH^VRcN=WJ4IQ0D?#zgi421 zz$W;5VXP4lcYrx~qVrz~z<5S{F;G-YZvmfxCg4a9ofKXIvGUjiWPEet9UHf#O#EJ! zG5?p5hpv`apeYRBz@rLeJTmcU4G2vzic(KB0gSU=eAU!|kO#JrCB*Qks&OaSkB$Sj`@ zo$A=rFK?aJU73o&?k&V$2Lat(I6$~EG+LB%!gxOQz#fzu;k}i*Z!bZ<@J&i!IUMq0gxA=6D+|??wrn7Q}=9TNv7`F7UnIFo(yc14bsw0%g9#%gGPQsh&_yVpm4eSczCpSpZJNozx}#0 zkQqJ#N2~1`O;gRioTE|Qdp=Z-Jr4HF10ti>y3fp?z!&`f(tT;6dEf{PB^0Sximhvvxf14E> zihL^6boNOwkXW=w-iCWtwh`05tt z89Bt+`pkm8GFDgo`=c5672?)w0zW)A=1D-c-r+sU&z$%75!&byVqaqj7=e~6VxU@j zRGv8(ZeqqDK!piAVd3)fku$ck(;7*D>3l-_R7;+2N49xmc%at`b;)SW0MYFf+}4f7 zwBbCy#~e+de{JRtN|4ifviNPF^x