mirror of
https://github.com/makeplane/plane.git
synced 2026-09-02 12:09:14 +02:00
fix(airgapped): harden community restore script
- Fix stray "+" before set -euo pipefail
- Allow no-argument invocation under set -u (BACKUP_FOLDER="${1:-}")
- Don't exit under pipefail when no compose project matches; recognize
"running(N)" statuses when checking if the instance is running
- Fix unquoted glob in the backup extraction loop
- Rename extracted dirs (pgdata/redisdata/uploads/rabbitmq_data) to the
volume paths the airgapped docker-compose expects (db/redis/minio/uploads/mq)
- Update ASCII header to the current logo
Co-Authored-By: WOZCODE <contact@withwoz.com>
This commit is contained in:
@@ -1,20 +1,20 @@
|
||||
#!/bin/bash
|
||||
+set -euo pipefail
|
||||
set -euo pipefail
|
||||
|
||||
function print_header() {
|
||||
clear
|
||||
|
||||
cat <<"EOF"
|
||||
--------------------------------------------
|
||||
____ _ /////////
|
||||
| _ \| | __ _ _ __ ___ /////////
|
||||
| |_) | |/ _` | '_ \ / _ \ ///// /////
|
||||
| __/| | (_| | | | | __/ ///// /////
|
||||
|_| |_|\__,_|_| |_|\___| ////
|
||||
////
|
||||
--------------------------------------------
|
||||
Project management tool from the future
|
||||
--------------------------------------------
|
||||
##+. ##+ .##-
|
||||
######+.######-.######.
|
||||
#######. -### +#####+.
|
||||
#######. + +######.
|
||||
#######. .#######
|
||||
#######. .#######
|
||||
####### + .#######
|
||||
.+#####+ ###- .#######
|
||||
.######.-#####+.+######
|
||||
-##. -## .+##
|
||||
EOF
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ function restoreData() {
|
||||
echo ""
|
||||
|
||||
# set the backup folder path
|
||||
BACKUP_FOLDER=${1}
|
||||
BACKUP_FOLDER="${1:-}"
|
||||
|
||||
if [ -z "$BACKUP_FOLDER" ]; then
|
||||
BACKUP_FOLDER="$PWD/backup"
|
||||
@@ -78,12 +78,12 @@ function restoreData() {
|
||||
|
||||
local dockerServiceStatus
|
||||
if command -v jq &> /dev/null; then
|
||||
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped --format=json | jq -r .[0].Status)
|
||||
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped --format=json | jq -r '.[0].Status // empty')
|
||||
else
|
||||
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped | grep -o "running" | head -n 1)
|
||||
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped | grep -o "running" | head -n 1 || true)
|
||||
fi
|
||||
|
||||
if [[ $dockerServiceStatus == "running" ]]; then
|
||||
if [[ "$dockerServiceStatus" == running* ]]; then
|
||||
echo "Plane Airgapped is running. Please STOP the Plane Airgapped before restoring data."
|
||||
exit 1
|
||||
fi
|
||||
@@ -97,36 +97,60 @@ function restoreData() {
|
||||
chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$AIRGAPPED_INSTALL_PATH/data"
|
||||
fi
|
||||
|
||||
for BACKUP_FILE in "$BACKUP_FOLDER/*.tar.gz"; do
|
||||
# Extract all backup tar files
|
||||
for BACKUP_FILE in "$BACKUP_FOLDER"/*.tar.gz; do
|
||||
if [ -e "$BACKUP_FILE" ]; then
|
||||
|
||||
# get the basefilename without the extension
|
||||
BASE_FILE_NAME=$(basename "$BACKUP_FILE" ".tar.gz")
|
||||
|
||||
# extract the restoreFile to the airgapped instance install path
|
||||
echo "Restoring $BASE_FILE_NAME"
|
||||
rm -rf "$AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME" || true
|
||||
|
||||
tar -xvzf "$BACKUP_FILE" -C "$AIRGAPPED_INSTALL_PATH/data/"
|
||||
echo "Extracting $BASE_FILE_NAME"
|
||||
tar -xzvf "$BACKUP_FILE" -C "$AIRGAPPED_INSTALL_PATH/data/"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to extract $BACKUP_FILE"
|
||||
exit 1
|
||||
fi
|
||||
chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to change ownership of $AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME"
|
||||
exit 1
|
||||
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: $0 /path/to/backup"
|
||||
echo "Usage: $0 /path/to/backup"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
DATA_DIR="$AIRGAPPED_INSTALL_PATH/data"
|
||||
|
||||
# Rename extracted directories to match docker-compose volume paths
|
||||
# Backup tars: pgdata, redisdata, uploads, rabbitmq_data
|
||||
# Docker-compose expects: db, redis, minio/uploads, mq
|
||||
|
||||
if [ -d "$DATA_DIR/pgdata" ]; then
|
||||
rm -rf "$DATA_DIR/db"
|
||||
mv "$DATA_DIR/pgdata" "$DATA_DIR/db"
|
||||
echo "Renamed pgdata -> db"
|
||||
fi
|
||||
|
||||
if [ -d "$DATA_DIR/redisdata" ]; then
|
||||
rm -rf "$DATA_DIR/redis"
|
||||
mv "$DATA_DIR/redisdata" "$DATA_DIR/redis"
|
||||
echo "Renamed redisdata -> redis"
|
||||
fi
|
||||
|
||||
if [ -d "$DATA_DIR/uploads" ]; then
|
||||
mkdir -p "$DATA_DIR/minio"
|
||||
rm -rf "$DATA_DIR/minio/uploads"
|
||||
mv "$DATA_DIR/uploads" "$DATA_DIR/minio/uploads"
|
||||
echo "Renamed uploads -> minio/uploads"
|
||||
fi
|
||||
|
||||
if [ -d "$DATA_DIR/rabbitmq_data" ]; then
|
||||
rm -rf "$DATA_DIR/mq"
|
||||
mv "$DATA_DIR/rabbitmq_data" "$DATA_DIR/mq"
|
||||
echo "Renamed rabbitmq_data -> mq"
|
||||
fi
|
||||
|
||||
# Fix ownership on all restored data
|
||||
chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$DATA_DIR"
|
||||
|
||||
echo ""
|
||||
echo "Restore completed successfully."
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user