NAS ve Uzak Depolama Yedekleme: Kapsamlı rsync Rehberi

Veri kaybı her sistem yöneticisinin kâbusu. Bir gün her şey yolunda, ertesi gün disk çöktü, RAID bozuldu ya da fidye yazılımı tüm dosyaları şifreledi. İşte bu yüzden yedekleme stratejisi sadece “iyi bir fikir” değil, kritik bir zorunluluk. Bu yazıda rsync kullanarak NAS cihazlarına ve uzak depolama sistemlerine nasıl güvenilir, otomatik yedeklemeler kurulacağını, gerçek dünya senaryolarıyla ele alacağız.

rsync Neden Hâlâ Tercih Edilen Araç?

On yılı aşkın süredir sistem yöneticilerinin vazgeçemediği rsync, basit görünümünün arkasında son derece güçlü bir yapıya sahip. Temel avantajı delta transfer algoritması: sadece değişen blokları aktarır. 100 GB’lık bir dizini ikinci kez yedekliyorsanız ve yalnızca 500 MB değişmişse, rsync ağdan sadece o 500 MB’ı geçirir.

Ticari yedekleme yazılımlarının aksine rsync:

  • Açık kaynaklı ve neredeyse her Linux/BSD sistemde kurulu geliyor
  • SSH tüneli üzerinden şifreli aktarım yapabiliyor
  • Bant genişliğini sınırlandırma seçeneği sunuyor
  • Kısmi aktarımları destekliyor, bağlantı kopsa devam edebiliyor
  • NAS, bulut storage, uzak sunucu gibi her türlü hedefle çalışıyor

Temel rsync Sözdizimi ve Kritik Parametreler

Önce temelleri sağlam atalım. rsync’in genel yapısı şöyle:

rsync [seçenekler] kaynak hedef

Gerçek işlerde en çok kullandığım parametre kombinasyonu:

rsync -avz --progress --delete kaynak/ hedef/

Bu parametrelerin her biri ne anlama geliyor:

  • -a (archive): Recursive kopyalama, sembolik linkler, izinler, zaman damgaları ve sahiplik bilgilerini korur
  • -v (verbose): Aktarılan dosyaları gösterir
  • -z (compress): Aktarım sırasında sıkıştırma yapar, WAN bağlantılarında bant genişliği tasarrufu sağlar
  • –progress: Her dosya için anlık ilerleme gösterir
  • –delete: Kaynakta silinmiş dosyaları hedefte de siler (senkronizasyon için şart)
  • -n veya –dry-run: Gerçekte hiçbir şey yapmaz, sadece ne yapacağını gösterir
  • –exclude: Belirtilen pattern’e uyan dosya/dizinleri atlar
  • –bwlimit=KBPS: Bant genişliği sınırı koyar
  • –checksum: Boyut/zaman yerine MD5 checksum ile değişiklik kontrolü yapar
  • –partial: Yarıda kesen aktarımları saklar, sonra devam eder

Yeni bir yedekleme scripti yazmadan önce her zaman --dry-run ile test edin. Kaç dosyanın etkileneceğini, ne kadar veri aktarılacağını önceden görürsünüz.

NAS’a rsync ile Yedekleme

Senaryo 1: Synology NAS’a SSH ile Yedekleme

Ofiste Synology NAS kullananların büyük çoğunluğu, NAS’ın web arayüzündeki yedekleme araçlarıyla sınırlı kalıyor. Oysa rsync ile çok daha esnek bir yapı kurabilirsiniz.

Önce NAS üzerinde SSH erişimini ve rsync daemon’unu aktif edin (Synology: Control Panel > Terminal & SNMP > SSH). Ardından Linux sunucunuzdan:

rsync -avz --delete 
  --exclude='*.tmp' 
  --exclude='.Trash-*' 
  --log-file=/var/log/rsync-nas.log 
  /data/web/ 
  [email protected]:/volume1/backups/web/

Bu komut /data/web/ dizinini NAS’taki /volume1/backups/web/ konumuna yedekler. --log-file parametresi ile her aktarımın kaydını tutuyoruz, bu ileride sorun giderme için hayat kurtarır.

Senaryo 2: SSH Anahtar Tabanlı Kimlik Doğrulama Kurulumu

Otomatik yedeklemeler için parola sormayan SSH bağlantısı şart. Önce anahtar çifti oluşturun:

# Yedekleme için özel bir SSH anahtarı oluşturun
ssh-keygen -t ed25519 -C "backup-server-2024" -f ~/.ssh/id_backup_nas

# Public anahtarı NAS'a kopyalayın
ssh-copy-id -i ~/.ssh/id_backup_nas.pub [email protected]

Şimdi rsync bu anahtarı kullanacak şekilde ayarlayın:

rsync -avz 
  -e "ssh -i ~/.ssh/id_backup_nas -p 22" 
  /data/kritik/ 
  backup@nas-ip:/volume1/yedekler/

Güvenlik açısından önemli bir not: NAS’ta bu anahtar için authorized_keys dosyasına komut kısıtlaması ekleyebilirsiniz. Böylece bu anahtar sadece rsync komutunu çalıştırabilir, başka hiçbir şey yapamaz.

Uzak Sunucuya Incremental Yedekleme

Hard Link Tabanlı Snapshot Yedekleme

Bu teknik, tam yedekleme boyutunda yer kaplamadan her gün tam bir yedek kopyası görünümü sağlar. İlk kez duyuyorsanız sihir gibi gelebilir ama mekanizması çok basit: değişmeyen dosyalar için hard link kullanılır, disk üzerinde tek kopya tutulur.

#!/bin/bash

# Snapshot yedekleme scripti
KAYNAK="/data/production/"
HEDEF="backup@uzak-sunucu:/backups/production"
TARIH=$(date +%Y-%m-%d_%H-%M)
LOG="/var/log/yedekleme/snapshot-${TARIH}.log"

# Log dizini yoksa oluştur
mkdir -p /var/log/yedekleme

rsync -avz 
  --delete 
  --link-dest="${HEDEF}/latest" 
  --log-file="${LOG}" 
  -e "ssh -i /root/.ssh/id_backup" 
  "${KAYNAK}" 
  "${HEDEF}/${TARIH}/"

# Latest symlink'i güncelle
ssh -i /root/.ssh/id_backup backup@uzak-sunucu 
  "ln -sfn /backups/production/${TARIH} /backups/production/latest"

echo "Yedekleme tamamlandi: ${TARIH}" | mail -s "Yedek Raporu" [email protected]

--link-dest parametresi bu işlemin kalbi. Önceki yedekle (latest) karşılaştırır, değişmeyen dosyalar için sadece hard link oluşturur. 30 günlük yedek tuttuğunuzda, disk kullanımı en fazla toplam değişim kadar artar.

Bant Genişliği Yönetimi ile Yedekleme

Üretim ortamında yedekleme trafiği kritik servisleri etkilememeli. Mesai saatlerinde bant genişliği kısıtlaması uygulayan bir script:

#!/bin/bash

SAAT=$(date +%H)
KAYNAK="/var/www/html/"
HEDEF="[email protected]:/backups/web/"

# Mesai saatlerinde (08-18) bant genişliğini sınırla
if [ "$SAAT" -ge 8 ] && [ "$SAAT" -lt 18 ]; then
  BWLIMIT="--bwlimit=5120"  # 5 MB/s
  echo "Mesai saati: bant genişliği 5MB/s ile sınırlandırıldı"
else
  BWLIMIT=""  # Gece kısıtsız çalış
  echo "Mesai dışı: kısıtsız aktarım"
fi

rsync -avz 
  ${BWLIMIT} 
  --delete 
  --partial 
  --timeout=120 
  -e "ssh -i /root/.ssh/id_backup -o ConnectTimeout=30" 
  "${KAYNAK}" 
  "${HEDEF}"

rsync Daemon Kullanımı

SSH yerine rsync daemon kullanmak, özellikle büyük transferlerde performans avantajı sağlar. SSH kriptografik yükü olmadan çalışır, ancak güvenli bir iç ağda tercih edin.

NAS veya yedek sunucuda /etc/rsyncd.conf dosyası:

# /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = yes
max connections = 4
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log

[web-yedek]
path = /backups/web
comment = Web Sunucu Yedekleri
read only = false
list = false
auth users = webbackup
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24

[db-yedek]
path = /backups/database
comment = Veritabani Yedekleri
read only = false
auth users = dbbackup
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.50

/etc/rsyncd.secrets dosyası:

webbackup:guclu_sifre_123
dbbackup:baska_guclu_sifre_456
chmod 600 /etc/rsyncd.secrets

İstemci tarafında daemon modunda bağlanmak için çift iki nokta üst üste kullanılır:

rsync -avz --password-file=/etc/rsync.pass 
  /data/web/ 
  webbackup@nas-ip::web-yedek/

Kapsamlı Yedekleme Scripti: Gerçek Dünya Örneği

Birkaç yıldır üretimde kullandığım, hata yönetimi ve bildirimler içeren kapsamlı bir script:

#!/bin/bash
# Üretim Yedekleme Scripti v2.1
# Kullanım: /usr/local/bin/yedekle.sh [web|db|full]

set -euo pipefail

# Yapılandırma
HEDEF_SUNUCU="[email protected]"
SSH_KEY="/root/.ssh/id_ed25519_backup"
LOG_DIR="/var/log/yedekleme"
BILDIRIM_EMAIL="[email protected]"
TARIH=$(date +%Y%m%d_%H%M%S)
HATA_SAYISI=0

# Log fonksiyonu
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_DIR}/yedekleme_${TARIH}.log"
}

# Hata bildirim fonksiyonu
hata_bildir() {
  local MESAJ="$1"
  log "HATA: ${MESAJ}"
  echo "${MESAJ}" | mail -s "[KRITIK] Yedekleme Hatasi - $(hostname)" "${BILDIRIM_EMAIL}"
  HATA_SAYISI=$((HATA_SAYISI + 1))
}

# rsync wrapper fonksiyonu
rsync_yedekle() {
  local AD="$1"
  local KAYNAK="$2"
  local HEDEF="$3"
  local EKSTRA="${4:-}"

  log "${AD} yedeklemesi basliyor: ${KAYNAK} -> ${HEDEF}"

  if rsync -avz 
    --delete 
    --partial 
    --timeout=300 
    ${EKSTRA} 
    -e "ssh -i ${SSH_KEY} -o StrictHostKeyChecking=yes -o ConnectTimeout=30" 
    "${KAYNAK}" 
    "${HEDEF_SUNUCU}:${HEDEF}" 
    >> "${LOG_DIR}/yedekleme_${TARIH}.log" 2>&1; then
    log "${AD} yedeklemesi basariyla tamamlandi"
  else
    hata_bildir "${AD} yedeklemesi basarisiz oldu!"
    return 1
  fi
}

# Log dizinini oluştur
mkdir -p "${LOG_DIR}"

# Bağlantı testi
if ! ssh -i "${SSH_KEY}" -o ConnectTimeout=10 -o BatchMode=yes 
  "${HEDEF_SUNUCU}" "exit" 2>/dev/null; then
  hata_bildir "Yedek sunucusuna baglanilamiyor!"
  exit 1
fi

log "=== Yedekleme basliyor: ${TARIH} ==="

# Web dosyaları yedekle
rsync_yedekle "Web" "/var/www/html/" "/backups/web/current/" 
  "--exclude='*.log' --exclude='cache/' --exclude='tmp/'"

# Konfigürasyon dosyaları
rsync_yedekle "Config" "/etc/" "/backups/configs/etc/" 
  "--exclude='ssl/private/'"

# Home dizinleri
rsync_yedekle "Home" "/home/" "/backups/home/"

# Özet rapor
log "=== Yedekleme tamamlandi. Hata sayisi: ${HATA_SAYISI} ==="

if [ "${HATA_SAYISI}" -eq 0 ]; then
  echo "Tum yedeklemeler basarili - ${TARIH}" | 
    mail -s "[OK] Yedekleme Raporu - $(hostname)" "${BILDIRIM_EMAIL}"
fi

exit ${HATA_SAYISI}

Cron ile Otomatik Zamanlama

Script hazır, şimdi otomatik çalışacak hale getirelim:

# crontab -e ile açın
crontab -e
# Her gece 02:00'de tam yedekleme
0 2 * * * /usr/local/bin/yedekle.sh >> /var/log/yedekleme/cron.log 2>&1

# Her 6 saatte bir web dizini yedekle
0 */6 * * * rsync -avz --delete /var/www/html/ backup@nas:/volume1/web/

# Haftalık tam snapshot (Pazar 03:00)
0 3 * * 0 /usr/local/bin/haftalik-snapshot.sh

# Eski logları temizle (30 günden eski)
0 4 * * 1 find /var/log/yedekleme -name "*.log" -mtime +30 -delete

Yedeklemenin Doğrulanması

Yedekleme yapmak yeterli değil, düzenli olarak test etmek gerekiyor. Birçok ekip yıllarca yedek alıp ihtiyaç duyduğunda dosyaların bozuk olduğunu keşfetti.

#!/bin/bash
# Yedek doğrulama scripti

KAYNAK="/data/kritik/"
YEDEK="backup@nas:/volume1/backups/kritik/"
LOG="/var/log/yedek-dogrulama.log"

echo "=== Dogrulama: $(date) ===" >> "${LOG}"

# Checksum ile karşılaştır
rsync -avnc 
  --checksum 
  -e "ssh -i /root/.ssh/id_backup" 
  "${KAYNAK}" 
  "${YEDEK}" 
  >> "${LOG}" 2>&1

FARK=$(rsync -avnc --checksum 
  -e "ssh -i /root/.ssh/id_backup" 
  "${KAYNAK}" 
  "${YEDEK}" 2>/dev/null | grep -c "^>" || true)

if [ "${FARK}" -gt 0 ]; then
  echo "UYARI: ${FARK} dosya yedekte farklı veya eksik!" | 
    mail -s "Yedek Dogrulama Uyarisi" [email protected]
  echo "${FARK} dosya farklı" >> "${LOG}"
else
  echo "Dogrulama basarili: Tum dosyalar eslesyor" >> "${LOG}"
fi

-n (dry-run) ve --checksum kombinasyonu ile gerçek aktarım yapmadan kaynak ile hedefin ne kadar farklılaştığını görebilirsiniz.

Sık Karşılaşılan Sorunlar ve Çözümleri

Slash farkındalığı: rsync’te kaynak dizinin sonundaki / kritik önem taşır.

  • /data/web/ (sonda slash var): dizinin içeriğini kopyalar
  • /data/web (sonda slash yok): dizinin kendisini kopyalar, yani hedefte web/ klasörü oluşur

Bu farkı karıştırmak beklenmedik dizin yapıları oluşturur.

İzin sorunları: Farklı kullanıcılarla çalışırken --no-perms veya --chmod kullanılabilir:

rsync -avz --no-perms --no-owner --no-group kaynak/ hedef/

Büyük dosya aktarımları için: Sunucu yeniden başlatıldığında aktarım yarıda kalabilir. --partial ve --append-verify birlikte kullanın:

rsync -avz --partial --append-verify büyük-dosya.tar hedef/

“Too many open files” hatası: Çok sayıda küçük dosya içeren dizinlerde karşılaşılır. /etc/security/limits.conf dosyasında nofile limitini artırın:

echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf

Güvenlik Katmanları

Yedekleme scriptlerinin güvenliği sıklıkla ihmal edilen bir alan. Birkaç temel kural:

  • SSH anahtarlarını sadece root’un okuyabileceği şekilde koruyun: chmod 600 ~/.ssh/id_backup
  • NAS veya uzak sunucudaki yedekleme kullanıcısına sadece gerekli dizin üzerinde izin verin
  • rsync daemon kullanıyorsanız hosts allow ile IP kısıtlaması ekleyin
  • Yedek dizinlerini immutable (değiştirilemez) yapın: fidye yazılımı saldırılarına karşı chattr +i /backups veya NAS üzerinde snapshot özelliğini açın
  • SSH bağlantılarında StrictHostKeyChecking=yes kullanın, bilinmeyen host’lara bağlanmayı engelleyin

Sonuç

rsync, on yıllardır sistem yöneticilerinin en güvendiği araçlardan biri olmayı sürdürüyor. Karmaşık yedekleme yazılımlarına binlerce dolar harcamadan, SSH + rsync + cron üçlüsüyle kurumsal kalitede bir yedekleme altyapısı kurabilirsiniz.

Yazıda ele aldığımız konuları özetlemek gerekirse: delta transfer ile bant genişliği verimliliği, hard link tabanlı snapshot yedekleme, SSH anahtar kimlik doğrulama, hata yönetimi içeren üretim kaliteli scriptler ve yedek doğrulama prosedürleri. Bunların hepsini bir arada kullandığınızda hem güvenilir hem de izlenebilir bir yedekleme sistemi elde edersiniz.

En kritik hatırlatma: Alınan yedek, test edilmemiş yedek değildir. Ayda bir düzenli restore testi yapın. İhtiyaç duyduğunuz an değil, ihtiyaç duymadan önce test edin. Çünkü gerçek felaket anında “yedek dosyaları bozukmuş” demek için ikinci şans olmayabilir.

Bir yanıt yazın

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