Автоматическое Резервное Копирование Веб-сайта

Комплексный скрипт резервного копирования, который автоматически создает резервные копии файлов веб-сайта и базы данных, сжимает и передает на удаленный сервер.

Опубликовано: 15.03.2024

Код

#!/bin/bash

# Automated Website Backup Script

SITE_PATH="/var/www/html"
BACKUP_PATH="/backup/websites"
MYSQL_USER="backup_user"
MYSQL_PASS="your_password"
DB_NAME="your_database"
REMOTE_SERVER="[email protected]"
REMOTE_PATH="/backups"
RETENTION_DAYS=30

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="website_backup_${DATE}"
TEMP_DIR="/tmp/$BACKUP_NAME"

mkdir -p "$TEMP_DIR"
mkdir -p "$BACKUP_PATH"

echo "======================================"
echo "   WEBSITE BACKUP PROCESS"
echo "======================================"
echo "Started: $(date)"
echo ""

echo "1. Backing up website files..."
cd "$SITE_PATH" || exit 1
tar -czf "$TEMP_DIR/files.tar.gz" .
if [ $? -eq 0 ]; then
    SIZE=$(du -h "$TEMP_DIR/files.tar.gz" | cut -f1)
    echo "✓ Files backed up ($SIZE)"
else
    echo "✗ File backup failed!"
    exit 1
fi
echo ""

echo "2. Backing up database..."
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" \
    --single-transaction \
    --routines \
    --triggers \
    "$DB_NAME" | gzip > "$TEMP_DIR/database.sql.gz"
    
if [ $? -eq 0 ]; then
    SIZE=$(du -h "$TEMP_DIR/database.sql.gz" | cut -f1)
    echo "✓ Database backed up ($SIZE)"
else
    echo "✗ Database backup failed!"
    exit 1
fi
echo ""

echo "3. Creating backup info..."
cat > "$TEMP_DIR/backup_info.txt" << EOF
Backup Date: $(date)
Server: $(hostname)
Site Path: $SITE_PATH
Database: $DB_NAME
Files Size: $(du -sh "$SITE_PATH" | cut -f1)
Database Size: $(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -e "SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS Size_MB FROM information_schema.tables WHERE table_schema = \"$DB_NAME\";" -sN) MB
EOF
echo "✓ Info file created"
echo ""

echo "4. Creating final archive..."
cd /tmp || exit 1
tar -czf "$BACKUP_PATH/${BACKUP_NAME}.tar.gz" "$BACKUP_NAME"
if [ $? -eq 0 ]; then
    FINAL_SIZE=$(du -h "$BACKUP_PATH/${BACKUP_NAME}.tar.gz" | cut -f1)
    echo "✓ Final archive created ($FINAL_SIZE)"
else
    echo "✗ Archive creation failed!"
    exit 1
fi
echo ""

echo "5. Transferring to remote server..."
if command -v rsync &> /dev/null; then
    rsync -avz "$BACKUP_PATH/${BACKUP_NAME}.tar.gz" "${REMOTE_SERVER}:${REMOTE_PATH}/"
    if [ $? -eq 0 ]; then
        echo "✓ Backup transferred to remote server"
    else
        echo "⚠️  Remote transfer failed (backup saved locally)"
    fi
else
    echo "⚠️  rsync not found, skipping remote transfer"
fi
echo ""

echo "6. Cleaning up..."
rm -rf "$TEMP_DIR"
echo "✓ Temporary files removed"
echo ""

echo "7. Removing backups older than $RETENTION_DAYS days..."
find "$BACKUP_PATH" -name "website_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "✓ Old backups cleaned"
echo ""

echo "======================================"
echo "   BACKUP SUMMARY"
echo "======================================"
echo "Backup Name: ${BACKUP_NAME}.tar.gz"
echo "Backup Size: $FINAL_SIZE"
echo "Backup Location: $BACKUP_PATH"
echo "Completed: $(date)"
echo ""
echo "Recent backups:"
ls -lth "$BACKUP_PATH" | head -n 6

Использование

# Edit configuration
nano website_backup.sh

chmod +x website_backup.sh

# Manual backup
sudo ./website_backup.sh

# Automated backup (daily at 3:00 AM)
sudo crontab -e
# Add: 0 3 * * * /path/to/website_backup.sh

# SSH key setup (for passwordless transfer)
ssh-keygen -t rsa
ssh-copy-id [email protected]

Теги

website backup mysql backup rsync automated backup