Ubuntu Sunucuda Tam Otomatik Yedekleme ve Kurtarma Sistemi Kurulum Rehberi 
Selam sistemciler!
Bugün, her sistem yöneticisinin kabusu olan "veri kaybı" ve "sunucu çökmesi" senaryolarına karşı en güçlü kalkanınızı kuracağız: Tam Otomatik Yedekleme ve Kurtarma Sistemi. Artık geceleri rahat uyuyabileceksiniz. 
Neden sadece yedek almak yetmez? Çünkü yedek, geri yükleme yapana kadar sadece bir dosya yığınıdır. Biz ise otomatik, zamanlanmış, versiyon kontrollü ve tek komutla geri dönebilen bir sistem kuracağız. Kullanacağımız ana silahlar: rsync, hard links ve cron.
1. Senaryo ve Araçlarımızı Tanıyalım
Planımız şu:
- Kaynak Sunucu: Yedek almak istediğimiz ana web/mail/veritabanı sunucumuz.
- Hedef Sunucu (Yedek Sunucu): Yedeklerin saklanacağı, mümkünse farklı bir lokasyondaki sunucu. (Aynı sunucuda da yapılabilir ama risklidir!).
- Rsync: Dosya transferi ve senkronizasyonun efendisi. Sadece değişen kısımları transfer ederek bant genişliğinden tasarruf sağlar.
- Hard Links: Aynı disk bloğuna işaret eden farklı dosya isimleri. Her günün tam yedeğini alıyormuş gibi görünürsünüz ama sadece değişen dosyalar yer kaplar. Zaman makinesi gibi!
2. Yedek Sunucusunda Hazırlık (SSH Anahtarı Oluşturma)
Öncelikle, yedek sunucusundan kaynak sunucuya şifresiz SSH erişimi sağlamamız gerekiyor. Yedek sunucusunda oturum açın ve aşağıdaki komutu çalıştırın (e-posta kısmını kendinize göre düzenleyin):
Enter'a basarak varsayılan yolu ve boş parola (passphrase) kabul edin. Ardından, oluşan public key'i kaynak sunucuya kopyalayalım:
Artık yedek sunucusu, kaynak sunucuya parola sormadan bağlanabilecek.
3. Sihirli Yedekleme Script'imizi Yazıyoruz
Yedek sunucusunda, script'imizi oluşturalım. Ben `/usr/local/bin/sunucu-yedekle` yolunu kullanacağım:
İçine aşağıdaki script'i yapıştırın. KIRMIZI ile işaretli yerleri kendi bilgilerinizle değiştirmeyi unutmayın!
Script'e çalıştırma izni verelim:
4. Cron ile Otomasyonu Sağlayalım
Artık bu script'in her gece 02:00'da çalışmasını sağlayalım:
Dosyanın en altına şu satırı ekleyin:
Log dosyasını da oluşturup izin verelim:
5. Yedekleri Test Edelim ve Geri Yükleme Senaryosu
Önce script'i manuel çalıştırarak test edelim:
`/backup/sunucu-yedekleri/` klasörünün altında bugünün tarihli bir klasör oluştuğunu göreceksiniz. İçinde tüm yedekleriniz mevcut.
Geri Yükleme Senaryosu:
Diyelim ki `/var/www` klasörünüzde bir felaket yaşadınız. Yedek sunucusundan, dünkü yedeği geri yüklemek için:
6. Güvenlik ve İleri Seviye İpuçları
İşte bu kadar!
Artık siz de "yedekleme paranoyası"nı yenmiş, otomatikleştirilmiş ve güvenilir bir yedekleme sistemine sahip oldunuz.
Peki siz yedekleme stratejinizde hangi araçları kullanıyorsunuz? Borg Backup, Restic gibi modern araçlara geçiş yapan var mı aranızda? Tecrübelerinizi yorumlarda paylaşın, hep birlikte öğrenelim!
Selam sistemciler!
Neden sadece yedek almak yetmez? Çünkü yedek, geri yükleme yapana kadar sadece bir dosya yığınıdır. Biz ise otomatik, zamanlanmış, versiyon kontrollü ve tek komutla geri dönebilen bir sistem kuracağız. Kullanacağımız ana silahlar: rsync, hard links ve cron.
1. Senaryo ve Araçlarımızı Tanıyalım
Planımız şu:
- Kaynak Sunucu: Yedek almak istediğimiz ana web/mail/veritabanı sunucumuz.
- Hedef Sunucu (Yedek Sunucu): Yedeklerin saklanacağı, mümkünse farklı bir lokasyondaki sunucu. (Aynı sunucuda da yapılabilir ama risklidir!).
- Rsync: Dosya transferi ve senkronizasyonun efendisi. Sadece değişen kısımları transfer ederek bant genişliğinden tasarruf sağlar.
- Hard Links: Aynı disk bloğuna işaret eden farklı dosya isimleri. Her günün tam yedeğini alıyormuş gibi görünürsünüz ama sadece değişen dosyalar yer kaplar. Zaman makinesi gibi!
2. Yedek Sunucusunda Hazırlık (SSH Anahtarı Oluşturma)
Öncelikle, yedek sunucusundan kaynak sunucuya şifresiz SSH erişimi sağlamamız gerekiyor. Yedek sunucusunda oturum açın ve aşağıdaki komutu çalıştırın (e-posta kısmını kendinize göre düzenleyin):
Bash:
ssh-keygen -t ed25519 -C "yedek@backupserver"
Enter'a basarak varsayılan yolu ve boş parola (passphrase) kabul edin. Ardından, oluşan public key'i kaynak sunucuya kopyalayalım:
Bash:
ssh-copy-id root@kaynak_sunucu_ip_adresi
Artık yedek sunucusu, kaynak sunucuya parola sormadan bağlanabilecek.
3. Sihirli Yedekleme Script'imizi Yazıyoruz
Yedek sunucusunda, script'imizi oluşturalım. Ben `/usr/local/bin/sunucu-yedekle` yolunu kullanacağım:
Bash:
sudo nano /usr/local/bin/sunucu-yedekle
İçine aşağıdaki script'i yapıştırın. KIRMIZI ile işaretli yerleri kendi bilgilerinizle değiştirmeyi unutmayın!
Bash:
#!/bin/bash
# ============================
# TAM OTOMATİK YEDEKLEME SCRIPT'I
# ============================
# --- KULLANICI AYARLARI (BURAYI DÜZENLE!) ---
KAYNAK_KULLANICI="root"
KAYNAK_HOST="KAYNAK_SUNUCU_IP_ADRESI" # Burayı değiştir!
KAYNAK_KLASORLER="/home /var/www /etc /root /var/mail" # Yedeklenecek klasörler
HEDEF_ANA_KLASOR="/backup/sunucu-yedekleri"
MYSQL_KULLANICI="MYSQL_KULLANICI_ADINIZ" # Eğer varsa
MYSQL_SIFRE="MYSQL_SIFRENIZ" # Eğer varsa
# --------------------------------------------
# Tarih bilgisini al (örnek: 2023-10-27)
BUGUN=$(date +%Y-%m-%d)
# Hedef klasörü oluştur (yoksa)
HEDEF_KLASOR="$HEDEF_ANA_KLASOR/$BUGUN"
mkdir -p "$HEDEF_KLASOR"
# 1. ADIM: MySQL Veritabanı Yedekleri (Eğer MySQL varsa)
echo "$(date): MySQL yedeklemesi başlıyor..."
if [ -n "$MYSQL_KULLANICI" ] && [ -n "$MYSQL_SIFRE" ]; then
ssh $KAYNAK_KULLANICI@$KAYNAK_HOST "mysqldump -u$MYSQL_KULLANICI -p$MYSQL_SIFRE --all-databases --single-transaction --quick" > "$HEDEF_KLASOR/all-databases-$BUGUN.sql"
echo "MySQL yedeklemesi tamamlandı: $HEDEF_KLASOR/all-databases-$BUGUN.sql"
else
echo "MySQL bilgileri verilmedi, atlanıyor."
fi
# 2. ADIM: Rsync ile Dosya Sistemini Hard Link ile Yedekle
echo "$(date): Rsync yedeklemesi başlıyor..."
# Önceki günün yedeğini bul (hard link için kaynak)
SON_YEDEK=$(ls -td $HEDEF_ANA_KLASOR/*/ | head -n 1)
# Rsync komutumuz
if [ -d "$SON_YEDEK" ] && [ "$SON_YEDEK" != "$HEDEF_KLASOR/" ]; then
# Hard link ile artımlı yedek
rsync -avz --delete \
--link-dest="$SON_YEDEK" \
-e ssh \
$KAYNAK_KULLANICI@$KAYNAK_HOST:"$KAYNAK_KLASORLER" \
"$HEDEF_KLASOR/"
else
# İlk yedek (hard link kaynağı yok)
rsync -avz -e ssh \
$KAYNAK_KULLANICI@$KAYNAK_HOST:"$KAYNAK_KLASORLER" \
"$HEDEF_KLASOR/"
fi
echo "$(date): Yedekleme tamamlandı! Hedef: $HEDEF_KLASOR"
# 3. ADIM: Eski Yedekleri Temizle (30 günden eski olanları sil)
echo "$(date): Eski yedekler temizleniyor..."
find "$HEDEF_ANA_KLASOR" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
echo "30 günden eski yedekler silindi."
Script'e çalıştırma izni verelim:
Bash:
sudo chmod +x /usr/local/bin/sunucu-yedekle
4. Cron ile Otomasyonu Sağlayalım
Artık bu script'in her gece 02:00'da çalışmasını sağlayalım:
Bash:
sudo crontab -e
Dosyanın en altına şu satırı ekleyin:
Bash:
# Her gece saat 02:00'da sunucu yedekleme script'ini çalıştır
0 2 * * * /usr/local/bin/sunucu-yedekle >> /var/log/sunucu-yedekle.log 2>&1
Log dosyasını da oluşturup izin verelim:
Bash:
sudo touch /var/log/sunucu-yedekle.log
sudo chmod 644 /var/log/sunucu-yedekle.log
5. Yedekleri Test Edelim ve Geri Yükleme Senaryosu
Önce script'i manuel çalıştırarak test edelim:
Bash:
sudo /usr/local/bin/sunucu-yedekle
`/backup/sunucu-yedekleri/` klasörünün altında bugünün tarihli bir klasör oluştuğunu göreceksiniz. İçinde tüm yedekleriniz mevcut.
Geri Yükleme Senaryosu:
Diyelim ki `/var/www` klasörünüzde bir felaket yaşadınız. Yedek sunucusundan, dünkü yedeği geri yüklemek için:
Bash:
# Önce, kaynak sunucuda sorunlu klasörü yedekleyip (şüpheciyiz) sonra geri yükle
rsync -avz -e ssh /backup/sunucu-yedekleri/2023-10-26/var/www/ root@kaynak_sunucu_ip_adresi:/var/www/
6. Güvenlik ve İleri Seviye İpuçları
- Yedek Sunucusunu Kilitleyin: Yedek sunucusuna sadece SSH anahtarı ile ve belirli IP'lerden erişime izin verin (`/etc/ssh/sshd_config` dosyasında `AllowUsers` ve `AllowGroups` ayarları).
- Yedekleri Şifreleyin: Çok hassas veriler için rsync öncesi `gpg` ile şifreleme yapabilirsiniz.
- Farklı Lokasyona Yedek: Yedeklerinizi bir bulut depolama alanına (S3 uyumlu) veya başka bir datacenter'a da senkronize edin. `rclone` aracı bu iş için biçilmiş kaftandır.
- Yedek Bütünlüğünü Kontrol Edin: Ayda bir, yedekten rastgele bir dosya/database geri yükleyip çalıştığını test edin.
- Log'u İzleyin: `/var/log/sunucu-yedekle.log` dosyasını düzenli olarak kontrol edin veya başarısız çalışmaları size e-posta ile bildirmesi için cron job'ınızı düzenleyin.
İşte bu kadar!
Peki siz yedekleme stratejinizde hangi araçları kullanıyorsunuz? Borg Backup, Restic gibi modern araçlara geçiş yapan var mı aranızda? Tecrübelerinizi yorumlarda paylaşın, hep birlikte öğrenelim!