From 7758312e05c3c21569b61b5e8d500d3b5d16c705 Mon Sep 17 00:00:00 2001 From: seals187 <86856086+seals187@users.noreply.github.com> Date: Thu, 19 Feb 2026 13:13:12 +0100 Subject: [PATCH] fix(backup): Improve backup/restore scripts, allow specifying backup directory (#1541) --- docker-backup.sh | 45 ++++++++++++++++++++++++++++----------------- docker-restore.sh | 40 +++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 32 deletions(-) diff --git a/docker-backup.sh b/docker-backup.sh index c49828a9..3add973d 100644 --- a/docker-backup.sh +++ b/docker-backup.sh @@ -1,13 +1,22 @@ #!/bin/bash -# Stop on Error +# Stop on error set -e -# Configure those to match your PLANKA Docker container names -PLANKA_DOCKER_CONTAINER_POSTGRES="planka-postgres-1" -PLANKA_DOCKER_CONTAINER_PLANKA="planka-planka-1" +# Configure those to match your Docker container names +DOCKER_CONTAINER_POSTGRES="planka-postgres-1" +DOCKER_CONTAINER_PLANKA="planka-planka-1" + +# Use provided directory or default to current directory +BACKUP_DIR="${1:-$(pwd)}" + +if [ -z "$1" ]; then + echo "No backup directory specified, backing up to current directory: $BACKUP_DIR" +else + echo "Backing up to: $BACKUP_DIR" +fi +echo -# Create Temporary folder if date --version >/dev/null 2>&1; then # GNU date (Linux) BACKUP_DATETIME=$(date --utc +%FT%H-%M-%SZ) @@ -15,28 +24,30 @@ else # BSD date (macOS) BACKUP_DATETIME=$(date -u +%FT%H-%M-%SZ) fi -mkdir -p "$BACKUP_DATETIME-backup" -# Dump DB into SQL File +BACKUP_TEMP="$BACKUP_DIR/$BACKUP_DATETIME-backup" + +# Create temporary directory +mkdir -p "$BACKUP_TEMP" + echo -n "Exporting postgres database ... " -docker exec -t "$PLANKA_DOCKER_CONTAINER_POSTGRES" pg_dumpall -c -U postgres > "$BACKUP_DATETIME-backup/postgres.sql" +docker exec -t "$DOCKER_CONTAINER_POSTGRES" pg_dumpall -c -U postgres > "$BACKUP_TEMP/postgres.sql" echo "Success!" +echo -# Export Docker Volume echo -n "Exporting data volume ... " -docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$(pwd)/$BACKUP_DATETIME-backup:/backup" ubuntu cp -r /app/data /backup/data +docker run --rm --volumes-from "$DOCKER_CONTAINER_PLANKA" -v "$BACKUP_TEMP:/backup" node:22-alpine cp -r /app/data /backup/data echo "Success!" +echo -# Create tgz echo -n "Creating final tarball $BACKUP_DATETIME-backup.tgz ... " -tar -czf "$BACKUP_DATETIME-backup.tgz" \ - "$BACKUP_DATETIME-backup/postgres.sql" \ - "$BACKUP_DATETIME-backup/data" +tar -C "$BACKUP_DIR" -czf "$BACKUP_TEMP.tgz" "$BACKUP_DATETIME-backup" echo "Success!" +echo -# Remove source files -echo -n "Cleaning up temporary files and folders ... " -rm -rf "$BACKUP_DATETIME-backup" +echo -n "Cleaning up temporary files and directories ... " +rm -rf "$BACKUP_TEMP" echo "Success!" +echo echo "Backup Complete!" diff --git a/docker-restore.sh b/docker-restore.sh index 16d64b17..e00eb4cd 100644 --- a/docker-restore.sh +++ b/docker-restore.sh @@ -1,31 +1,41 @@ #!/bin/bash -# Stop on Error +# Stop on error set -e -# Configure those to match your PLANKA Docker container names -PLANKA_DOCKER_CONTAINER_POSTGRES="planka-postgres-1" -PLANKA_DOCKER_CONTAINER_PLANKA="planka-planka-1" +# Configure those to match your Docker container names +DOCKER_CONTAINER_POSTGRES="planka-postgres-1" +DOCKER_CONTAINER_PLANKA="planka-planka-1" -# Extract tgz archive -PLANKA_BACKUP_ARCHIVE_TGZ=$1 -PLANKA_BACKUP_ARCHIVE=$(basename "$PLANKA_BACKUP_ARCHIVE_TGZ" .tgz) -echo -n "Extracting tarball $PLANKA_BACKUP_ARCHIVE_TGZ ... " -tar -xzf "$PLANKA_BACKUP_ARCHIVE_TGZ" +# Use provided archive +BACKUP_ARCHIVE="$1" + +if [ -z "$BACKUP_ARCHIVE" ]; then + echo "Usage: $0 " + exit 1 +fi + +BACKUP_DIR=$(dirname "$BACKUP_ARCHIVE") +BACKUP_TEMP="$BACKUP_DIR/$(basename "$BACKUP_ARCHIVE" .tgz)" + +echo -n "Extracting tarball $BACKUP_ARCHIVE ... " +tar -C "$BACKUP_DIR" -xzf "$BACKUP_ARCHIVE" echo "Success!" +echo -# Import Database echo -n "Importing postgres database ... " -cat "$PLANKA_BACKUP_ARCHIVE/postgres.sql" | docker exec -i "$PLANKA_DOCKER_CONTAINER_POSTGRES" psql -U postgres +cat "$BACKUP_TEMP/postgres.sql" | docker exec -i "$DOCKER_CONTAINER_POSTGRES" psql -U postgres echo "Success!" +echo -# Restore Docker Volume echo -n "Importing data volume ... " -docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$(pwd)/$PLANKA_BACKUP_ARCHIVE:/backup" ubuntu cp -rf /backup/data/. /app/data +docker run --rm --user root --volumes-from "$DOCKER_CONTAINER_PLANKA" -v "$BACKUP_TEMP:/backup" node:22-alpine sh -c "cp -rf /backup/data/. /app/data && chown -R node:node /app/data/*" echo "Success!" +echo -echo -n "Cleaning up temporary files and folders ... " -rm -r "$PLANKA_BACKUP_ARCHIVE" +echo -n "Cleaning up temporary files and directories ... " +rm -r "$BACKUP_TEMP" echo "Success!" +echo echo "Restore complete!"