← 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"