Rsync ile Otomatik Yedekleme: Temel Kullanım

Yıllar içinde kaç tane “yedek aldım sanıyordum ama aslında almamışım” hikayesi duydum, saymakla bitmez. Birisi production veritabanını siliyor, diğeri yanlış klasörü override ediyor, bir başkası disk arızasıyla tüm veriyi kaybediyor. Ve hepsinin ortak noktası: düzgün kurulmuş bir otomatik yedekleme sistemi yoktu. Bugün bu sorunu kökten çözecek aracı konuşacağız: rsync.

Rsync, “remote sync” kelimelerinin kısaltması ve adı üstünde, dosyaları hem lokal hem de uzak sistemler arasında senkronize etmek için tasarlanmış. Ama onu gerçekten güçlü kılan şey sadece kopyalama yapması değil, delta transfer algoritması kullanması. Yani her seferinde tüm dosyayı göndermek yerine, sadece değişen kısımları aktarıyor. Bu özelliği onu özellikle büyük dosyaların düzenli yedeği için vazgeçilmez kılıyor.

Rsync Neden Bu Kadar Popüler?

Sysadmin dünyasında onlarca yedekleme aracı var. Bacula var, Amanda var, Veeam var, bulut tabanlı çözümler var. Ama rsync hâlâ en çok kullanılan araçlardan biri olmaya devam ediyor. Bunun birkaç somut sebebi var:

  • Hafif ve hızlı: Gereksiz overhead yok, doğrudan iş yapıyor
  • Esnek: Lokal disk, SSH üzerinden uzak sunucu veya rsync daemon ile çalışabiliyor
  • Bant genişliği dostu: Sadece değişiklikler aktarılıyor
  • Checksuma dayalı doğrulama: Dosyaların gerçekten doğru kopyalandığını kontrol ediyor
  • Geniş platform desteği: Linux, macOS, Windows (WSL veya Cygwin ile) üzerinde çalışıyor
  • Ücretsiz ve açık kaynak: Lisans derdi yok

Temel Sözdizimi ve İlk Adımlar

Rsync’in temel kullanımı oldukça basit:

rsync [seçenekler] kaynak hedef

En basit haliyle iki dizini senkronize etmek:

rsync -av /home/kullanici/belgeler/ /mnt/yedek/belgeler/

Burada dikkat etmeniz gereken kritik bir noktar var: kaynak path sonundaki slash (/) karakteri. Bu küçük karakter büyük fark yaratıyor.

  • /home/kullanici/belgeler/ (slash ile): Dizinin içeriğini kopyala
  • /home/kullanici/belgeler (slash olmadan): Dizinin kendisini kopyala

Pratik örnek vermek gerekirse:

# Slash ile: belgeler/ altındaki her şey /mnt/yedek/belgeler/ içine kopyalanır
rsync -av /home/ali/belgeler/ /mnt/yedek/belgeler/

# Slash olmadan: belgeler klasörünün kendisi /mnt/yedek/ içine kopyalanır
# Yani /mnt/yedek/belgeler/ oluşturulur
rsync -av /home/ali/belgeler /mnt/yedek/

En Önemli Parametreler

Rsync’in çok sayıda parametresi var ama günlük hayatta en çok kullanacaklarınız şunlar:

  • -a (–archive): Arşiv modu. İzinleri, sahipliği, zaman damgalarını ve sembolik linkleri korur. Neredeyse her zaman bu parametreyi kullanacaksınız
  • -v (–verbose): Ne yapıldığını göster. Debug için faydalı
  • -z (–compress): Transfer sırasında sıkıştır. Yavaş bağlantılarda işe yarar
  • -h (–human-readable): Boyutları okunabilir formatta göster (MB, GB gibi)
  • -P: İlerleme çubuğu göster ve yarım kalan transferi devam ettirebilir
  • –delete: Kaynakta silinmiş dosyaları hedeften de sil. Mirror için gerekli
  • –exclude: Belirli dosya veya dizinleri hariç tut
  • -n (–dry-run): Gerçekten kopyalama yapma, sadece ne yapacağını göster
  • –backup: Üzerine yazılacak dosyaları yedekle
  • –backup-dir: Yedeklenen eski dosyaların nereye kaydedileceği
  • -e: Kullanılacak remote shell’i belirt (genellikle SSH için)
  • –bwlimit: Bant genişliği sınırı koy (KB/s cinsinden)
  • –checksum: Zaman damgası yerine checksum ile değişiklik kontrolü yap
  • –stats: Transfer istatistiklerini göster

SSH Üzerinden Uzak Yedekleme

Rsync’in en güçlü kullanım senaryolarından biri SSH tüneli üzerinden uzak sunuculara yedek almak. Önce SSH key-based authentication kurmanız gerekiyor, yoksa her seferinde şifre girmeniz gerekir ve bu otomasyonu zorlaştırır.

# SSH key oluştur (eğer yoksa)
ssh-keygen -t ed25519 -C "yedekleme-anahtari"

# Public key'i uzak sunucuya kopyala
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

Sonra rsync’i SSH üzerinden kullanabilirsiniz:

rsync -avz -e "ssh -p 2222 -i ~/.ssh/id_ed25519" 
    /var/www/html/ 
    [email protected]:/mnt/yedek/web/

Burada -e "ssh -p 2222" ile özel SSH portu belirtiyoruz. Production ortamlarında 22 portunu genellikle değiştirdiğiniz için bu parametre oldukça kullanışlı.

Gerçek Dünya Senaryosu 1: Web Sunucusu Yedeği

Diyelim ki bir web sunucunuz var ve her gece /var/www/html ile veritabanı dump dosyalarını yedeklemek istiyorsunuz. Ayrıca log dosyalarını ve geçici dosyaları yedeklemek istemiyorsunuz.

#!/bin/bash

# web-yedek.sh
KAYNAK="/var/www/html/"
HEDEF="[email protected]:/mnt/yedekler/web/"
LOG_DOSYASI="/var/log/rsync-yedek.log"
TARIH=$(date +"%Y-%m-%d %H:%M:%S")

echo "[$TARIH] Yedekleme başlıyor..." >> $LOG_DOSYASI

rsync -avz --delete 
    --exclude="*.log" 
    --exclude="*.tmp" 
    --exclude=".git/" 
    --exclude="node_modules/" 
    --exclude="cache/" 
    -e "ssh -i /root/.ssh/yedek_key -o StrictHostKeyChecking=no" 
    $KAYNAK $HEDEF >> $LOG_DOSYASI 2>&1

if [ $? -eq 0 ]; then
    echo "[$TARIH] Yedekleme başarıyla tamamlandı." >> $LOG_DOSYASI
else
    echo "[$TARIH] HATA: Yedekleme başarısız!" >> $LOG_DOSYASI
    # E-posta bildirimi gönder
    echo "Web sunucu yedeği başarısız!" | mail -s "YEDEKLEME HATASI" [email protected]
fi

Bu script’i çalıştırılabilir yapıp cron’a ekleyelim:

chmod +x /usr/local/bin/web-yedek.sh

# Crontab düzenle
crontab -e

# Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/web-yedek.sh

Gerçek Dünya Senaryosu 2: Artımlı Yedekleme (Incremental Backup)

Sadece değişen dosyaları yedeklemek istiyorsanız ve her güne ait ayrı bir yedek klasörü tutmak istiyorsanız, rsync’in --backup ve --backup-dir parametreleri ile çok zarif bir çözüm üretebilirsiniz.

#!/bin/bash

# artimli-yedek.sh
KAYNAK="/home/"
YEDEK_DIZINI="/mnt/yedekler"
BUGUN=$(date +"%Y-%m-%d")
DUN=$(date -d "yesterday" +"%Y-%m-%d")

# Bugünün yedek dizini
BUGUN_DIZIN="$YEDEK_DIZINI/$BUGUN"
# Değişmeyen dosyalar için hardlink kaynağı
LINK_DIZIN="$YEDEK_DIZINI/$DUN"

mkdir -p $BUGUN_DIZIN

rsync -avh --delete 
    --backup 
    --backup-dir="$BUGUN_DIZIN" 
    --link-dest="$LINK_DIZIN" 
    $KAYNAK "$YEDEK_DIZINI/guncel/"

echo "Artımlı yedek tamamlandı: $BUGUN_DIZIN"

--link-dest parametresi burada sihir yapıyor. Değişmemiş dosyalar için hard link oluşturuyor, yani disk alanı harcamadan sanki tam kopya varmış gibi görünüyor. Bu yaklaşımla 30 günlük yedekleri tutarken disk alanını son derece verimli kullanabilirsiniz.

Gerçek Dünya Senaryosu 3: Büyük Dosya Sunucusu Senkronizasyonu

100GB üzerinde veri içeren bir dosya sunucusunu yedekliyorsanız, bant genişliği yönetimi kritik önem taşıyor. Mesai saatlerinde yedekleme trafiğinin ağı boğmasını istemiyorsunuz:

#!/bin/bash

# buyuk-yedek.sh - Büyük dosya sunucusu için optimize edilmiş yedekleme

KAYNAK="/data/dosyalar/"
HEDEF="[email protected]:/volume1/yedekler/dosyalar/"

# Mesai saatlerinde bant genişliği sınırla (09:00-18:00 arası)
SAAT=$(date +%H)
if [ $SAAT -ge 9 ] && [ $SAAT -le 18 ]; then
    BW_LIMIT="--bwlimit=5000"  # 5 MB/s
else
    BW_LIMIT=""  # Gece sınırsız
fi

rsync -avhP 
    --delete 
    --stats 
    --checksum 
    $BW_LIMIT 
    --exclude="*.iso" 
    --exclude="Çöp Kutusu/" 
    -e "ssh -c aes128-ctr -i /root/.ssh/nas_key" 
    $KAYNAK $HEDEF

# Sonuçları raporla
echo "Yedekleme tamamlandı: $(date)" | 
    mail -s "Dosya Sunucusu Yedek Raporu" [email protected]

SSH cipher olarak aes128-ctr seçmek, lokal ağda şifreleme yükünü azaltırken yine de güvenli bir bağlantı sağlıyor. Eğer gerçekten güvenli bir ağdaysanız ve performans kritikse, rsync daemon modunu tercih edebilirsiniz.

Dry-Run ile Güvenli Test

Özellikle --delete parametresi içeren komutları çalıştırmadan önce mutlaka dry-run yapın. Yanlış bir komutla kaynak verinizi silmeniz an meselesi olabilir.

# Önce test et, hiçbir şeyi değiştirme
rsync -avhn --delete 
    --exclude="*.tmp" 
    /home/kullanici/ 
    /mnt/yedek/kullanici/

# Çıktıyı incele, her şey doğruysa gerçekten çalıştır
rsync -avh --delete 
    --exclude="*.tmp" 
    /home/kullanici/ 
    /mnt/yedek/kullanici/

Dry-run çıktısında (DRY RUN) ibaresi görürsünüz ve hangi dosyaların kopyalanacağını, hangilerinin silineceğini önceden görebilirsiniz. Bu alışkanlığı kazanmak sizi çok büyük felaketlerden koruyacak.

Exclude Dosyası Kullanımı

Hariç tutulacak dosyalar çok fazlaysa, bunları komut satırına tek tek yazmak yerine bir dosyaya yazabilirsiniz:

# /etc/rsync/yedek-exclude.txt dosyasını oluştur
cat > /etc/rsync/yedek-exclude.txt << 'EOF'
*.log
*.tmp
*.cache
.git/
.svn/
node_modules/
__pycache__/
*.pyc
.DS_Store
Thumbs.db
/proc/
/sys/
/tmp/
/run/
/dev/
EOF

# Exclude dosyasını kullan
rsync -avh --delete 
    --exclude-from="/etc/rsync/yedek-exclude.txt" 
    /kaynak/ 
    /hedef/

Eski Yedekleri Otomatik Temizleme

Yedek alıyorsunuz güzel, ama disk dolmaya başladığında ne yapacaksınız? Eski yedekleri otomatik temizleyen bir script şart:

#!/bin/bash

# yedek-temizle.sh
YEDEK_DIZINI="/mnt/yedekler"
SAKLA_GUN=30  # 30 günden eski yedekleri sil

echo "30 günden eski yedekler temizleniyor..."

# 30 günden eski dizinleri bul ve sil
find $YEDEK_DIZINI -maxdepth 1 -type d 
    -name "20*" 
    -mtime +$SAKLA_GUN 
    -exec rm -rf {} ;

echo "Kalan yedekler:"
ls -lh $YEDEK_DIZINI

# Disk kullanımını raporla
echo "Toplam disk kullanımı:"
du -sh $YEDEK_DIZINI

Bu script’i de cron’a ekleyebilirsiniz:

# Her gün gece 03:00'te eski yedekleri temizle
0 3 * * * /usr/local/bin/yedek-temizle.sh >> /var/log/yedek-temizle.log 2>&1

Yedeklerinizi Test Edin!

Bu konuyu atlayan sysadmin sayısı inanılmaz derecede fazla. Yedek almak yedeğin yarısı. Diğer yarısı o yedeği gerçekten geri yükleyebilmek. Düzenli aralıklarla yedeklerinizi test etmek için basit bir doğrulama scripti:

#!/bin/bash

# yedek-dogrula.sh
KAYNAK="/var/www/html"
YEDEK="/mnt/yedekler/web"

echo "Yedek doğrulama başlıyor: $(date)"

# Rsync ile checksum tabanlı karşılaştırma
# Farklı olan dosyalar listelenecek
rsync -avnc --delete 
    $KAYNAK/ 
    $YEDEK/ 
    --out-format="%n" | grep -v "^$" | grep -v "^sending" | grep -v "^sent"

FARKLI=$(rsync -avnc $KAYNAK/ $YEDEK/ 2>&1 | grep -c "^>" )

if [ $FARKLI -gt 0 ]; then
    echo "UYARI: $FARKLI dosya yedekte güncel değil!"
    exit 1
else
    echo "Yedek doğrulama başarılı. Tüm dosyalar güncel."
    exit 0
fi

Rsync Daemon Modu

Özellikle iç ağda çok sayıda sunucudan merkezi bir yedekleme noktasına veri topluyorsanız, SSH overhead’inden kurtulmak için rsync daemon modunu kullanabilirsiniz. Bu mod, yüksek hacimli transferlerde belirgin performans avantajı sağlar.

# /etc/rsyncd.conf dosyasını oluştur
cat > /etc/rsyncd.conf << 'EOF'
uid = rsync
gid = rsync
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log

[yedekler]
    path = /mnt/yedekler
    comment = Merkezi Yedekleme Noktasi
    read only = no
    list = no
    auth users = yedekci
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.1.0/24
EOF

# Şifre dosyasını oluştur
echo "yedekci:guclu_sifre_buraya" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets

# Servisi başlat
systemctl enable rsync
systemctl start rsync

İstemci tarafından bağlanmak için:

rsync -avh --password-file=/etc/rsync.password 
    /data/ 
    yedekci@yedek-sunucu::yedekler/sunucu1/

Sistem Geneli Yedekleme Örneği

Tüm bir Linux sistemini yedeklemek istiyorsanız, bazı dizinleri mutlaka hariç tutmanız gerekiyor:

rsync -aAXvh 
    --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","lost+found"} 
    / 
    root@yedek-sunucu:/mnt/tam-yedek/sunucu-adi/

# -A: ACL'leri koru
# -X: Extended attribute'ları koru

Sonuç

Rsync, doğru yapılandırıldığında yıllar boyu sorunsuz çalışan, güvenilir bir yedekleme omurgası oluşturabilir. Basit syntax’ı, delta transfer algoritması ve SSH entegrasyonu ile hem küçük bir VPS’in hem de kurumsal bir dosya sunucusunun yedeğini aynı kolaylıkla alabiliyor.

Bugün anlattıklarımı özetleyecek olursam: -avh ile başlayın, --dry-run ile test edin, --delete kullanırken dikkatli olun ve SSH key authentication’ı ihmal etmeyin. Ardından bu işi cron ile otomatize edin, log tutun ve en önemlisi yedeklerinizi düzenli olarak test edin.

Yedekleme sistemi kurmak bir kerelik iş değil, sürekli bakım gerektiren bir süreç. Log dosyalarınızı takip edin, zaman zaman --stats çıktısına bakın, disk doluluk seviyenizi izleyin. Ve her şeyden önemlisi: bir sonraki felaket anında “yedek vardı, geri döndük” diyebilmek için bu işi ciddiye alın. Çünkü en iyi yedek sistemi, ihtiyaç duyulmadan önce kurulmuş olanıdır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir