← back to Handbag Auth Nextjs

scripts/devops/restore-database.sh

116 lines

#!/bin/bash
# Database Restore Script for Auction Viewer
# Restore from backup with safety checks

set -euo pipefail

# Configuration
PROJECT_ROOT="/root/Projects/handbag-auth-nextjs"
DB_PATH="${PROJECT_ROOT}/data/auction-history/auctions.db"
BACKUP_DIR="${PROJECT_ROOT}/backups/database"
LOG_FILE="${PROJECT_ROOT}/logs/restore.log"

# Logging function
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}

# Check if backup file is provided
if [ $# -eq 0 ]; then
    echo "Usage: $0 <backup_file>"
    echo ""
    echo "Available backups:"
    ls -lh "${BACKUP_DIR}"/auctions_*.db.gz 2>/dev/null || echo "No backups found"
    echo ""
    echo "To restore latest backup:"
    echo "  $0 latest"
    exit 1
fi

BACKUP_ARG=$1

# Resolve backup file
if [ "${BACKUP_ARG}" == "latest" ]; then
    BACKUP_FILE="${BACKUP_DIR}/latest.db.gz"
    if [ ! -L "${BACKUP_FILE}" ]; then
        log "ERROR: Latest backup symlink not found"
        exit 1
    fi
    BACKUP_FILE=$(readlink -f "${BACKUP_FILE}")
else
    BACKUP_FILE="${BACKUP_ARG}"
fi

log "=========================================="
log "Starting database restore"
log "=========================================="

# Verify backup file exists
if [ ! -f "${BACKUP_FILE}" ]; then
    log "ERROR: Backup file not found: ${BACKUP_FILE}"
    exit 1
fi

log "Backup file: ${BACKUP_FILE}"
BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
log "Backup size: ${BACKUP_SIZE}"

# Create backup of current database before restore
if [ -f "${DB_PATH}" ]; then
    CURRENT_BACKUP="${DB_PATH}.pre-restore.$(date +%Y%m%d_%H%M%S)"
    log "Creating safety backup of current database: ${CURRENT_BACKUP}"
    cp "${DB_PATH}" "${CURRENT_BACKUP}"
fi

# Stop the application
log "Stopping auction-viewer service..."
pm2 stop auction-viewer || true
sleep 2

# Decompress and restore
TEMP_DB="/tmp/restore_temp_$(date +%s).db"
log "Decompressing backup to temporary file..."
gunzip -c "${BACKUP_FILE}" > "${TEMP_DB}"

# Verify restored database integrity
log "Verifying database integrity..."
sqlite3 "${TEMP_DB}" "PRAGMA integrity_check;" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    log "Database integrity verified"
else
    log "ERROR: Database integrity check failed"
    rm -f "${TEMP_DB}"
    pm2 start auction-viewer
    exit 1
fi

# Test query on restored database
RECORD_COUNT=$(sqlite3 "${TEMP_DB}" "SELECT COUNT(*) FROM auctions;")
log "Restored database contains ${RECORD_COUNT} records"

# Move restored database to production location
log "Moving restored database to production location..."
mv "${TEMP_DB}" "${DB_PATH}"
chmod 644 "${DB_PATH}"

# Restart the application
log "Starting auction-viewer service..."
pm2 start auction-viewer
sleep 3

# Verify application is running
if pm2 show auction-viewer | grep -q "online"; then
    log "Application restarted successfully"
else
    log "WARNING: Application may not have started correctly"
fi

log "Restore completed successfully"
log "Database now contains ${RECORD_COUNT} records"
log "=========================================="

echo ""
echo "Restore completed. Please verify the application:"
echo "  curl http://45.61.58.125:7500/health"
echo "  curl http://45.61.58.125:7500/api/stats"