#!/bin/bash # Backup script for market data infrastructure # Run this script regularly to backup your data set -e # Configuration BACKUP_DIR="./backups" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") RETENTION_DAYS=30 # Load environment variables if [ -f .env ]; then source .env fi echo "๐Ÿ—„๏ธ Starting backup process..." # Create backup directory if it doesn't exist mkdir -p "$BACKUP_DIR" # Backup TimescaleDB echo "๐Ÿ“Š Backing up TimescaleDB..." docker exec market_data_timescaledb pg_dump \ -U market_user \ -d market_data \ --verbose \ --no-password \ --format=custom \ --compress=9 \ > "$BACKUP_DIR/timescaledb_backup_$TIMESTAMP.dump" if [ $? -eq 0 ]; then echo "โœ… TimescaleDB backup completed: timescaledb_backup_$TIMESTAMP.dump" else echo "โŒ TimescaleDB backup failed" exit 1 fi # Backup Redis echo "๐Ÿ“ฆ Backing up Redis..." docker exec market_data_redis redis-cli \ -a "$REDIS_PASSWORD" \ --rdb /data/redis_backup_$TIMESTAMP.rdb \ BGSAVE # Wait for Redis backup to complete sleep 5 # Copy Redis backup from container docker cp market_data_redis:/data/redis_backup_$TIMESTAMP.rdb "$BACKUP_DIR/" if [ $? -eq 0 ]; then echo "โœ… Redis backup completed: redis_backup_$TIMESTAMP.rdb" else echo "โŒ Redis backup failed" exit 1 fi # Create backup metadata cat > "$BACKUP_DIR/backup_$TIMESTAMP.info" << EOF Backup Information ================== Timestamp: $TIMESTAMP Date: $(date) TimescaleDB Backup: timescaledb_backup_$TIMESTAMP.dump Redis Backup: redis_backup_$TIMESTAMP.rdb Container Versions: TimescaleDB: $(docker exec market_data_timescaledb psql -U market_user -d market_data -t -c "SELECT version();") Redis: $(docker exec market_data_redis redis-cli -a "$REDIS_PASSWORD" INFO server | grep redis_version) Database Size: $(docker exec market_data_timescaledb psql -U market_user -d market_data -c "\l+") EOF # Compress backups echo "๐Ÿ—œ๏ธ Compressing backups..." tar -czf "$BACKUP_DIR/market_data_backup_$TIMESTAMP.tar.gz" \ -C "$BACKUP_DIR" \ "timescaledb_backup_$TIMESTAMP.dump" \ "redis_backup_$TIMESTAMP.rdb" \ "backup_$TIMESTAMP.info" # Remove individual files after compression rm "$BACKUP_DIR/timescaledb_backup_$TIMESTAMP.dump" rm "$BACKUP_DIR/redis_backup_$TIMESTAMP.rdb" rm "$BACKUP_DIR/backup_$TIMESTAMP.info" echo "โœ… Compressed backup created: market_data_backup_$TIMESTAMP.tar.gz" # Clean up old backups echo "๐Ÿงน Cleaning up old backups (older than $RETENTION_DAYS days)..." find "$BACKUP_DIR" -name "market_data_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete # Display backup information BACKUP_SIZE=$(du -h "$BACKUP_DIR/market_data_backup_$TIMESTAMP.tar.gz" | cut -f1) echo "" echo "๐Ÿ“‹ Backup Summary:" echo " File: market_data_backup_$TIMESTAMP.tar.gz" echo " Size: $BACKUP_SIZE" echo " Location: $BACKUP_DIR" echo "" echo "๐Ÿ”„ To restore from this backup:" echo " ./restore.sh market_data_backup_$TIMESTAMP.tar.gz" echo "" echo "โœ… Backup process completed successfully!"