Linux Sunucuda rsync ve cron ile Otomatik Yedekleme Rehberi

Yaklaşık 3 dakikalık okuma

Küçük İşletmelerin En Büyük IT Hatası: Yedek Almadan Çalışmak yazısında yedeğin neden vazgeçilmez olduğunu anlatmıştım. Bu yazıda işin pratik tarafına geçiyoruz: bir Linux sunucudaki dosyaları ve veritabanını rsync ve cron ile her gece otomatik olarak başka bir sunucuya yedeklemek.

Neden rsync?

rsync, dosyaları kopyalarken yalnızca değişen kısımları aktarır. İlk yedek uzun sürse de sonraki yedekler genellikle saniyeler içinde tamamlanır. SSH üzerinden çalıştığı için aktarım şifrelidir ve neredeyse her Linux dağıtımında hazır gelir.

Örnek Senaryo

  • Kaynak sunucu: Web sitesi dosyaları /var/www altında, MariaDB veritabanı çalışıyor.
  • Yedek sunucusu: yedek.example.com, yedekler /backup/web1 altında tutulacak.
  • Hedef: Her gece 03:00’te yedek al, son 14 günün veritabanı dökümlerini sakla.

1. Adım: Yedek Sunucusuna Şifresiz Erişim

Otomatik çalışan bir betik parola giremeyeceği için kaynak sunucudan yedek sunucusuna SSH anahtarıyla erişim gerekir. Bu iş için passphrase’siz, yalnızca yedeklemeye özel bir anahtar oluşturun:

ssh-keygen -t ed25519 -f ~/.ssh/yedek_key -N "" -C "web1-yedek"
ssh-copy-id -i ~/.ssh/yedek_key.pub [email protected]

Anahtar konusunu detaylı merak ediyorsanız SSH Anahtar ile Şifresiz Giriş rehberine göz atın. Güvenlik için yedek sunucusunda bu iş için ayrı ve yetkisi kısıtlı bir yedek kullanıcısı açmanızı öneririm.

2. Adım: rsync’i Elle Deneme

Betik yazmadan önce komutu bir kez deneme modunda çalıştırın. --dry-run hiçbir şeyi kopyalamaz, sadece ne yapılacağını gösterir:

rsync -avz --delete --dry-run -e "ssh -i ~/.ssh/yedek_key" /var/www/ [email protected]:/backup/web1/www/

Parametrelerin anlamı:

  • -a (archive): izinleri, sahipliği ve tarihleri koruyarak alt klasörlerle birlikte kopyalar.
  • -v: yapılan işlemleri listeler.
  • -z: aktarım sırasında sıkıştırır.
  • --delete: kaynakta silinen dosyaları hedefte de siler, böylece yedek birebir aynı kalır.

Dikkat: Kaynak yolun sonundaki / önemlidir. /var/www/ klasörün içeriğini, /var/www ise klasörün kendisini kopyalar.

3. Adım: Veritabanı Yedeği

Çalışan bir veritabanının dosyalarını doğrudan kopyalamak tutarsız bir yedek üretebilir. Bunun yerine önce bir döküm (dump) alın:

mysqldump --single-transaction --all-databases | gzip > /var/backups/db/db-$(date +%F).sql.gz

--single-transaction InnoDB tablolarında siteyi kilitlemeden tutarlı bir anlık görüntü alır. Kimlik bilgilerini komut satırına yazmak yerine /root/.my.cnf dosyasında tutun:

[client]
user=yedek_kullanici
password=GucluBirParola

Dosyanın izinlerini mutlaka kısıtlayın: chmod 600 /root/.my.cnf.

4. Adım: Yedekleme Betiği

/usr/local/bin/yedekle.sh adıyla aşağıdaki betiği oluşturun:

#!/bin/bash
set -euo pipefail

HEDEF="[email protected]:/backup/web1"
SSH="ssh -i /root/.ssh/yedek_key"
DBDIR="/var/backups/db"
LOG="/var/log/yedek.log"

echo "=== $(date '+%F %T') yedek başladı ===" >> "$LOG"

mkdir -p "$DBDIR"
mysqldump --single-transaction --all-databases | gzip > "$DBDIR/db-$(date +%F).sql.gz"

# 14 günden eski veritabanı dökümlerini sil
find "$DBDIR" -name "db-*.sql.gz" -mtime +14 -delete

rsync -az --delete -e "$SSH" /var/www/ "$HEDEF/www/" >> "$LOG" 2>&1
rsync -az -e "$SSH" "$DBDIR/" "$HEDEF/db/" >> "$LOG" 2>&1

echo "=== $(date '+%F %T') yedek bitti ===" >> "$LOG"

Veritabanı klasörü için --delete kullanmadığımıza dikkat edin: böylece kaynakta silinen eski dökümler yedek sunucusunda kalmaya devam eder. Betiği çalıştırılabilir yapıp bir kez elle deneyin:

sudo chmod 700 /usr/local/bin/yedekle.sh
sudo /usr/local/bin/yedekle.sh
sudo tail /var/log/yedek.log

5. Adım: cron ile Zamanlama

root kullanıcısının cron tablosunu açın:

sudo crontab -e

En alta şu satırı ekleyin:

0 3 * * * /usr/local/bin/yedekle.sh

cron ifadesinin beş alanı sırasıyla dakika, saat, ayın günü, ay ve haftanın günüdür. Birkaç örnek:

İfadeAnlamı
0 3 * * *Her gün 03:00
30 2 * * 0Her pazar 02:30
0 */6 * * *6 saatte bir
0 1 1 * *Her ayın 1’i, 01:00

6. Adım: Geri Yüklemeyi Test Edin

Test edilmemiş bir yedek, yedek değil umuttur. Ayda en az bir kez bir dosyayı ve bir veritabanı dökümünü geri yüklemeyi deneyin:

rsync -avz -e "ssh -i ~/.ssh/yedek_key" [email protected]:/backup/web1/www/index.php /tmp/
gunzip < db-2026-10-27.sql.gz | mysql

İkinci komut veritabanlarının üzerine yazar; bu yüzden testi önce ayrı bir test sunucusunda yapın.

3-2-1 Kuralını Unutmayın

Bu kurulumla verinizin iki kopyası iki farklı sunucuda olur. Fidye yazılımı (ransomware) veya yanlışlıkla silme gibi durumlara karşı tam koruma için 3 kopya, 2 farklı ortam, 1 kopya farklı lokasyonda kuralını hedefleyin. Bunun için yedek sunucusunun anlık görüntüsünü (snapshot) alabilir ya da bulut depolamaya üçüncü bir kopya gönderebilirsiniz.

Sonuç

Birkaç satırlık bir betik ve tek bir cron satırıyla sunucunuzun her gece kendiliğinden yedeklenmesini sağlayabilirsiniz. Asıl önemli olan, yedeğin düzenli olarak geri yüklenebildiğini kontrol etmektir.