mysqldump, cron ve uzak alan rotasyonu kullanan pratik bir yedekleme sistemi — artı staging sunucuyu yok ederek test ettiğimiz felaket kurtarma planı.
Kimsenin Uymadığı Yedekleme Kuralı
3-2-1 yedekleme kuralı şunu söyler: verinizin 3 kopyasını, 2 farklı depolama türünde, 1 kopyası site dışında olacak şekilde tutun. Çoğu geliştirici bu kuralı bilir. CMS kurulumları için neredeyse kimse uymaz. Hosting sağlayıcısının günlük yedeğine güvenir ve en iyisini umar.
Bu yaklaşım, bir hosting göçü ters gidip günlerce içerik kaybolana kadar tutar — klasik sürpriz, sağlayıcının "günlük yedeği"nin aslında üç gün eski çıkmasıdır. Yedekleme stratejinizin sahibi olmak tek güvenilir çözümdür.
jekcms Sitenizi Gerçekte Nasıl Yedekler
jekcms'in BackupManager sınıfı, yedek başına tek bir .zip dosyası üretir; db.sql (veritabanı dökümü), tam uploads/ dizini ve sürüm, post sayısı ve bir şema özeti içeren bir manifest.json içerir. Ayrı bir yalnızca-veritabanı ve yalnızca-dosyalar yedek ayrımı yoktur; her yedek tam, kendi kendine yeten bir anlık görüntüdür.
Veritabanı dökümünün kendisi mysqldump'a kabuk (shell) üzerinden çağrı yapmak yerine saf PHP'de uygulanmıştır — bilinçli olarak, çünkü mysqldump paylaşımlı hostinglerde güvenilir şekilde mevcut değildir. Döküm, tüm sonuç kümelerini belleğe yüklemek yerine bir seferde bir tablo satır satır akıtılır; bu yüzden büyük post tablolu kurulumlarda da sorunsuz çalışır. Tek katı gereksinim PHP zip uzantısıdır; ZipArchive mevcut değilse BackupManager sessizce bozuk bir yedek üretmek yerine hemen hata fırlatır.
// BackupManager'in basitlestirilmis gercek sekli
class BackupManager
{
public function create(string $type = 'full', string $trigger = 'manual'): array { /* ... */ }
public function list(int $limit = 20): array { /* ... */ }
public function get(int $id): ?array { /* ... */ }
public function restore(string $zipPath): array { /* ... */ }
public function scheduledRun(): array { /* ... */ }
// dumpDatabase() private - saf-PHP mysqldump yerine gecen fonksiyon
}
Her yedek bir backups tablosuna kaydedilir; list() ve yönetim panelinin yedek geçmişi buradan okur. Yedekler dizininin kendisine otomatik olarak reddet-hepsini içeren bir .htaccess yazılır; böylece biri yolu tahmin etse bile yedek arşivlerine HTTP üzerinden erişilemez.
Zamanlama ve Saklama
Zamanlanmış yedekler birkaç ayarla kontrol edilir: zamanlamanın etkin olup olmadığı, hangi saatte çalışacağı (varsayılan sabah 3, yapılandırılabilir) ve bir saklama penceresi (varsayılan 30 gün, 7-365 arasında sınırlı). scheduledRun() idempotent'tir — aynı gün iki kez çağrılması, o gün zaten bir yedek çalıştıysa hiçbir şey yapmaz — ve zamanlanmış bir yedek tamamlandıktan sonra, saklama penceresinden daha eski yedekleri otomatik olarak budar. Yapılandırılacak ayrı bir günlük/haftalık/aylık rotasyon katmanı yoktur; bilinçli olarak basit tutulmuş tek bir zamanlama, tek bir saklama süresi vardır.
Kurtarmayı Test Etmek
Hiç test edilmemiş bir yedek, yedek değildir — bir umuttur. restore(string $zipPath), bir kazadan kurtarıyor olsanız da bir yedeğin gerçekten kullanılabilir olduğunu doğruluyor olsanız da aynı kod yoludur. Sitenizin bir staging kopyasına periyodik olarak geri yükleme yapmak, yedeklerinizin varsayım değil gerçekten sizi kurtaracağını bilmenin tek yoludur.