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 + `; + } +};