Linux Otomatik Yedekleme
Sunucu Yönetimi

Linux Sunucuda Otomatik Yedekleme: tar, rsync ve cron Rehberi

Linux VDS veya dedicated sunucunuzda dosya ve veritabanlarını tar, rsync ve cron ile otomatik yedekleyin; eski yedekleri silin ve uzak sunucuya kopyalayın.

  • MerkezHost Teknik Ekibi
  • 4 dk okuma
  • Seviye: Orta
  • Güncelleme:

Disk arızası, hatalı bir komut, güncelleme sonrası bozulan bir site veya bir saldırı... Hepsinin ortak çözümü düzenli ve test edilmiş yedektir. Bu rehberde bir Linux VDS veya dedicated sunucuda web dosyalarını ve veritabanlarını tar, rsync ve cron ile otomatik yedekleyen, eski yedekleri silen ve yedekleri uzak bir sunucuya kopyalayan bir sistem kuruyoruz.

3-2-1 yedekleme kuralı

Güvenilir bir yedekleme stratejisinin özeti:

  • 3 kopya veri (1 asıl + 2 yedek),
  • 2 farklı ortamda,
  • 1 kopya farklı bir konumda (başka sunucu veya bulut depolama).
Önemli

Yedekleri yalnızca aynı sunucuda tutmak yedek sayılmaz. Disk arızasında veya sunucunun ele geçirilmesi durumunda yedekler de kaybolur. Bu rehberde yedekleri mutlaka ikinci bir sunucuya da kopyalıyoruz.

1. Adım: Yedek klasörünü hazırlayın

sudo mkdir -p /backup/{files,db}
sudo chmod 700 /backup

2. Adım: Web dosyalarını tar ile arşivleyin

Önce komutu elle deneyelim. Aşağıdaki komut /var/www dizinini tarihli ve sıkıştırılmış bir arşive dönüştürür:

sudo tar -czf /backup/files/www-$(date +%F).tar.gz -C / var/www

Arşivin içeriğini kontrol etmek için:

tar -tzf /backup/files/www-$(date +%F).tar.gz | head

3. Adım: Veritabanlarını yedekleyin

Veritabanı yedeği için şifreyi komut satırına yazmak yerine yalnızca root'un okuyabildiği bir dosyada tutun:

sudo nano /root/.my.cnf
[client]
user=yedek_kullanici
password=GucluBirSifre
sudo chmod 600 /root/.my.cnf

Tüm veritabanlarını tek dosyada, tutarlı şekilde yedekleyin:

sudo mysqldump --all-databases --single-transaction --routines --events | gzip > /backup/db/all-$(date +%F).sql.gz

mysqldump seçeneklerinin ayrıntıları ve geri yükleme için MySQL yedekleme rehberimize bakın.

4. Adım: Yedekleme betiğini oluşturun

Tüm adımları tek bir betikte birleştirelim:

sudo nano /usr/local/bin/yedekle.sh
#!/bin/bash
set -euo pipefail

TARIH=$(date +%F)
HEDEF=/backup
SAKLA_GUN=7

# 1) Web dosyaları
tar -czf "$HEDEF/files/www-$TARIH.tar.gz" -C / var/www

# 2) Veritabanları
mysqldump --all-databases --single-transaction --routines --events | gzip > "$HEDEF/db/all-$TARIH.sql.gz"

# 3) Eski yedekleri sil
find "$HEDEF" -type f -name "*.gz" -mtime +"$SAKLA_GUN" -delete

# 4) Uzak sunucuya kopyala
rsync -az --delete -e "ssh -p 22" "$HEDEF/" yedek@YEDEK_SUNUCU_IP:/backup/$(hostname)/

echo "[$(date '+%F %T')] Yedekleme tamamlandı"
sudo chmod 700 /usr/local/bin/yedekle.sh

5. Adım: Uzak sunucuya şifresiz rsync bağlantısı

Betik çalışırken parola sorulmaması için root kullanıcısına bir SSH anahtarı oluşturup yedek sunucusuna ekleyin:

sudo ssh-keygen -t ed25519 -f /root/.ssh/yedek_key -N ""
sudo ssh-copy-id -i /root/.ssh/yedek_key.pub yedek@YEDEK_SUNUCU_IP

Betikteki rsync satırını bu anahtarı kullanacak şekilde güncelleyin:

rsync -az --delete -e "ssh -i /root/.ssh/yedek_key -p 22" "$HEDEF/" yedek@YEDEK_SUNUCU_IP:/backup/$(hostname)/
Güvenlik ipucu

Yedek sunucusundaki yedek kullanıcısını sudo yetkisi olmayan, yalnızca yedek klasörüne yazabilen bir kullanıcı olarak oluşturun. SSH sıkılaştırması için SSH güvenliği rehberimize göz atın.

6. Adım: cron ile otomatikleştirin

sudo crontab -e

Her gece saat 03:30'da çalıştırmak ve çıktıyı loglamak için şu satırı ekleyin:

30 3 * * * /usr/local/bin/yedekle.sh >> /var/log/yedekle.log 2>&1
cron ifadesiAnlamı
30 3 * * *Her gün 03:30
0 */6 * * *6 saatte bir
0 4 * * 0Her pazar 04:00
0 2 1 * *Her ayın 1'i 02:00

Betiği beklemeden bir kez elle çalıştırıp hata olmadığını doğrulayın:

sudo /usr/local/bin/yedekle.sh
ls -lh /backup/files /backup/db

7. Adım: Geri yüklemeyi test edin

Test edilmemiş yedek, yedek değildir. Ayda bir kez yedeklerinizi ayrı bir klasöre açarak kontrol edin:

mkdir -p /tmp/test-geri-yukleme
tar -xzf /backup/files/www-2026-10-20.tar.gz -C /tmp/test-geri-yukleme
ls /tmp/test-geri-yukleme/var/www

Veritabanı yedeğinin bütünlüğünü kontrol etmek için:

gunzip -t /backup/db/all-2026-10-20.sql.gz && echo "Arşiv sağlam"

Sık yapılan hatalar

  • Yedeklerin aynı diskte durması ve uzak kopyanın olmaması.
  • Disk dolduğunda yedeklerin sessizce başarısız olması: df -h ile disk alanını izleyin.
  • cron'un farklı bir ortam (PATH) kullandığını unutmak: betikte komutların tam yolunu kullanmak sorunları önler.
  • Hiç geri yükleme testi yapmamak.

Sonuç

Bu kurulumla sunucunuz her gece web dosyalarını ve veritabanlarını otomatik yedekler, 7 günden eski yedekleri temizler ve bir kopyayı uzak sunucuya gönderir. İkinci bir yedek sunucusu için uygun maliyetli VDS sunucularımızı kullanabilirsiniz.

Sık Sorulan Sorular

Yedekleri aynı sunucuda tutmak yeterli mi?

Hayır. Disk arızası veya saldırı durumunda yedekler de kaybolabilir. En az bir kopyayı farklı bir sunucuda veya depolama hizmetinde tutun.

Yedeklerimi ne sıklıkla almalıyım?

Sık değişen siteler ve veritabanları için günlük yedek önerilir. Yedeklerin gerçekten geri yüklenebildiğini düzenli aralıklarla test edin.

rsync ile scp arasındaki fark nedir?

rsync yalnızca değişen dosyaları aktarır, kesilen aktarıma kaldığı yerden devam eder ve silme senkronizasyonu yapabilir. Düzenli yedekleme için scp'den çok daha verimlidir.

  • #yedekleme
  • #backup
  • #rsync
  • #cron
  • #tar
  • #linux
Paylaş:
Devamını Okuyun

İlgili Rehberler