Files
CloudOps/scripts/pull-backups.sh
2026-04-09 19:24:44 +01:00

115 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
# =============================================
# pull-backup.sh — Run on VM (local machine)
# Pulls a backup from /backups/main-server/
# and extracts it ready for restore.
#
# Usage:
# ./pull-backup.sh → list available backups
# ./pull-backup.sh latest → pull the most recent backup
# ./pull-backup.sh myapps-backup-20260311_021129.tar.gz → pull specific one
# =============================================
BACKUP_DIR="/backups/main-server"
RESTORE_DIR="/root/restored-backups"
mkdir -p "$RESTORE_DIR"
echo "========================================="
echo "📥 Backup Pull Tool"
echo " Source: $BACKUP_DIR"
echo " Dest: $RESTORE_DIR"
echo "========================================="
# --------------------------------------------------
# No argument → list available backups
# --------------------------------------------------
if [ -z "${1:-}" ]; then
echo ""
echo "📋 Available backups:"
echo ""
if ls "$BACKUP_DIR"/myapps-backup-*.tar.gz &>/dev/null; then
ls -lht "$BACKUP_DIR"/myapps-backup-*.tar.gz | awk '{print NR". "$NF" ("$5")"}'
else
echo " (no backups found in $BACKUP_DIR)"
fi
echo ""
echo "Usage:"
echo " $0 latest"
echo " $0 myapps-backup-20260311_021129.tar.gz"
exit 0
fi
# --------------------------------------------------
# 'latest' → pick newest file
# --------------------------------------------------
if [ "$1" = "latest" ]; then
BACKUP_FILE=$(ls -t "$BACKUP_DIR"/myapps-backup-*.tar.gz 2>/dev/null | head -1)
if [ -z "$BACKUP_FILE" ]; then
echo "❌ No backups found in $BACKUP_DIR"
exit 1
fi
echo "🕐 Latest backup: $(basename $BACKUP_FILE)"
else
# Specific filename given — accept with or without path prefix
BASENAME=$(basename "$1")
BACKUP_FILE="$BACKUP_DIR/$BASENAME"
if [ ! -f "$BACKUP_FILE" ]; then
echo "❌ Not found: $BACKUP_FILE"
echo " Run $0 with no arguments to list available backups."
exit 1
fi
fi
BACKUP_NAME=$(basename "$BACKUP_FILE" .tar.gz)
EXTRACT_PATH="$RESTORE_DIR/$BACKUP_NAME"
# --------------------------------------------------
# Already extracted?
# --------------------------------------------------
if [ -d "$EXTRACT_PATH" ]; then
echo ""
echo "⚠️ This backup is already extracted at:"
echo " $EXTRACT_PATH"
echo ""
read -p " Re-extract? (y/N): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
echo " Skipping extraction."
else
rm -rf "$EXTRACT_PATH"
echo " 🗑️ Removed old extraction."
fi
fi
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo ""
echo "📦 Extracting: $(basename $BACKUP_FILE) [$BACKUP_SIZE]"
echo "$EXTRACT_PATH"
echo ""
cd "$RESTORE_DIR"
tar -xzf "$BACKUP_FILE"
if [ $? -ne 0 ]; then
echo "❌ Extraction failed!"
exit 1
fi
echo ""
echo "✅ Extraction complete!"
echo ""
echo "📋 Backup contents:"
ls -lh "$EXTRACT_PATH/"
echo ""
echo "========================================="
echo "🚀 To restore this backup:"
echo ""
echo " # On THIS VM (local restore):"
echo " cd $EXTRACT_PATH"
echo " ./restore-myapps.sh"
echo ""
echo " # On the MAIN SERVER (remote restore via SSH):"
echo " cd $EXTRACT_PATH"
echo " ./restore-myapps.sh --remote <SERVER_IP> <SSH_USER> [SSH_KEY or PASSWORD]"
echo "========================================="