diff --git a/apps/api/src/lib/services/common.ts b/apps/api/src/lib/services/common.ts index b627eb5bb..716dc44c0 100644 --- a/apps/api/src/lib/services/common.ts +++ b/apps/api/src/lib/services/common.ts @@ -20,7 +20,7 @@ export const includeServices: any = { glitchTip: true, searxng: true, weblate: true, - taiga: true + taiga: true, }; export async function configureServiceType({ id, @@ -350,13 +350,6 @@ export async function configureServiceType({ } } }); - } else if (type === 'grafana') { - await prisma.service.update({ - where: { id }, - data: { - type - } - }); } else { await prisma.service.update({ where: { id }, @@ -385,6 +378,6 @@ export async function removeService({ id }: { id: string }): Promise { await prisma.searxng.deleteMany({ where: { serviceId: id } }); await prisma.weblate.deleteMany({ where: { serviceId: id } }); await prisma.taiga.deleteMany({ where: { serviceId: id } }); - + await prisma.service.delete({ where: { id } }); } \ No newline at end of file diff --git a/apps/api/src/lib/services/handlers.ts b/apps/api/src/lib/services/handlers.ts index cc6646737..227383f9a 100644 --- a/apps/api/src/lib/services/handlers.ts +++ b/apps/api/src/lib/services/handlers.ts @@ -73,6 +73,10 @@ export async function startService(request: FastifyRequest) { if (type === 'grafana') { return await startGrafanaService(request) } + if (type === 'trilium') { + return await startTriliumService(request) + } + throw `Service type ${type} not supported.` } catch (error) { throw { status: 500, message: error?.message || error } @@ -904,8 +908,8 @@ async function startMeilisearchService(request: FastifyRequest const { meiliSearch: { masterKey } } = service; - const { type, version, destinationDockerId, destinationDocker, serviceSecret, exposePort, persistentStorage } = - service; + const { type, version, destinationDockerId, destinationDocker, + serviceSecret, exposePort, persistentStorage } = service; const network = destinationDockerId && destinationDocker.network; const port = getServiceMainPort('meilisearch'); @@ -2698,6 +2702,60 @@ async function startGrafanaService(request: FastifyRequest) { return errorHandler({ status, message }) } } +async function startTriliumService(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('trilium'); + + const { workdir } = await createDirectories({ repository: type, buildId: id }); + const image = getServiceImage(type); + + const config = { + trilium: { + image: `${image}:${version}`, + volumes: [`${id}-trilium:/home/node/trilium-data`], + environmentVariables: {} + } + }; + if (serviceSecret.length > 0) { + serviceSecret.forEach((secret) => { + config.trilium.environmentVariables[secret.name] = secret.value; + }); + } + const { volumeMounts } = persistentVolumes(id, persistentStorage, config) + const composeFile: ComposeFile = { + version: '3.8', + services: { + [id]: { + container_name: id, + image: config.trilium.image, + volumes: config.trilium.volumes, + environment: config.trilium.environmentVariables, + ...(exposePort ? { ports: [`${exposePort}:${port}`] } : {}), + labels: makeLabelForServices('trilium'), + ...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 }) + } +} export async function migrateAppwriteDB(request: FastifyRequest, reply: FastifyReply) { try { diff --git a/apps/api/src/lib/services/supportedVersions.ts b/apps/api/src/lib/services/supportedVersions.ts index 9ad5ce783..526f49379 100644 --- a/apps/api/src/lib/services/supportedVersions.ts +++ b/apps/api/src/lib/services/supportedVersions.ts @@ -172,7 +172,7 @@ export const supportedServiceTypesAndVersions = [ fancyName: 'Appwrite', baseImage: 'appwrite/appwrite', images: ['mariadb:10.7', 'redis:6.2-alpine', 'appwrite/telegraf:1.4.0'], - versions: ['latest', '1.0','0.15.3'], + versions: ['latest', '1.0', '0.15.3'], recommendedVersion: '1.0', ports: { main: 80 @@ -244,4 +244,15 @@ export const supportedServiceTypesAndVersions = [ main: 3000 } }, + { + name: 'trilium', + fancyName: 'Trilium Notes', + baseImage: 'zadam/trilium', + images: [], + versions: ['latest'], + recommendedVersion: 'latest', + ports: { + main: 8080 + } + }, ]; \ No newline at end of file diff --git a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte index 6daf5bc97..a4a515689 100644 --- a/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte +++ b/apps/ui/src/lib/components/svg/services/ServiceIcons.svelte @@ -44,4 +44,6 @@ {:else if type === 'grafana'} -{/if} \ No newline at end of file +{:else if type === 'trilium'} + +{/if} diff --git a/apps/ui/src/lib/components/svg/services/Trilium.svelte b/apps/ui/src/lib/components/svg/services/Trilium.svelte new file mode 100644 index 000000000..2bd749f44 --- /dev/null +++ b/apps/ui/src/lib/components/svg/services/Trilium.svelte @@ -0,0 +1,9 @@ + + +trilium logo diff --git a/apps/ui/src/lib/components/svg/services/index.ts b/apps/ui/src/lib/components/svg/services/index.ts index 4c62fd549..5f3bf2b10 100644 --- a/apps/ui/src/lib/components/svg/services/index.ts +++ b/apps/ui/src/lib/components/svg/services/index.ts @@ -18,4 +18,5 @@ 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'; -export { default as Grafana } from './Grafana.svelte'; \ No newline at end of file +export { default as Grafana } from './Grafana.svelte'; +export { default as Trilium } from './Trilium.svelte' diff --git a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte index e29df196f..32f45f27f 100644 --- a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte +++ b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte @@ -79,4 +79,8 @@ +{:else if service.type === 'trilium'} + + + {/if} diff --git a/apps/ui/static/trilium.png b/apps/ui/static/trilium.png new file mode 100644 index 000000000..249aceef3 Binary files /dev/null and b/apps/ui/static/trilium.png differ