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).
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 /backup2. 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/wwwArşivin içeriğini kontrol etmek için:
tar -tzf /backup/files/www-$(date +%F).tar.gz | head3. 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=GucluBirSifresudo chmod 600 /root/.my.cnfTüm veritabanlarını tek dosyada, tutarlı şekilde yedekleyin:
sudo mysqldump --all-databases --single-transaction --routines --events | gzip > /backup/db/all-$(date +%F).sql.gzmysqldump 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.sh5. 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_IPBetikteki 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)/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 -eHer 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 ifadesi | Anlamı |
|---|---|
30 3 * * * | Her gün 03:30 |
0 */6 * * * | 6 saatte bir |
0 4 * * 0 | Her 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/db7. 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/wwwVeritabanı 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 -hile 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.
