#!/bin/bash # Exit immediately if a command exits with a non-zero status set -e if [ "$#" -ne 2 ]; then echo "Usage: $0 " echo "Example: $0 backups/penpot_db_20231026_120000.sql backups/penpot_assets_20231026_120000.tar.gz" exit 1 fi DB_FILE=$1 ASSETS_FILE=$2 # Verify files exist if [ ! -f "$DB_FILE" ]; then echo "Error: Database backup file '$DB_FILE' not found." exit 1 fi if [ ! -f "$ASSETS_FILE" ]; then echo "Error: Assets backup file '$ASSETS_FILE' not found." exit 1 fi echo "=== Starting Penpot Restore ===" echo "Stopping frontend, backend, and exporter..." docker compose stop penpot-frontend penpot-backend penpot-exporter echo "Restoring Database from $DB_FILE..." cat "$DB_FILE" | docker compose exec -T penpot-postgres psql -U penpot -d penpot echo "Database restored." # We spin up a temporary container, delete current assets, and extract the backup # Convert relative path of ASSETS_FILE to absolute path for the volume mount echo "Restoring Assets from $ASSETS_FILE..." ABS_ASSETS_FILE=$(realpath "$ASSETS_FILE") ABS_ASSETS_DIR=$(dirname "$ABS_ASSETS_FILE") ASSETS_FILENAME=$(basename "$ABS_ASSETS_FILE") docker compose run --rm \ -v "$ABS_ASSETS_DIR":/backups \ penpot-backend \ sh -c "rm -rf /opt/data/assets/* && tar xzvf /backups/$ASSETS_FILENAME -C /opt/data/assets/" echo "Assets restored." echo "Restarting all Penpot services..." docker compose start echo "=== Restore Complete! ==="