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

Etiketler

website backup mysql backup rsync otomatik yedekleme