From 46d84eaa71895226c97e37f4776a6d4e18658804 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon, 30 Jun 2025 01:38:39 -0600 Subject: [PATCH] feat: implement volume restoration functionality - Added a new restoreVolume function to facilitate the restoration of Docker volumes from backups. - Integrated service type handling for both application and compose, ensuring proper scaling and management of services during restoration. - Enhanced command generation for restoring volumes, improving clarity and maintainability of the logic. --- .../server/src/utils/volume-backups/utils.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/packages/server/src/utils/volume-backups/utils.ts b/packages/server/src/utils/volume-backups/utils.ts index e29363bad..66a81cea1 100644 --- a/packages/server/src/utils/volume-backups/utils.ts +++ b/packages/server/src/utils/volume-backups/utils.ts @@ -62,3 +62,48 @@ const backupVolume = async ( `; } }; + +export const restoreVolume = async ( + volumeBackup: Awaited>, +) => { + const { serviceType, volumeName } = volumeBackup; + + const baseCommand = ` + docker volume rm ${volumeName} --force +docker run --rm \ +-v ${volumeName}:/volume_data \ +-v $(pwd):/backup \ +ubuntu \ +bash -c "cd /volume_data && tar xvf /backup/${volumeName}.tar ." + `; + + if (serviceType === "application") { + return ` + docker service scale ${volumeBackup.application?.appName}=0 + ${baseCommand} + ACTUAL_REPLICAS=$(docker service inspect ${volumeBackup.application?.appName} --format "{{.Spec.Mode.Replicated.Replicas}}") + docker service scale ${volumeBackup.application?.appName}=$ACTUAL_REPLICAS + `; + } + + if (serviceType === "compose") { + const compose = await findComposeById( + volumeBackup.compose?.composeId || "", + ); + + if (compose.composeType === "stack") { + return ` + ACTUAL_REPLICAS=$(docker service inspect ${compose.appName}_${volumeBackup.serviceName} --format "{{.Spec.Mode.Replicated.Replicas}}") + docker service scale ${compose.appName}_${volumeBackup.serviceName}=0 + ${baseCommand} + docker service scale ${compose.appName}_${volumeBackup.serviceName}=$ACTUAL_REPLICAS + `; + } + return ` + ID=$(docker ps -q --filter "label=com.docker.compose.project=${compose.appName}" --filter "label=com.docker.compose.service=${volumeBackup.serviceName}") + docker stop $ID + ${baseCommand} + docker start $ID + `; + } +};