diff --git a/apps/api/src/lib.ts b/apps/api/src/lib.ts index c3d29d062..90197e240 100644 --- a/apps/api/src/lib.ts +++ b/apps/api/src/lib.ts @@ -88,15 +88,18 @@ export async function migrateServicesToNewTemplate() { } } } - for (const service of Object.keys(template.services)) { - if (template.services[service].volumes) { - for (const volume of template.services[service].volumes) { + for (const s of Object.keys(template.services)) { + if (service.type === 'plausibleanalytics') { + continue; + } + if (template.services[s].volumes) { + for (const volume of template.services[s].volumes) { const [volumeName, path] = volume.split(':') if (!volumeName.startsWith('/')) { const found = await prisma.servicePersistentStorage.findFirst({ where: { volumeName, serviceId: id } }) if (!found) { await prisma.servicePersistentStorage.create({ - data: { volumeName, path, containerId: service, predefined: true, service: { connect: { id } } } + data: { volumeName, path, containerId: s, predefined: true, service: { connect: { id } } } }); } } @@ -464,9 +467,13 @@ async function createVolumes(service: any, template: any) { for (const s of Object.keys(template.services)) { if (template.services[s].volumes && template.services[s].volumes.length > 0) { for (const volume of template.services[s].volumes) { - const volumeName = volume.split(':')[0] + let volumeName = volume.split(':')[0] const volumePath = volume.split(':')[1] - const volumeService = s + let volumeService = s + if (service.type === 'plausibleanalytics' && service.plausibleAnalytics?.id) { + let volumeId = volumeName.split('-')[0] + volumeName = volumeName.replace(volumeId, service.plausibleAnalytics.id) + } volumes.push(`${volumeName}@@@${volumePath}@@@${volumeService}`) } } diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 4bca464ec..6048da2af 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -1448,7 +1448,8 @@ export async function getServiceFromDB({ persistentStorage: true, serviceSecret: true, serviceSetting: true, - wordpress: true + wordpress: true, + plausibleAnalytics: true, } }); if (!body) { diff --git a/apps/api/src/lib/services/handlers.ts b/apps/api/src/lib/services/handlers.ts index ee6755a76..24a101727 100644 --- a/apps/api/src/lib/services/handlers.ts +++ b/apps/api/src/lib/services/handlers.ts @@ -78,12 +78,28 @@ export async function startService(request: FastifyRequest, fa } } const customVolumes = await prisma.servicePersistentStorage.findMany({ where: { serviceId: id } }) - let volumes = arm ? template.services[s].volumesArm : template.services[s].volumes + let volumes = new Set() + if (arm) { + template.services[s]?.volumesArm && template.services[s].volumesArm.length > 0 && template.services[s].volumesArm.forEach(v => volumes.add(v)) + } else { + template.services[s]?.volumes && template.services[s].volumes.length > 0 && template.services[s].volumes.forEach(v => volumes.add(v)) + } + + // Workaround: old plausible analytics service wrong volume id name + if (service.type === 'plausibleanalytics' && service.plausibleAnalytics?.id) { + let temp = Array.from(volumes) + temp.forEach(a => { + const t = a.replace(service.id, service.plausibleAnalytics.id) + volumes.delete(a) + volumes.add(t) + }) + } + if (customVolumes.length > 0) { for (const customVolume of customVolumes) { const { volumeName, path, containerId } = customVolume - if (volumes && volumes.length > 0 && !volumes.includes(`${volumeName}:${path}`) && containerId === service) { - volumes.push(`${volumeName}:${path}`) + if (volumes && volumes.size > 0 && !volumes.has(`${volumeName}:${path}`) && containerId === service) { + volumes.add(`${volumeName}:${path}`) } } } @@ -96,7 +112,7 @@ export async function startService(request: FastifyRequest, fa image: arm ? template.services[s].imageArm : template.services[s].image, expose: template.services[s].ports, ...(exposePort ? { ports: [`${exposePort}:${exposePort}`] } : {}), - volumes, + volumes: Array.from(volumes), environment: newEnvironments, depends_on: template.services[s]?.depends_on, ulimits: template.services[s]?.ulimits, @@ -141,6 +157,8 @@ export async function startService(request: FastifyRequest, fa const composeFileDestination = `${workdir}/docker-compose.yaml`; await fs.writeFile(composeFileDestination, yaml.dump(composeFile)); await startServiceContainers(fastify, id, teamId, destinationDocker.id, composeFileDestination) + + // Workaround: Stop old minio proxies if (service.type === 'minio') { try { await executeDockerCmd({ diff --git a/apps/ui/src/routes/services/[id]/__layout.svelte b/apps/ui/src/routes/services/[id]/__layout.svelte index e4dfe0d9f..536b8ab75 100644 --- a/apps/ui/src/routes/services/[id]/__layout.svelte +++ b/apps/ui/src/routes/services/[id]/__layout.svelte @@ -102,7 +102,7 @@ async function restartService() { const sure = confirm('Are you sure you want to restart this service?'); if (sure) { - await stopService(); + await stopService(true); await startService(); } } @@ -120,7 +120,27 @@ loading.refreshTemplates = false; } } - async function stopService() { + async function stopService(skip = false) { + if (skip) { + $status.service.initialLoading = true; + $status.service.loading = true; + try { + await post(`/services/${service.id}/stop`, {}); + if (service.type.startsWith('wordpress')) { + await post(`/services/${id}/wordpress/ftp`, { + ftpEnabled: false + }); + service.wordpress?.ftpEnabled && window.location.reload(); + } + } catch (error) { + return errorNotification(error); + } finally { + $status.service.initialLoading = false; + $status.service.loading = false; + await getStatus(); + } + return; + } const sure = confirm($t('database.confirm_stop', { name: service.name })); if (sure) { $status.service.initialLoading = true; @@ -319,7 +339,7 @@ Force Redeploy