Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Ubuntu Sunucuda Tam Otomatik Yedekleme ve Kurtarma Sistemi Kurulum Rehberi 💾

devron

Üye
Katılım
14 Mart 2026
Mesajlar
8
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:
  • 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! 💬
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri