#!/bin/bash # Restore Script # Restores the gateway from a backup set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" BACKUP_TIMESTAMP="$1" if [ -z "$BACKUP_TIMESTAMP" ]; then echo "โŒ Usage: $0 " echo "" echo "Available backups:" ls -1 "$PROJECT_ROOT/backups"/gateway_backup_*.tar.gz 2>/dev/null | \ sed 's/.*gateway_backup_\(.*\)\.tar\.gz/ \1/' || echo " No backups found" exit 1 fi BACKUP_DIR="${PROJECT_ROOT}/backups" BACKUP_FILE="${BACKUP_DIR}/gateway_backup_${BACKUP_TIMESTAMP}.tar.gz" echo "๐Ÿ”„ Restoring Torrent Gateway" echo "Backup: $BACKUP_TIMESTAMP" echo "File: $BACKUP_FILE" echo "" cd "$PROJECT_ROOT" # Check if backup exists if [ ! -f "$BACKUP_FILE" ]; then echo "โŒ Backup file not found: $BACKUP_FILE" echo "" echo "Available backups:" ls -1 "$BACKUP_DIR"/gateway_backup_*.tar.gz 2>/dev/null | \ sed 's/.*gateway_backup_\(.*\)\.tar\.gz/ \1/' || echo " No backups found" exit 1 fi # Stop running services echo "๐Ÿ›‘ Stopping services..." if docker-compose -f docker-compose.prod.yml ps | grep -q "Up"; then docker-compose -f docker-compose.prod.yml down --timeout 30 echo "โœ… Services stopped" else echo "โ„น๏ธ No services running" fi # Create restore point echo "๐Ÿ’พ Creating restore point..." if [ -d "data" ] || [ -d "configs" ] || [ -d "logs" ]; then RESTORE_POINT_TIMESTAMP=$(date +%Y%m%d_%H%M%S) RESTORE_POINT="${BACKUP_DIR}/pre_restore_${RESTORE_POINT_TIMESTAMP}.tar.gz" tar -czf "$RESTORE_POINT" data/ configs/ logs/ 2>/dev/null || true echo "โœ… Restore point created: $RESTORE_POINT" fi # Remove existing data/configs/logs echo "๐Ÿงน Removing existing data..." for dir in data configs logs; do if [ -d "$dir" ]; then echo " Removing $dir/" rm -rf "$dir" fi done # Extract backup echo "๐Ÿ“ฆ Extracting backup..." tar -xzf "$BACKUP_FILE" if [ ! -d "data" ]; then echo "โŒ Backup extraction failed - data directory not found" exit 1 fi echo "โœ… Backup extracted successfully" # Restore database from SQL backup if available DB_BACKUP="${BACKUP_DIR}/database_${BACKUP_TIMESTAMP}.sql" if [ -f "$DB_BACKUP" ]; then echo "๐Ÿ—„๏ธ Restoring database from SQL backup..." # Remove any existing database rm -f data/metadata.db # Restore from SQL sqlite3 data/metadata.db < "$DB_BACKUP" echo "โœ… Database restored from SQL backup" fi # Set proper permissions echo "๐Ÿ” Setting permissions..." chmod -R 755 data/ configs/ logs/ 2>/dev/null || true echo "โœ… Permissions set" # Build and start services echo "๐Ÿ”จ Building Docker images..." docker build -f Dockerfile.prod -t torrent-gateway:$BACKUP_TIMESTAMP . docker build -f Dockerfile.prod -t torrent-gateway:latest . echo "๐Ÿš€ Starting services..." docker-compose -f docker-compose.prod.yml up -d # Wait for services to be healthy echo "โณ Waiting for services to be healthy..." TIMEOUT=60 COUNT=0 while [ $COUNT -lt $TIMEOUT ]; do if curl -sf http://localhost:9876/api/health > /dev/null; then echo "โœ… Gateway is healthy" break fi COUNT=$((COUNT + 1)) sleep 1 echo "Waiting... ($COUNT/$TIMEOUT)" done if [ $COUNT -ge $TIMEOUT ]; then echo "โŒ Gateway failed to become healthy within $TIMEOUT seconds" echo "Checking logs..." docker-compose -f docker-compose.prod.yml logs --tail=50 gateway exit 1 fi # Run health checks echo "๐Ÿฅ Running health checks..." ./scripts/health_check.sh if [ $? -ne 0 ]; then echo "โŒ Health checks failed after restore" exit 1 fi echo "" echo "๐ŸŽ‰ Restore completed successfully!" echo "โœ… Services restored from backup: $BACKUP_TIMESTAMP" echo "โœ… All health checks passed" echo "โœ… Gateway is running and healthy" echo "" echo "๐Ÿ“Š Access points:" echo " Gateway API: http://localhost:9876" echo " Admin Panel: http://localhost:9876/admin" echo " Grafana: http://localhost:3000" echo "" echo "๐Ÿ“ Monitor the restore:" echo " docker-compose -f docker-compose.prod.yml logs -f"