#!/bin/bash # Database Backup Script # Usage: ./scripts/backup.sh # Creates timestamped backup in backups/ directory set -e BACKUP_DIR="backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) # Create backup directory mkdir -p "$BACKUP_DIR" # Detect database type from .env if [ -f "src/.env" ]; then DB_CONNECTION=$(grep "^DB_CONNECTION=" src/.env | cut -d '=' -f2) DB_DATABASE=$(grep "^DB_DATABASE=" src/.env | cut -d '=' -f2) DB_USERNAME=$(grep "^DB_USERNAME=" src/.env | cut -d '=' -f2) DB_PASSWORD=$(grep "^DB_PASSWORD=" src/.env | cut -d '=' -f2) else echo "Error: src/.env not found" exit 1 fi echo "==========================================" echo "Database Backup" echo "==========================================" echo "Connection: $DB_CONNECTION" echo "Database: $DB_DATABASE" echo "" case "$DB_CONNECTION" in mysql) BACKUP_FILE="$BACKUP_DIR/${DB_DATABASE}_${TIMESTAMP}.sql" echo "Creating MySQL backup..." docker-compose exec -T mysql mysqldump \ -u"$DB_USERNAME" \ -p"$DB_PASSWORD" \ "$DB_DATABASE" > "$BACKUP_FILE" ;; pgsql) BACKUP_FILE="$BACKUP_DIR/${DB_DATABASE}_${TIMESTAMP}.sql" echo "Creating PostgreSQL backup..." docker-compose exec -T pgsql pg_dump \ -U "$DB_USERNAME" \ "$DB_DATABASE" > "$BACKUP_FILE" ;; sqlite) BACKUP_FILE="$BACKUP_DIR/${DB_DATABASE}_${TIMESTAMP}.sqlite" echo "Creating SQLite backup..." cp "src/database/database.sqlite" "$BACKUP_FILE" ;; *) echo "Error: Unknown database connection: $DB_CONNECTION" exit 1 ;; esac # Compress backup if [ -f "$BACKUP_FILE" ]; then gzip "$BACKUP_FILE" BACKUP_FILE="${BACKUP_FILE}.gz" # Get file size SIZE=$(ls -lh "$BACKUP_FILE" | awk '{print $5}') echo "" echo "✓ Backup created successfully!" echo " File: $BACKUP_FILE" echo " Size: $SIZE" echo "" # Cleanup old backups (keep last 10) echo "Cleaning up old backups (keeping last 10)..." ls -t "$BACKUP_DIR"/*.gz 2>/dev/null | tail -n +11 | xargs -r rm -- # List recent backups echo "" echo "Recent backups:" ls -lht "$BACKUP_DIR"/*.gz 2>/dev/null | head -5 else echo "Error: Backup file not created" exit 1 fi