Komutları üretim sunucusunda çalıştırmadan önce yedek alın ve mümkünse bir test ortamında deneyin. Yönetim erişiminizi (SSH, panel) kaybetmemek için ayar değişikliklerinde açık bir ikinci oturum bulundurun.
Bu rehberde ne yapacağız?
Yedek, saldırı, hatalı güncelleme veya donanım arızası karşısındaki son savunmanızdır. Bu rehberde web sitesi yedekleme ve geri yükleme işlemini dosyalar ve veritabanı için komut satırıyla yapacak, zamanlayıp sunucu dışına kopyalayacak ve geri yüklemeyi test edeceksiniz.
Rehber, kendi sunucusunu yöneten site ve hosting yöneticilerine yöneliktir. Tahmini süre 30-45 dakikadır. Kontrol paneli kullanıyorsanız panelin yedekleme aracı da seçenektir; burada panelden bağımsız, her yerde çalışan yöntem anlatılır.
Gereksinimler
- Linux sunucu (Debian/Ubuntu veya AlmaLinux/Rocky) ve SSH erişimi
- MySQL veya MariaDB veritabanı ve yedek alacak kullanıcının yetkisi
- Yedeklerin saklanacağı, sunucudan ayrı bir hedef (başka sunucu, nesne depolama vb.)
- Yeterli disk alanı; yedek boyutunu önceden tahmin edin
Adım adım web sitesi yedekleme ve geri yükleme
1. Yedek dizinini hazırlayın
Yedekleri web kökünün dışında, yalnızca ilgili kullanıcının okuyabileceği bir dizinde tutun. Web kökünde bırakılan yedekler indirilebilir ve ciddi bir sızıntıya yol açar. Yedek dizini root’a ait olduğu ve cron işi root olarak çalışacağı için bu rehberdeki komutları root kabuğunda (sudo -i) çalıştırın.
sudo mkdir -p /var/backups/site
sudo chmod 700 /var/backups/site2. Veritabanı kimlik bilgilerini güvenli saklayın
Parolayı komut satırında yazmak, süreç listesinde görünmesine neden olur. Bunun yerine yedeği çalıştıracak kullanıcının (burada root) ana dizininde izinleri kısıtlı bir istemci yapılandırma dosyası kullanın. Dosyayı önce boş ve 600 izinle oluşturun, sonra parolayı yazın.
install -m 600 /dev/null /root/.my.cnf
nano /root/.my.cnf[client]
user=yedekkullanici
password=BURAYA_PAROLA3. Veritabanını yedekleyin
InnoDB tablolarında tutarlı bir yedek için single-transaction seçeneğini kullanın ve çıktıyı sıkıştırın.
mysqldump --single-transaction --routines VERITABANI_ADI | gzip > /var/backups/site/db-$(date +%F).sql.gz4. Dosyaları yedekleyin
Site dizinini tar ile arşivleyin. Önbellek gibi gereksiz dizinleri hariç tutarak boyutu küçültebilirsiniz.
tar -czf /var/backups/site/dosyalar-$(date +%F).tar.gz --exclude=siteniz/cache -C /var/www siteniz5. Yedeğin bütünlüğünü doğrulayın
Arşivin okunabildiğini ve bir sağlama toplamını kaydedin; bozuk yedek kullanışsızdır.
gzip -t /var/backups/site/db-$(date +%F).sql.gz
tar -tzf /var/backups/site/dosyalar-$(date +%F).tar.gz | head
sha256sum /var/backups/site/*.gz > /var/backups/site/SHA256SUMS6. Yedeği sunucu dışına kopyalayın
Aynı sunucuda kalan yedek, sunucu kaybolunca yok olur. Rsync ile başka bir sunucuya kopyalayın (uzak adresi kendi bilgilerinizle değiştirin; anahtar tabanlı SSH kullanın).
rsync -avz /var/backups/site/ yedekkullanici@yedek.example:/yedekler/site/7. Yedeklemeyi zamanlayın ve eskileri temizleyin
Yukarıdaki komutları bir betikte toplayıp cron ile günlük çalıştırın. Betiğin başına set -euo pipefail ekleyin; aksi halde mysqldump başarısız olsa bile gzip başarılı döner ve boş bir yedek fark edilmez. Eski yedekleri silen komutu çalıştırmadan önce yolun doğru olduğundan emin olun; yanlış bir yol yanlış dosyaları siler.
sudo crontab -e30 3 * * * /usr/local/bin/site-yedek.shfind /var/backups/site -type f -mtime +14 -name '*.gz' -printÖnce -print ile listeyi görün, doğruysa -print yerine -delete kullanın.
8. Geri yüklemeyi uygulayın
Geri yüklemeden önce mevcut durumu yeniden yedekleyin. Mümkünse önce test ortamında deneyin. Veritabanını geri yüklemek mevcut tabloların üzerine yazar.
gunzip < /var/backups/site/db-2025-01-01.sql.gz | mysql VERITABANI_ADI
tar -xzf /var/backups/site/dosyalar-2025-01-01.tar.gz -C /var/wwwDosya adındaki tarihi kendi yedeğinizin tarihiyle değiştirin. Geri yüklemeden sonra dosya sahipliği ve izinleri kontrol edin.
Doğrulama
Yedeklemenin çalıştığını ve geri dönülebildiğini doğrulayın.
ls -lh /var/backups/site/
sha256sum -c /var/backups/site/SHA256SUMSBeklenen sonuç: her gün yeni dosyaların oluşması, sağlama toplamlarının OK dönmesi ve en az ayda bir yapılan test geri yüklemesinin siteyi sorunsuz açmasıdır. Test geri yüklemesini canlı sistemden ayrı bir yerde yapın.
Sık karşılaşılan sorunlar
- mysqldump erişim reddedildi hatası: Kullanıcının SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ve (rutinler için) ilgili yetkilerini kontrol edin; MySQL 8’de PROCESS yetkisi hatası alırsanız --no-tablespaces ekleyin; .my.cnf dosyasındaki bilgileri doğrulayın.
- Yedek dosyası çok büyük: Önbellek ve geçici dizinleri hariç tutun, eski yedekleri döngüye alın.
- Cron çalışmıyor: Betiğin çalıştırma izni, tam yolları ve cron günlüğünü kontrol edin.
- Geri yükleme sonrası site hata veriyor: Dosya sahipliği, izinler ve yapılandırma dosyasındaki veritabanı bilgilerini kontrol edin.
Güvenlik ve bakım notları
- 3-2-1 ilkesini uygulayın: en az üç kopya, iki farklı ortam, biri sunucu dışında.
- Yedekleri şifreleyin; özellikle üçüncü taraf depolamada saklıyorsanız.
- Yedek sunucusuna yalnızca yazma ya da sınırlı yetkili bir hesapla erişin; fidye yazılımı yedekleri de silebilir.
- Geri yükleme testini düzenli ve takvimli yapın.
- Yedekleme betiğinin başarısız olduğunda e-posta ile bildirim göndermesini sağlayın.
- Kişisel veri içeren yedeklerin saklama süresini mevzuata uygun belirleyin.
Sık sorulan sorular
Yedeği ne sıklıkla almalıyım?
Sık değişen siteler için günlük, e-ticaret gibi yoğun işlem yapan sitelerde daha sık veritabanı yedeği önerilir. Kabul edebileceğiniz veri kaybı süresine göre belirleyin.
Hosting paneli yedeği yeterli mi?
Panel yedekleri iyi bir başlangıçtır ama genellikle aynı sunucuda tutulur. Bağımsız ve sunucu dışında bir kopya her zaman ekleyin.
Yedeklerin çalıştığından nasıl emin olurum?
Düzenli olarak ayrı bir ortama geri yükleyip siteyi açın. Geri yükleme testi yapılmamış yedek, güvenilir sayılmaz.
İlgili sözlük terimleri
Bu kategorideki diğer rehberler
- MariaDB yavaş sorgu günlüğü ve temel optimizasyonMariaDB yavaş sorgu günlüğünü açın, yavaş sorguları dumpslow ile analiz edin, EXPLAIN ile indeks eksiklerini bulun ve temel optimizasyonla veritabanı yükünü güvenle azaltın.
- CDN veya ters vekil arkasında gerçek istemci IP adresini alma (Nginx ve Apache)CDN veya ters vekil arkasında Nginx ve Apache günlüklerinde, PHP ve güvenlik araçlarında gerçek istemci IP adresini görmek için realip ve remoteip modüllerini güvenli biçimde yapılandırın.
- OPcache, gzip/brotli ve önbellek başlıklarıyla web performansıOPcache ile PHP başlangıç maliyetini düşürün, gzip ve brotli sıkıştırmasını Nginx ile Apache üzerinde açın ve doğru Cache-Control başlıklarıyla web performansını ölçülebilir biçimde artırın.
- php.ini güvenlik ayarlarıphp.ini güvenlik ayarlarını uygulayın: expose_php, disable_functions, open_basedir, hata gösterimi, oturum çerezleri ve dosya yükleme limitlerini PHP-FPM üzerinde güvenle sıkılaştırın.