From 78481d45d4796c42ade24df22ef4a970f75b71cd Mon Sep 17 00:00:00 2001 From: Manish Gupta <59428681+mguptahub@users.noreply.github.com> Date: Tue, 23 Jul 2024 19:37:31 +0530 Subject: [PATCH] chore: selfhost backup restore (#5188) * chore: Data restore script added * readme updated * coderabbit suggestion implemented * updated messages and readme * updated readme * updated readme * self host readme fix --- deploy/selfhost/README.md | 55 ++++++++++++++++- deploy/selfhost/restore.sh | 121 +++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 1 deletion(-) create mode 100755 deploy/selfhost/restore.sh diff --git a/deploy/selfhost/README.md b/deploy/selfhost/README.md index bb8a574d8d..c44771882c 100644 --- a/deploy/selfhost/README.md +++ b/deploy/selfhost/README.md @@ -372,8 +372,60 @@ Backup completed successfully. Backup files are stored in /....../plane-app/back --- +### Restore Data -## Upgrading from v0.13.2 to v0.14.x +When you want to restore the previously backed-up data, follow the instructions below. + +1. Make sure that Plane-CE is installed, started, and then stopped. This ensures that the Docker volumes are created. + +1. Download the restore script using the command below. We suggest downloading it in the same folder as `setup.sh`. + + ```bash + curl -fsSL -o restore.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/restore.sh + chmod +x restore.sh + ``` + +1. Execute the command below to restore your data. + + ```bash + ./restore.sh + ``` + + As an example, for a backup folder `/opt/plane-selfhost/plane-app/backup/20240722-0914`, expect the response below: + + ```bash + -------------------------------------------- + ____ _ ///////// + | _ \| | __ _ _ __ ___ ///////// + | |_) | |/ _` | '_ \ / _ \ ///// ///// + | __/| | (_| | | | | __/ ///// ///// + |_| |_|\__,_|_| |_|\___| //// + //// + -------------------------------------------- + Project management tool from the future + -------------------------------------------- + Found /opt/plane-selfhost/plane-app/backup/20240722-0914/pgdata.tar.gz + .....Restoring plane-app_pgdata + .....Successfully restored volume plane-app_pgdata from pgdata.tar.gz + + Found /opt/plane-selfhost/plane-app/backup/20240722-0914/redisdata.tar.gz + .....Restoring plane-app_redisdata + .....Successfully restored volume plane-app_redisdata from redisdata.tar.gz + + Found /opt/plane-selfhost/plane-app/backup/20240722-0914/uploads.tar.gz + .....Restoring plane-app_uploads + .....Successfully restored volume plane-app_uploads from uploads.tar.gz + + + Restore completed successfully. + ``` + +1. Start the Plane instance using `./setup.sh start`. + +--- + +
+

Upgrading from v0.13.2 to v0.14.x

This is one time activity for users who are upgrading from v0.13.2 to v0.14.0 @@ -445,3 +497,4 @@ In case the suffixes are wrong or the mentioned volumes are not found, you will In case of successful migration, it will be a silent exit without error. Now its time to restart v0.14.0 setup. +
\ No newline at end of file diff --git a/deploy/selfhost/restore.sh b/deploy/selfhost/restore.sh new file mode 100755 index 0000000000..cd453b2a71 --- /dev/null +++ b/deploy/selfhost/restore.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +function print_header() { +clear + +cat <<"EOF" +-------------------------------------------- + ____ _ ///////// +| _ \| | __ _ _ __ ___ ///////// +| |_) | |/ _` | '_ \ / _ \ ///// ///// +| __/| | (_| | | | | __/ ///// ///// +|_| |_|\__,_|_| |_|\___| //// + //// +-------------------------------------------- +Project management tool from the future +-------------------------------------------- +EOF +} + +function restoreSingleVolume() { + selectedVolume=$1 + backupFolder=$2 + restoreFile=$3 + + docker volume rm "$selectedVolume" > /dev/null 2>&1 + + if [ $? -ne 0 ]; then + echo "Error: Failed to remove volume $selectedVolume" + echo "" + return 1 + fi + + docker volume create "$selectedVolume" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error: Failed to create volume $selectedVolume" + echo "" + return 1 + fi + + docker run --rm \ + -e TAR_NAME="$restoreFile" \ + -v "$selectedVolume":"/vol" \ + -v "$backupFolder":/backup \ + busybox sh -c 'mkdir -p /restore && tar -xzf "/backup/${TAR_NAME}.tar.gz" -C /restore && mv /restore/${TAR_NAME}/* /vol' + + if [ $? -ne 0 ]; then + echo "Error: Failed to restore volume ${selectedVolume} from ${restoreFile}.tar.gz" + echo "" + return 1 + fi + echo ".....Successfully restored volume $selectedVolume from ${restoreFile}.tar.gz" + echo "" +} + +function restoreData() { + print_header + local BACKUP_FOLDER=${1:-$PWD} + + local dockerServiceStatus + dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-app --format=json | jq -r .[0].Status) + local dockerServicePrefix + dockerServicePrefix="running" + + if [[ $dockerServiceStatus == $dockerServicePrefix* ]]; then + echo "Plane App is running. Please STOP the Plane App before restoring data." + exit 1 + fi + + local volumes + volumes=$(docker volume ls -f "name=plane-app" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") + # Check if there are any matching volumes + if [ -z "$volumes" ]; then + echo ".....No volumes found starting with 'plane-app'" + exit 1 + fi + + + for BACKUP_FILE in $BACKUP_FOLDER/*.tar.gz; do + if [ -e "$BACKUP_FILE" ]; then + + local restoreFileName + restoreFileName=$(basename "$BACKUP_FILE") + restoreFileName="${restoreFileName%.tar.gz}" + + local restoreVolName + restoreVolName="plane-app_${restoreFileName}" + echo "Found $BACKUP_FILE" + + local docVol + docVol=$(docker volume ls -f "name=$restoreVolName" --format "{{.Name}}" | grep -E "_pgdata|_redisdata|_uploads") + + if [ -z "$docVol" ]; then + echo "Skipping: No volume found with name $restoreVolName" + else + echo ".....Restoring $docVol" + restoreSingleVolume "$docVol" "$BACKUP_FOLDER" "$restoreFileName" + fi + else + echo "No .tar.gz files found in the current directory." + echo "" + echo "Please provide the path to the backup file." + echo "" + echo "Usage: ./restore.sh /path/to/backup" + exit 1 + fi + done + + echo "" + echo "Restore completed successfully." + echo "" +} + +# if docker-compose is installed +if command -v docker-compose &> /dev/null +then + COMPOSE_CMD="docker-compose" +else + COMPOSE_CMD="docker compose" +fi + +restoreData "$@" \ No newline at end of file