WordPress Yedekleme Scripti: rsync ile Tam Yedek
Bir WordPress sitesi çöktüğünde, elinizde iyi bir yedek yoksa yaşadığınız his tarif edilemez. Yıllarca üretilen içerik, özenle yapılandırılan eklentiler, tema özelleştirmeleri… hepsi bir anda gidebilir. Bu yüzden “yedek alıyorum” demek yetmez, doğru yedek almak gerekir. Bu yazıda rsync kullanarak WordPress siteniz için güvenilir, otomatik ve tam bir yedekleme sistemi kuracağız.
Neden rsync?
WordPress yedeklemesi için onlarca eklenti var. UpdraftPlus, BackWPup, Duplicator… Bunlar kullanımı kolay araçlar ama ciddi bir sysadmin olarak sunucunuzu kontrol etmek istiyorsanız, bu işi komut satırından halletmek çok daha sağlıklı. rsync bu konuda neredeyse kusursuz bir araç:
- Delta transfer: Sadece değişen dosyaları kopyalar, bant genişliği ve zaman kazandırır
- Atomik işlemler: Yarım kalmış kopyalamaları temizler
- SSH desteği: Uzak sunucuya şifreli bağlantıyla yedek alabilirsiniz
- Sembolik link takibi: WordPress dizin yapısıyla uyumlu çalışır
- Checksum doğrulama: İstediğinizde dosya bütünlüğünü kontrol eder
Eklenti tabanlı yedeklemelerin bir başka sorunu da şu: WordPress çöktüğünde eklenti de çalışmıyor. Sunucu seviyesinde bir script her zaman çalışır.
WordPress Yedeklemesinin Bileşenleri
Tam bir WordPress yedeği üç ana parçadan oluşur:
- Dosya sistemi:
/var/www/html/wordpressveya benzeri dizin, tüm tema, eklenti ve yüklenen medya dosyaları - Veritabanı: MySQL/MariaDB içindeki tüm yazılar, ayarlar, kullanıcılar, yorumlar
- Yapılandırma dosyaları:
wp-config.php,.htaccess, nginx/apache konfigürasyonları
Bunların herhangi birini atladığınızda yedek eksik kalır. Siteyi geri yüklemeye çalıştığınızda da sorun çıkar.
Temel rsync Parametreleri
Script yazmadan önce kullanacağımız parametreleri anlaşalım:
-a (archive): Arşiv modu, recursive kopyalama, sembolik linkler, izinler, zaman damgaları ve sahiplik bilgilerini korur
-v (verbose): İşlem sırasında hangi dosyaların kopyalandığını gösterir
-z (compress): Transfer sırasında sıkıştırma uygular, ağ üzerinden kopyalamada işe yarar
–delete: Kaynak dizinde silinmiş dosyaları hedef dizinden de siler, aynalama için kritik
–exclude: Belirtilen dosya veya dizinleri kopyalamanın dışında tutar
–link-dest: Bir önceki yedeğe hard link oluşturur, incremental yedekleme için şart
–progress: Her dosyanın ilerleme durumunu gösterir
-e: Uzak bağlantı için kullanılacak shell’i belirtir, SSH için -e ssh
–bwlimit: Bant genişliği sınırı, üretim sunucusunu yavaşlatmamak için kullanışlı
Basit Bir WordPress Dosya Yedeği
İlk scriptimizle başlayalım. Bu script lokal sunucuda çalışır ve WordPress dosyalarını aynı sunucunun farklı bir dizinine kopyalar:
#!/bin/bash
# Temel Değişkenler
WP_ROOT="/var/www/html/wordpress"
BACKUP_DIR="/backup/wordpress/files"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_PATH="${BACKUP_DIR}/${DATE}"
# Dizin oluştur
mkdir -p "${BACKUP_PATH}"
# rsync ile yedekle
rsync -av
--exclude='wp-content/cache/'
--exclude='wp-content/uploads/cache/'
--exclude='.git/'
--exclude='*.log'
"${WP_ROOT}/"
"${BACKUP_PATH}/"
echo "Yedek tamamlandı: ${BACKUP_PATH}"
Bu script çalışır ama her çalıştığında tüm dosyaları kopyalar. 5 GB’lık bir site için bu hem zaman hem disk alanı israfı. Şimdi bunu daha akıllı hale getirelim.
Incremental Yedekleme: Hard Link Yöntemi
rsync’in --link-dest parametresi, bir önceki yedeğe hard link oluşturarak yalnızca değişen dosyaları kopyalar. Bu sayede her yedek sanki tam bir kopya gibi görünür ama disk üzerinde sadece değişen dosyalar yer kaplar. Klasik bir Time Machine mantığı.
#!/bin/bash
# ================================================
# WordPress Incremental Yedekleme Scripti
# Versiyon: 1.0
# ================================================
WP_ROOT="/var/www/html/wordpress"
BACKUP_BASE="/backup/wordpress"
FILES_DIR="${BACKUP_BASE}/files"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
CURRENT_BACKUP="${FILES_DIR}/${DATE}"
LATEST_LINK="${FILES_DIR}/latest"
LOG_FILE="/var/log/wp-backup.log"
# Log fonksiyonu
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}
log "Yedekleme başlıyor..."
# Dizin kontrolü
mkdir -p "${FILES_DIR}"
# Bir önceki yedeği bul
PREVIOUS=""
if [ -L "${LATEST_LINK}" ]; then
PREVIOUS="--link-dest=${LATEST_LINK}"
log "Önceki yedek bulundu: $(readlink ${LATEST_LINK})"
else
log "İlk yedek alınıyor, tam kopyalama yapılacak"
fi
# rsync komutu
rsync -av
--delete
${PREVIOUS}
--exclude='wp-content/cache/'
--exclude='wp-content/uploads/cache/'
--exclude='wp-content/wc-logs/'
--exclude='.git/'
--exclude='*.log'
--exclude='*.tmp'
--exclude='.DS_Store'
"${WP_ROOT}/"
"${CURRENT_BACKUP}/" 2>> "${LOG_FILE}"
RSYNC_EXIT=$?
if [ ${RSYNC_EXIT} -eq 0 ]; then
log "Dosya yedeği başarılı: ${CURRENT_BACKUP}"
# latest sembolik linkini güncelle
ln -snf "${CURRENT_BACKUP}" "${LATEST_LINK}"
else
log "HATA: rsync çıkış kodu ${RSYNC_EXIT}"
exit 1
fi
Veritabanı Yedeği Ekleme
Dosyalar olmadan veritabanı işe yaramaz, veritabanı olmadan dosyalar işe yaramaz. İkisini aynı scriptte birleştirelim:
#!/bin/bash
# ================================================
# WordPress Tam Yedekleme Scripti
# Dosya + Veritabanı
# ================================================
# Konfigürasyon
WP_ROOT="/var/www/html/wordpress"
WP_CONFIG="${WP_ROOT}/wp-config.php"
BACKUP_BASE="/backup/wordpress"
FILES_DIR="${BACKUP_BASE}/files"
DB_DIR="${BACKUP_BASE}/database"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
CURRENT_BACKUP="${FILES_DIR}/${DATE}"
LATEST_LINK="${FILES_DIR}/latest"
LOG_FILE="/var/log/wp-backup.log"
RETENTION_DAYS=30
# Log fonksiyonu
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}
# wp-config.php'den veritabanı bilgilerini çek
get_wp_config() {
local key=$1
grep "define.*${key}" "${WP_CONFIG}" | sed "s/.*'(.*)'.*/1/"
}
DB_NAME=$(get_wp_config "DB_NAME")
DB_USER=$(get_wp_config "DB_USER")
DB_PASS=$(get_wp_config "DB_PASSWORD")
DB_HOST=$(get_wp_config "DB_HOST")
log "============================================"
log "WordPress yedekleme başlıyor"
log "Site: ${WP_ROOT}"
log "Veritabanı: ${DB_NAME}"
log "============================================"
# Dizinleri oluştur
mkdir -p "${FILES_DIR}" "${DB_DIR}"
# --- VERITABANI YEDEĞİ ---
log "Veritabanı yedeği alınıyor..."
DB_BACKUP_FILE="${DB_DIR}/db_${DATE}.sql.gz"
mysqldump
--host="${DB_HOST}"
--user="${DB_USER}"
--password="${DB_PASS}"
--single-transaction
--routines
--triggers
--events
"${DB_NAME}" | gzip > "${DB_BACKUP_FILE}"
if [ $? -eq 0 ]; then
log "Veritabanı yedeği başarılı: ${DB_BACKUP_FILE} ($(du -sh ${DB_BACKUP_FILE} | cut -f1))"
else
log "HATA: Veritabanı yedeği başarısız!"
exit 1
fi
# --- DOSYA YEDEĞİ ---
log "Dosya yedeği alınıyor..."
PREVIOUS=""
if [ -L "${LATEST_LINK}" ]; then
PREVIOUS="--link-dest=${LATEST_LINK}"
fi
rsync -a
--delete
${PREVIOUS}
--exclude='wp-content/cache/'
--exclude='wp-content/uploads/cache/'
--exclude='wp-content/upgrade/'
--exclude='.git/'
--exclude='*.log'
--exclude='*.tmp'
"${WP_ROOT}/"
"${CURRENT_BACKUP}/" 2>> "${LOG_FILE}"
if [ $? -eq 0 ]; then
log "Dosya yedeği başarılı: ${CURRENT_BACKUP} ($(du -sh ${CURRENT_BACKUP} | cut -f1))"
ln -snf "${CURRENT_BACKUP}" "${LATEST_LINK}"
else
log "HATA: Dosya yedeği başarısız!"
exit 1
fi
# --- ESKİ YEDEKLERİ TEMİZLE ---
log "30 günden eski yedekler temizleniyor..."
find "${FILES_DIR}" -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} ; 2>/dev/null
find "${DB_DIR}" -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete 2>/dev/null
log "Yedekleme tamamlandı!"
Uzak Sunucuya rsync ile Yedekleme
Yedeklerinizin aynı sunucuda durması riskli. Disk çöktüğünde yedek de gider. Ayrı bir sunucuya veya NAS cihazına aktarmanız gerekiyor.
Önce SSH key authentication kuruyoruz:
# Yedek sunucusunda özel bir kullanıcı oluştur
useradd -m -s /bin/bash backup-user
# Ana sunucuda SSH key üret (root veya www-data olarak değil, ayrı bir kullanıcıyla)
ssh-keygen -t ed25519 -C "wp-backup@anaserver" -f /root/.ssh/backup_key -N ""
# Public key'i yedek sunucusuna kopyala
ssh-copy-id -i /root/.ssh/backup_key.pub [email protected]
# Bağlantıyı test et
ssh -i /root/.ssh/backup_key [email protected] "echo Bağlantı başarılı"
Şimdi uzak sunucuya yedekleme yapan script:
#!/bin/bash
# ================================================
# WordPress Uzak Sunucu Yedekleme Scripti
# ================================================
# Yerel Konfigürasyon
WP_ROOT="/var/www/html/wordpress"
LOCAL_TMP="/tmp/wp-backup-staging"
LOG_FILE="/var/log/wp-backup-remote.log"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
# Uzak Sunucu Konfigürasyonu
REMOTE_HOST="192.168.1.50"
REMOTE_USER="backup-user"
REMOTE_PORT="22"
SSH_KEY="/root/.ssh/backup_key"
REMOTE_BASE="/backup/wp-sitesi"
REMOTE_FILES="${REMOTE_BASE}/files"
REMOTE_DB="${REMOTE_BASE}/database"
REMOTE_LATEST="${REMOTE_FILES}/latest"
# Bant genişliği sınırı (KB/s, 0 = sınırsız)
BWLIMIT=0
# Log fonksiyonu
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}
SSH_OPTS="-i ${SSH_KEY} -p ${REMOTE_PORT} -o StrictHostKeyChecking=no -o ConnectTimeout=30"
# Uzak dizinleri oluştur
ssh ${SSH_OPTS} ${REMOTE_USER}@${REMOTE_HOST}
"mkdir -p ${REMOTE_FILES} ${REMOTE_DB}"
# wp-config'den DB bilgileri
DB_NAME=$(grep "DB_NAME" ${WP_ROOT}/wp-config.php | sed "s/.*'(.*)'.*/1/")
DB_USER=$(grep "DB_USER" ${WP_ROOT}/wp-config.php | sed "s/.*'(.*)'.*/1/")
DB_PASS=$(grep "DB_PASSWORD" ${WP_ROOT}/wp-config.php | sed "s/.*'(.*)'.*/1/")
# Veritabanını geçici yere dump et, sonra rsync ile aktar
mkdir -p "${LOCAL_TMP}"
DB_DUMP="${LOCAL_TMP}/db_${DATE}.sql.gz"
log "Veritabanı dump alınıyor..."
mysqldump --user="${DB_USER}" --password="${DB_PASS}"
--single-transaction --routines "${DB_NAME}" | gzip > "${DB_DUMP}"
log "Veritabanı uzak sunucuya aktarılıyor..."
rsync -az
--bwlimit=${BWLIMIT}
-e "ssh ${SSH_OPTS}"
"${DB_DUMP}"
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DB}/"
# Önceki yedeği kontrol et
REMOTE_PREV=$(ssh ${SSH_OPTS} ${REMOTE_USER}@${REMOTE_HOST}
"[ -L ${REMOTE_LATEST} ] && readlink ${REMOTE_LATEST} || echo ''")
LINK_DEST_OPT=""
if [ -n "${REMOTE_PREV}" ]; then
LINK_DEST_OPT="--link-dest=${REMOTE_PREV}"
log "Incremental yedek: ${REMOTE_PREV}"
fi
log "WordPress dosyaları uzak sunucuya aktarılıyor..."
rsync -az
--delete
--bwlimit=${BWLIMIT}
${LINK_DEST_OPT}
-e "ssh ${SSH_OPTS}"
--exclude='wp-content/cache/'
--exclude='*.log'
--exclude='*.tmp'
"${WP_ROOT}/"
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_FILES}/${DATE}/"
if [ $? -eq 0 ]; then
log "Uzak yedek başarılı"
ssh ${SSH_OPTS} ${REMOTE_USER}@${REMOTE_HOST}
"ln -snf ${REMOTE_FILES}/${DATE} ${REMOTE_LATEST}"
rm -rf "${LOCAL_TMP}"
else
log "HATA: Uzak yedek başarısız!"
exit 1
fi
log "Uzak yedekleme tamamlandı"
Crontab ile Otomatikleştirme
Script hazır, şimdi otomatik çalıştıralım. Günde bir tam yedek, uygulamanın yoğunluğuna göre saatlik incremental yedek mantıklı bir strateji:
# Crontab düzenle
crontab -e
# Her gün gece 02:00'de tam yedek
0 2 * * * /usr/local/bin/wp-backup-full.sh >> /var/log/wp-backup.log 2>&1
# Her 6 saatte bir uzak sunucuya yedek
0 */6 * * * /usr/local/bin/wp-backup-remote.sh >> /var/log/wp-backup-remote.log 2>&1
# Haftalık yedek doğrulama (pazar günleri 04:00)
0 4 * * 0 /usr/local/bin/wp-backup-verify.sh >> /var/log/wp-backup-verify.log 2>&1
Script dosyasını çalıştırılabilir yapın:
chmod +x /usr/local/bin/wp-backup-full.sh
chmod +x /usr/local/bin/wp-backup-remote.sh
# Test çalıştırması
/usr/local/bin/wp-backup-full.sh
# Log kontrol
tail -f /var/log/wp-backup.log
Yedek Doğrulama ve Geri Yükleme
Yedek aldınız ama hiç test ettiniz mi? “Yedek var” ile “çalışan yedek var” arasında dağlar kadar fark vardır. Basit bir doğrulama scripti:
#!/bin/bash
# ================================================
# WordPress Yedek Doğrulama Scripti
# ================================================
BACKUP_BASE="/backup/wordpress"
FILES_LATEST="${BACKUP_BASE}/files/latest"
DB_DIR="${BACKUP_BASE}/database"
LOG_FILE="/var/log/wp-backup-verify.log"
ALERT_EMAIL="[email protected]"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "${LOG_FILE}"
}
ERRORS=0
# 1. Son dosya yedeği var mı?
if [ ! -d "${FILES_LATEST}" ]; then
log "HATA: Dosya yedeği bulunamadı!"
ERRORS=$((ERRORS + 1))
else
FILE_COUNT=$(find "${FILES_LATEST}" -type f | wc -l)
BACKUP_SIZE=$(du -sh "${FILES_LATEST}" | cut -f1)
log "Dosya yedeği: ${FILE_COUNT} dosya, toplam ${BACKUP_SIZE}"
# wp-config.php var mı?
if [ ! -f "${FILES_LATEST}/wp-config.php" ]; then
log "UYARI: wp-config.php bulunamadı!"
ERRORS=$((ERRORS + 1))
fi
# wp-content dizini var mı?
if [ ! -d "${FILES_LATEST}/wp-content" ]; then
log "UYARI: wp-content dizini bulunamadı!"
ERRORS=$((ERRORS + 1))
fi
fi
# 2. Son 24 saat içinde veritabanı yedeği var mı?
LATEST_DB=$(find "${DB_DIR}" -name "*.sql.gz" -mtime -1 | sort -r | head -1)
if [ -z "${LATEST_DB}" ]; then
log "HATA: Son 24 saat içinde veritabanı yedeği yok!"
ERRORS=$((ERRORS + 1))
else
DB_SIZE=$(du -sh "${LATEST_DB}" | cut -f1)
log "Son DB yedeği: $(basename ${LATEST_DB}), boyut: ${DB_SIZE}"
# Dump dosyası açılıyor mu?
TABLES=$(zcat "${LATEST_DB}" 2>/dev/null | grep "^CREATE TABLE" | wc -l)
if [ "${TABLES}" -gt 0 ]; then
log "Veritabanı doğrulandı: ${TABLES} tablo bulundu"
else
log "HATA: Veritabanı dump dosyası bozuk veya boş!"
ERRORS=$((ERRORS + 1))
fi
fi
# 3. Yedek eskiyor mu?
BACKUP_AGE=$(find "${FILES_LATEST}" -maxdepth 0 -mtime +1 | wc -l)
if [ "${BACKUP_AGE}" -gt 0 ]; then
log "UYARI: Son yedek 24 saatten eski!"
ERRORS=$((ERRORS + 1))
fi
# Sonuç
if [ "${ERRORS}" -gt 0 ]; then
log "BAŞARISIZ: ${ERRORS} hata tespit edildi!"
echo "WordPress yedek doğrulama BAŞARISIZ - ${ERRORS} hata" |
mail -s "UYARI: WordPress Yedek Sorunu" "${ALERT_EMAIL}"
exit 1
else
log "BAŞARILI: Tüm kontroller geçti"
exit 0
fi
Geri Yükleme İşlemi
Felaket anında panik yapmadan geri yükleme yapabilmek için bu adımları ezberleyin ve bir yere yazın:
#!/bin/bash
# ================================================
# WordPress Geri Yükleme Scripti
# Kullanım: ./wp-restore.sh 2024-01-15_02-00-01
# ================================================
BACKUP_DATE=$1
BACKUP_BASE="/backup/wordpress"
WP_ROOT="/var/www/html/wordpress"
WEB_USER="www-data"
if [ -z "${BACKUP_DATE}" ]; then
echo "Kullanım: $0 <yedek-tarihi>"
echo "Mevcut yedekler:"
ls -1 "${BACKUP_BASE}/files/" | grep -v latest
exit 1
fi
RESTORE_FROM="${BACKUP_BASE}/files/${BACKUP_DATE}"
DB_DUMP=$(ls -1t "${BACKUP_BASE}/database/db_${BACKUP_DATE}"*.sql.gz 2>/dev/null | head -1)
if [ ! -d "${RESTORE_FROM}" ]; then
echo "HATA: ${RESTORE_FROM} dizini bulunamadı!"
exit 1
fi
# DB bilgileri mevcut wp-config'den al (yedekte de var ama emin olalım)
DB_NAME=$(grep "DB_NAME" "${RESTORE_FROM}/wp-config.php" | sed "s/.*'(.*)'.*/1/")
DB_USER=$(grep "DB_USER" "${RESTORE_FROM}/wp-config.php" | sed "s/.*'(.*)'.*/1/")
DB_PASS=$(grep "DB_PASSWORD" "${RESTORE_FROM}/wp-config.php" | sed "s/.*'(.*)'.*/1/")
echo "Geri yükleme kaynağı: ${RESTORE_FROM}"
echo "Veritabanı: ${DB_NAME}"
echo "Devam etmek istiyor musunuz? (evet/hayir)"
read CONFIRM
if [ "${CONFIRM}" != "evet" ]; then
echo "İptal edildi."
exit 0
fi
# Web sunucusunu durdur
systemctl stop nginx 2>/dev/null || systemctl stop apache2 2>/dev/null
# Dosyaları geri yükle
echo "Dosyalar geri yükleniyor..."
rsync -a --delete
"${RESTORE_FROM}/"
"${WP_ROOT}/"
chown -R ${WEB_USER}:${WEB_USER} "${WP_ROOT}"
find "${WP_ROOT}" -type d -exec chmod 755 {} ;
find "${WP_ROOT}" -type f -exec chmod 644 {} ;
# Veritabanını geri yükle
if [ -n "${DB_DUMP}" ]; then
echo "Veritabanı geri yükleniyor: ${DB_DUMP}"
mysql --user="${DB_USER}" --password="${DB_PASS}" "${DB_NAME}" < <(zcat "${DB_DUMP}")
echo "Veritabanı geri yüklendi"
else
echo "UYARI: Bu tarihe ait veritabanı dump bulunamadı!"
fi
# Web sunucusunu başlat
systemctl start nginx 2>/dev/null || systemctl start apache2 2>/dev/null
echo "Geri yükleme tamamlandı: ${BACKUP_DATE}"
Gerçek Dünya Notları
Birkaç yıllık deneyimden edindiğim pratik notları paylaşayım:
--exclude='wp-content/cache/'satırı çok önemli. WP Super Cache, W3 Total Cache gibi eklentiler bu dizine gigabyte’larca veri yazabiliyor. Bunları yedeklemenin hiçbir anlamı yok, site açılınca yeniden üretilirler.
mysqldumpkomutundaki--single-transactionparametresini asla atlamayın. Bu parametre olmadan yedek sırasında tablo kilitleri oluşur ve canlı siteniz yavaşlar. InnoDB tablolar için bu parametre dump’ı tutarlı bir snapshot olarak alır.
- Disk doluluk kontrolü yapın. Şöyle bir şey ekleyin scripte: yedekleme başlamadan önce hedef disk kullanımı %85 üzerindeyse işlemi durdur ve uyarı gönder. “Disk dolduğu için yarım kalmış yedek” çok yaygın bir senaryo.
- Yedeklerinizi farklı fiziksel konumlara dağıtın. Aynı veri merkezindeki iki sunucu güç kesintisi, yangın veya disk hatası durumunda ikisi birden etkilenebilir.
wp-config.phpdosyasını yedeklerken dikkatli olun. Veritabanı şifresi bu dosyada düz metin olarak duruyor. Yedek dizinlerinize yetkisiz erişim olmaması kritik.
- Büyük
wp-content/uploads/dizinleri için ayda bir tam rsync, günlük sadece son eklenen dosyaları alan bir strateji daha verimli olabilir.--updateparametresi yeni dosyaları getirir ama silinen dosyaları silmez, bunu aklınızda bulundurun.
Sonuç
rsync tabanlı bu yedekleme sistemi kurulduktan sonra neredeyse hiç bakım gerektirmiyor. Hard link yöntemiyle her gün “görünürde” tam bir yedek alıyor, ama disk üzerinde sadece değişen dosyalar yer kaplıyor. Uzak sunucu entegrasyonuyla verileriniz fiziksel olarak ayrı bir yerde duruyor. Doğrulama scripti de yedeklerinizin gerçekten işe yarar durumda olduğunu düzenli olarak kontrol ediyor.
En önemli adım doğrulama ve test geri yüklemesi yapmak. Her ay bir test sunucusuna bu script’i çalıştırın, sitenin açılıp açılmadığını kontrol edin. Felaketi yaşarken “acaba çalışıyor mu” diye düşünmek zorunda kalmayın. Yedek sisteminize güvenin, ama bu güveni test ederek kazanın.
