Merge pull request #5082 from bestmaa/fix/volume-backup-restart

fix(volume-backups): restart services after backup failure
This commit is contained in:
Narciso E. Núñez Arias
2026-08-18 18:40:08 -04:00
committed by GitHub
2 changed files with 141 additions and 16 deletions
@@ -9,6 +9,43 @@ import {
normalizeS3Path,
} from "../backups/utils";
interface RestartSafeBackupCommandOptions {
stopCommand: string;
backupCommand: string;
startCommand: string;
uploadCommand: string;
}
export const createRestartSafeBackupCommand = ({
stopCommand,
backupCommand,
startCommand,
uploadCommand,
}: RestartSafeBackupCommandOptions) => `
${stopCommand}
set +e
(
${backupCommand}
)
DOKPLOY_VOLUME_BACKUP_STATUS=$?
(
set -e
${startCommand}
)
DOKPLOY_VOLUME_RESTART_STATUS=$?
set -e
if [ "$DOKPLOY_VOLUME_BACKUP_STATUS" -ne 0 ]; then
if [ "$DOKPLOY_VOLUME_RESTART_STATUS" -ne 0 ]; then
echo "Service restart also failed with exit code $DOKPLOY_VOLUME_RESTART_STATUS"
fi
exit "$DOKPLOY_VOLUME_BACKUP_STATUS"
fi
if [ "$DOKPLOY_VOLUME_RESTART_STATUS" -ne 0 ]; then
exit "$DOKPLOY_VOLUME_RESTART_STATUS"
fi
${uploadCommand}
`;
export const getVolumeServiceAppName = (
volumeBackup: Awaited<ReturnType<typeof findVolumeBackupById>>,
): string => {
@@ -117,16 +154,20 @@ export const backupVolume = async (
);
if (serviceType === "application") {
return lockWrapper(`
echo "Stopping application to 0 replicas"
ACTUAL_REPLICAS=$(docker service inspect ${volumeBackup.application?.appName} --format "{{.Spec.Mode.Replicated.Replicas}}")
echo "Actual replicas: $ACTUAL_REPLICAS"
docker service update --replicas=0 ${volumeBackup.application?.appName}
${backupCommand}
echo "Starting application to $ACTUAL_REPLICAS replicas"
docker service update --replicas=$ACTUAL_REPLICAS --with-registry-auth ${volumeBackup.application?.appName}
${uploadCommand}
`);
return lockWrapper(
createRestartSafeBackupCommand({
stopCommand: `
echo "Stopping application to 0 replicas"
ACTUAL_REPLICAS=$(docker service inspect ${volumeBackup.application?.appName} --format "{{.Spec.Mode.Replicated.Replicas}}")
echo "Actual replicas: $ACTUAL_REPLICAS"
docker service update --replicas=0 ${volumeBackup.application?.appName}`,
backupCommand,
startCommand: `
echo "Starting application to $ACTUAL_REPLICAS replicas"
docker service update --replicas=$ACTUAL_REPLICAS --with-registry-auth ${volumeBackup.application?.appName}`,
uploadCommand,
}),
);
}
if (serviceType === "compose") {
const compose = await findComposeById(
@@ -158,11 +199,13 @@ export const backupVolume = async (
echo "Compose container started"
`;
}
return lockWrapper(`
${stopCommand}
${backupCommand}
${startCommand}
${uploadCommand}
`);
return lockWrapper(
createRestartSafeBackupCommand({
stopCommand,
backupCommand,
startCommand,
uploadCommand,
}),
);
}
};