Website Otomatik Yedekleme
Web sitesi dosyalarını ve veritabanını otomatik olarak yedekleyen, sıkıştıran ve uzak sunucuya transfer eden kapsamlı yedekleme scripti.
Yayınlanma: 15.03.2024
Detaylı Bilgi
Bu script, web sitenizin dosyalarını ve veritabanını otomatik olarak yedekler, sıkıştırır ve isteğe bağlı olarak uzak sunucuya transfer eder. Web siteleri için kritik bir yedekleme çözümüdür.
Script Ne İşe Yarar?
Bu script, kapsamlı bir web sitesi yedekleme süreci yürütür:
- Web sitesi dosyalarını yedekler (tüm dosyalar ve dizinler)
- MySQL veritabanını yedekler
- Yedek bilgilerini içeren bir info dosyası oluşturur
- Tüm yedekleri tek bir arşiv dosyasında birleştirir
- Uzak sunucuya transfer eder (rsync ile)
- Eski yedekleri otomatik olarak temizler
- Geçici dosyaları temizler
Neden Kullanmalısınız?
Web sitesi yedekleme, veri kaybına karşı koruma sağlar:
- Tam Yedekleme: Dosyalar ve veritabanı birlikte
- Otomasyon: Cron job ile tam otomasyon
- Uzak Depolama: Yedekleri uzak sunucuya gönderir
- Disk Yönetimi: Eski yedekleri otomatik temizler
- Disaster Recovery: Hızlı geri yükleme imkanı
Nasıl Kullanılır?
Adım Adım Kullanım Kılavuzu
1. Yapılandırma Ayarları
Script başındaki değişkenleri düzenleyin:
SITE_PATH="/var/www/html" # Web sitesi dizini
BACKUP_PATH="/backup/websites" # Yedeklerin kaydedileceği dizin
MYSQL_USER="backup_user" # MySQL kullanıcı adı
MYSQL_PASS="your_password" # MySQL şifresi
DB_NAME="your_database" # Veritabanı adı
REMOTE_SERVER="[email protected]" # Uzak sunucu
REMOTE_PATH="/backups" # Uzak sunucu dizini
RETENTION_DAYS=30 # Yedek saklama süresi (gün)
2. SSH Key Kurulumu (Şifresiz Transfer)
ssh-keygen -t rsa
ssh-copy-id [email protected]
3. Scripti Çalıştırın
chmod +x website_backup.sh
sudo ./website_backup.sh
4. Otomatikleştirme
# Crontab ile günlük yedekleme (saat 03:00)
sudo crontab -e
# Ekle: 0 3 * * * /path/to/website_backup.sh Gereksinimler
Gereksinimler
- Root Yetkisi: Dosya yedekleme için gerekli
- mysqldump: Veritabanı yedekleme için
- tar, gzip: Sıkıştırma için
- rsync: Uzak sunucuya transfer için (opsiyonel)
- SSH Erişimi: Uzak sunucuya bağlantı için
Kullanım Senaryoları
Kullanım Senaryoları
1. Günlük Otomatik Yedekleme
Production web sitelerinizi her gün otomatik olarak yedekleyin.
2. Disaster Recovery
Sunucu çökmesi durumunda hızlıca geri yükleme yapın.
3. Veri Göçü
Web sitenizi başka bir sunucuya taşırken yedekleri kullanın.
Örnekler
Kullanım Örnekleri
Örnek 1: Temel Kullanım
sudo ./website_backup.sh
Örnek 2: Otomatik Yedekleme
# Her gün saat 03:00'de
0 3 * * * /path/to/website_backup.sh Kod
#!/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
Kullanım
# Ayarları düzenle
nano website_backup.sh
chmod +x website_backup.sh
# Manuel yedekleme
sudo ./website_backup.sh
# Otomatik yedekleme (günlük, 3:00)
sudo crontab -e
# Ekle: 0 3 * * * /path/to/website_backup.sh
# SSH key kurulumu (şifresiz transfer için)
ssh-keygen -t rsa
ssh-copy-id [email protected]
Sorun Giderme
Sorun Giderme
Problem: "Permission denied"
Çözüm: Scripti root olarak çalıştırın:
sudo ./website_backup.sh
Problem: "mysqldump: command not found"
Çözüm: MySQL client kurun:
sudo apt-get install mysql-client