Ubuntu Sunucuda Tam Otomatik Yedekleme ve Kurtarma Sistemi Kurulum Rehberi 
Selam sistemciler!
Bugün, her sistem yöneticisinin uykusunu rahatlatacak, belki de en önemli konulardan birine değiniyoruz: otomatik yedekleme. "Yedeğim yok" cümlesi, bir sunucu için söylenebilecek en korkunç şeydir. O yüzden bugün, terminalin tozunu alıp, birkaç saat içinde kurup unutabileceğiniz, güvenilir bir yedekleme ve kurtarma zinciri kuracağız.
Neden sadece manuel `tar` komutu yetmez? Çünkü insanız ve unuturuz! Bu rehberde, yedeklerin otomatik alınmasını, eski yedeklerin temizlenmesini ve en önemlisi, yedekten tek tıkla geri dönüş yapabilmeyi öğreneceğiz.
Hazırlık ve Planlama
İşe, neyi yedekleyeceğimizi planlayarak başlayalım. Genellikle kritik olan üç ana bileşen vardır:
Yedeklerimizi nereye alacağız? İdeal olan, sunucunuzdan fiziksel olarak farklı bir yere (harici bir sunucuya, S3/Backblaze B2 gibi bir bulut depolama servisine) kopyalamaktır. Bugünlük, aynı sunucuda farklı bir dizine almayı göstereceğim, ancak script'i kolayca uzak bir sunucuya `scp` veya `rclone` ile gönderecek şekilde genişletebilirsiniz.
1. Adım: Yedekleme Script'imizi Yazalım
`/usr/local/bin/` altında, çalıştırılabilir bir bash script'i oluşturacağız.
Aşağıdaki script'i içine yapıştırın. Açıklamaları ( # ile başlayan satırlar) okumanız, özelleştirmeniz için çok önemli.
Script'i kaydedip çıkın (`Ctrl+X`, `Y`, `Enter`). Ardından çalıştırma izni verelim:
ÖNEMLİ NOT: Script'teki `MYSQL_USER` ve `MYSQL_PASSWORD` için özel bir MySQL kullanıcısı oluşturmalısınız. MySQL'e root ile bağlanıp şu komutları çalıştırın:
2. Adım: Cron ile Otomasyon Sağlayalım
Artık script'imiz hazır. Şimdi onu her gece 03:00'te çalıştıracak bir cron job ekleyelim.
Dosyanın en altına şu satırı ekleyin (Eğer nano kullanıyorsanız, ekleyip `Ctrl+X`, `Y`, `Enter` ile kaydedin):
3. Adım: Kurtarma (Restore) Script'imizi Yazalım
Yedek almak kadar, geri yüklemek de kritiktir. `/usr/local/bin/` altında bir kurtarma script'i daha oluşturalım.
Bu script'e de çalıştırma izni verelim:
UYARI: Bu kurtarma script'i, veritabanlarını SİLİP yeniden oluşturarak yükler. Canlı sisteminizde denemeden önce, bir test ortamında mutlaka deneyin!
4. Adım: Test ve İzleme
Her şey hazır! İlk testi manuel yapalım:
`/backup` dizini altında yeni bir tarihli klasör oluştuğunu ve içinde `.tar.gz` ve `.sql.gz` dosyalarının olduğunu kontrol edin. Log'u da okuyabilirsiniz:
Sonraki Adımlar ve Geliştirmeler
Temel sistemimiz hazır! Bu sistemi daha da güçlendirmek için:
İşte bu kadar! Artık geceleri daha rahat uyuyabilirsiniz çünkü sunucunuz sizin için otomatik olarak çalışıyor.
Peki ya siz? Yedekleme stratejinizde en çok hangi senaryoya hazırlıklısınız? Veritabanı çökmesi mi, yanlışlıkla silinen dosyalar mı, yoksa tam bir sunucu felaketi mi? Yorumlarda deneyimlerinizi paylaşın, hep birlikte öğrenelim!
Selam sistemciler!
Neden sadece manuel `tar` komutu yetmez? Çünkü insanız ve unuturuz! Bu rehberde, yedeklerin otomatik alınmasını, eski yedeklerin temizlenmesini ve en önemlisi, yedekten tek tıkla geri dönüş yapabilmeyi öğreneceğiz.
Hazırlık ve Planlama
İşe, neyi yedekleyeceğimizi planlayarak başlayalım. Genellikle kritik olan üç ana bileşen vardır:
- Dosya Sistemleri: Web sitenizin dosyaları (/var/www/html), kullanıcı ev dizinleri, özel konfigürasyon dosyaları (/etc altındaki özelleştirdikleriniz).
- Veritabanları: MySQL/MariaDB veya PostgreSQL veritabanlarınız.
- Konfigürasyonlar: Tüm sistem ayarlarınız (isteğe bağlı, ancak tavsiye edilir).
Yedeklerimizi nereye alacağız? İdeal olan, sunucunuzdan fiziksel olarak farklı bir yere (harici bir sunucuya, S3/Backblaze B2 gibi bir bulut depolama servisine) kopyalamaktır. Bugünlük, aynı sunucuda farklı bir dizine almayı göstereceğim, ancak script'i kolayca uzak bir sunucuya `scp` veya `rclone` ile gönderecek şekilde genişletebilirsiniz.
1. Adım: Yedekleme Script'imizi Yazalım
`/usr/local/bin/` altında, çalıştırılabilir bir bash script'i oluşturacağız.
Bash:
sudo nano /usr/local/bin/sunucu-yedekle.sh
Aşağıdaki script'i içine yapıştırın. Açıklamaları ( # ile başlayan satırlar) okumanız, özelleştirmeniz için çok önemli.
Bash:
#!/bin/bash
# --- KONFİGÜRASYON AYARLARI ---
BACKUP_DIR="/backup" # Yedeklerin ana klasörü
RETENTION_DAYS="7" # Kaç günlük yedek tutulacak? (7 = 1 hafta)
# Yedeklenecek dizinler (boşlukla ayırın)
SOURCE_DIRS="/var/www/html /etc/nginx/sites-available /etc/letsencrypt"
# MySQL yedekleme için kullanıcı bilgileri
MYSQL_USER="yedekleme_kullanici"
MYSQL_PASSWORD="CokGucluBirSifreBuraya"
MYSQL_HOST="localhost"
# --- SCRIPT BAŞLANGICI - AYARI DEĞİŞTİRMEYİN ---
TODAY=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$TODAY"
# Yedek klasörünü oluştur
mkdir -p "$BACKUP_PATH"
echo "$(date) - Yedekleme işlemi başladı..." >> "$BACKUP_DIR/backup.log"
# 1. DOSYA SİSTEMİ YEDEĞİ
echo "Dosya sistemi yedekleniyor..."
for DIR in $SOURCE_DIRS; do
if [ -d "$DIR" ]; then
BASENAME=$(basename $DIR)
tar -czf "$BACKUP_PATH/files_${BASENAME}.tar.gz" "$DIR" 2>/dev/null
echo " -> $DIR tamamlandı." >> "$BACKUP_DIR/backup.log"
fi
done
# 2. MYSQL VERİTABANI YEDEĞİ
echo "MySQL veritabanları yedekleniyor..."
DATABASES=$(mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
for DB in $DATABASES; do
mysqldump --single-transaction --quick -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST "$DB" | gzip > "$BACKUP_PATH/db_${DB}.sql.gz"
echo " -> Veritabanı: $DB tamamlandı." >> "$BACKUP_DIR/backup.log"
done
# 3. ESKİ YEDEKLERİ SİL (RETENTION POLICY)
echo "Eski yedekler temizleniyor..."
find "$BACKUP_DIR" -maxdepth 1 -type d -name "202*" -mtime +$RETENTION_DAYS -exec rm -rf {} \; 2>/dev/null
echo "$(date) - Yedekleme işlemi başarıyla tamamlandı. Yedek: $BACKUP_PATH" >> "$BACKUP_DIR/backup.log"
echo "✅ Yedekleme tamamlandı: $BACKUP_PATH"
Script'i kaydedip çıkın (`Ctrl+X`, `Y`, `Enter`). Ardından çalıştırma izni verelim:
Bash:
sudo chmod +x /usr/local/bin/sunucu-yedekle.sh
ÖNEMLİ NOT: Script'teki `MYSQL_USER` ve `MYSQL_PASSWORD` için özel bir MySQL kullanıcısı oluşturmalısınız. MySQL'e root ile bağlanıp şu komutları çalıştırın:
SQL:
CREATE USER 'yedekleme_kullanici'@'localhost' IDENTIFIED BY 'CokGucluBirSifreBuraya';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'yedekleme_kullanici'@'localhost';
FLUSH PRIVILEGES;
2. Adım: Cron ile Otomasyon Sağlayalım
Artık script'imiz hazır. Şimdi onu her gece 03:00'te çalıştıracak bir cron job ekleyelim.
Bash:
sudo crontab -e
Dosyanın en altına şu satırı ekleyin (Eğer nano kullanıyorsanız, ekleyip `Ctrl+X`, `Y`, `Enter` ile kaydedin):
Bash:
# Her gece saat 03:00'te sunucu yedeklemesini çalıştır
0 3 * * * /usr/local/bin/sunucu-yedekle.sh
3. Adım: Kurtarma (Restore) Script'imizi Yazalım
Yedek almak kadar, geri yüklemek de kritiktir. `/usr/local/bin/` altında bir kurtarma script'i daha oluşturalım.
Bash:
sudo nano /usr/local/bin/yedekten-geri-yukle.sh
Bash:
#!/bin/bash
BACKUP_DIR="/backup"
echo "Mevcut yedek klasörleri:"
ls -1t $BACKUP_DIR | grep -E "^202[0-9]+_" | head -10
echo ""
echo "Geri yüklemek istediğiniz yedek tarihini tam olarak yazın (örn: 20231015_030005):"
read RESTORE_DATE
RESTORE_PATH="$BACKUP_DIR/$RESTORE_DATE"
if [ ! -d "$RESTORE_PATH" ]; then
echo "❌ Hata: Belirtilen tarihte yedek bulunamadı!"
exit 1
fi
echo ""
echo "Geri yükleme işlemi başlatılacak: $RESTORE_PATH"
echo "Bu işlem MEVCUT verilerin ÜZERİNE yazacaktır!"
echo "Devam etmek istiyor musunuz? (Evet için 'y' yazın):"
read CONFIRM
if [ "$CONFIRM" != "y" ]; then
echo "İşlem iptal edildi."
exit 0
fi
# 1. DOSYALARI GERİ YÜKLE
echo "Dosyalar geri yükleniyor..."
for BACKUP_FILE in $RESTORE_PATH/files_*.tar.gz; do
if [ -f "$BACKUP_FILE" ]; then
echo " -> $BACKUP_FILE yükleniyor..."
tar -xzf "$BACKUP_FILE" -C /
fi
done
# 2. VERİTABANLARINI GERİ YÜKLE
echo "Veritabanları geri yükleniyor..."
for DB_BACKUP in $RESTORE_PATH/db_*.sql.gz; do
if [ -f "$DB_BACKUP" ]; then
DB_NAME=$(basename $DB_BACKUP | sed 's/db_//' | sed 's/.sql.gz//')
echo " -> Veritabanı: $DB_NAME yükleniyor..."
# Önce veritabanını sil ve yeniden oluştur (DİKKAT!)
mysql -e "DROP DATABASE IF EXISTS \`$DB_NAME\`; CREATE DATABASE \`$DB_NAME\`;"
gunzip < "$DB_BACKUP" | mysql "$DB_NAME"
fi
done
echo "✅ Geri yükleme işlemi tamamlandı! Lütfen servisleri kontrol edin (nginx, mysql, php)."
echo "Örnek: sudo systemctl restart nginx mysql"
Bu script'e de çalıştırma izni verelim:
Bash:
sudo chmod +x /usr/local/bin/yedekten-geri-yukle.sh
UYARI: Bu kurtarma script'i, veritabanlarını SİLİP yeniden oluşturarak yükler. Canlı sisteminizde denemeden önce, bir test ortamında mutlaka deneyin!
4. Adım: Test ve İzleme
Her şey hazır! İlk testi manuel yapalım:
Bash:
sudo /usr/local/bin/sunucu-yedekle.sh
`/backup` dizini altında yeni bir tarihli klasör oluştuğunu ve içinde `.tar.gz` ve `.sql.gz` dosyalarının olduğunu kontrol edin. Log'u da okuyabilirsiniz:
Bash:
tail -f /backup/backup.log
Sonraki Adımlar ve Geliştirmeler
Temel sistemimiz hazır! Bu sistemi daha da güçlendirmek için:
- Uzak Depolama: Script'in sonuna `rclone copy $BACKUP_PATH remote:backup-folder` gibi bir komut ekleyerek yedeklerinizi Google Drive, AWS S3 gibi yerlere anında yükleyebilirsiniz.
- Bildirim: Yedekleme tamamlandığında veya başarısız olduğunda size e-posta veya Telegram bildirimi göndermesi için `curl` komutları ekleyin.
- Şifreleme: Çok hassas yedekler için `gpg` ile şifreleme yapabilirsiniz.
İşte bu kadar! Artık geceleri daha rahat uyuyabilirsiniz çünkü sunucunuz sizin için otomatik olarak çalışıyor.
Peki ya siz? Yedekleme stratejinizde en çok hangi senaryoya hazırlıklısınız? Veritabanı çökmesi mi, yanlışlıkla silinen dosyalar mı, yoksa tam bir sunucu felaketi mi? Yorumlarda deneyimlerinizi paylaşın, hep birlikte öğrenelim!