Автоматическое Резервное Копирование Веб-сайта
Комплексный скрипт резервного копирования, который автоматически создает резервные копии файлов веб-сайта и базы данных, сжимает и передает на удаленный сервер.
Опубликовано: 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]