Yedekleme ve bakım
Yedekleme
AACP → Bakım → Yedekleme ekranından (yetki: system.backup.manage) ya da komut satırından yedek alınır:
php cp-core/bin/console cp:backup:create db # yalnız veritabanı (gzip'li SQL dökümü)
php cp-core/bin/console cp:backup:create files # dosyalar (zip)
php cp-core/bin/console cp:backup:create full # veritabanı + dosyalar
Yedekler cp-core/var/backups/ altında saklanır. Dosya adı türü ve zamanı taşır.
Yedeğe girmeyenler
Dosya yedeği bilerek şunları dışarıda bırakır: eski yedekler (cp-core/var/backups/), yeniden üretilebilir önbellek (cp-core/var/cache/), oturum dosyaları, Tailwind derleme klasörü, sayfa önbelleği (public/page-cache/), .git, node_modules ve kullanıcı ev dizini artıkları (.ssh, .config…). Vendor ve public/ dahildir, yani yedekten geri dönüş için ek kurulum adımı gerekmez. Gizli bilgi taşıyabilecek dosyalar da elenir.
Yedek aynı sunucuda ise yedek değildir
Yedeğin sunucuyla aynı diskte durması, kötü bir dağıtıma ve silinmiş bir tabloya karşı koruma sağlar; ama insanların yedeği gerçekte aldığı olaya, yani sunucuyu kaybetmeye karşı değil. Bu yüzden CPalius yedeği sunucudan çıkaran bir gönderici (BackupShipper) sunar. Hedefler medya ile aynıdır: S3 uyumlu, Cloudflare R2 ve FTP; bkz. Medya ve depolama.
| Ayar | Varsayılan | |
|---|---|---|
storage.backup.target |
off |
Yedeklerin gönderileceği hedef |
storage.backup.prefix |
cpalius-backups |
Uzak klasör/ön ek |
storage.backup.keep_local |
açık | Gönderimden sonra yerel kopyayı sakla |
storage.backup.remote_retention |
10 | Uzakta en yeni kaç yedek kalsın |
İki tasarım kararı bilinmeli:
Hata gürültülüdür. Medya kopyalamada başarısız uzak kopya bir uyarıdır. Yedekte ise istisna olarak operatörün ekranına çıkar. Özelliğin tüm değeri, operatörün çalıştığına inanmasıdır; sessizce on bir ay önce çalışmayı bırakmış bir uzak yedek, hiç olmamasından kötüdür, çünkü bir yıl boyunca bakmamayı satın almıştır.
Yerel kopya en son ve yalnızca kanıtla silinir. 5 GB'lık paylaşımlı barındırmada keep_local = false meşru bir seçimdir, ama "yükle sonra sil" ancak yükleme doğrulanmışsa güvenlidir. Bu yüzden nesne geri okunup doğrulandıktan sonra yerel dosya silinir; 200 dönen ama eksik yazılmış bir PUT tek sağlam kopyayı yok edemez. Ayrıca bir hedef, canlı yazma testinden geçmeden yedek hedefi olarak kullanılmaz.
Gönderilenlerin kaydı bir ayar satırında tutulur (ek tablo/migration gerekmez); dosyaları güncel ama şeması henüz güncellenmemiş bir kurulumda da çalışır.
Geri yükleme
Geri yükleme otomatik bir "tek tık" değildir, bilinçli bir operatör işlemidir:
- Bakım moduna alın (
core.maintenance_mode). dbyedeğinigunzipile açıp veritabanına yükleyin (mysql ... < yedek.sql).files/fullyedeğinde dosyaları proje köküne açın.cp-core/var/cache/prod/içini boşaltın,cp:doctorçalıştırın.
Güncelleme sırasında alınan otomatik anlık görüntü ve otomatik geri alma için bkz. Güncelleme sistemi.
Sağlık denetimi
cp:doctor (ayrıntı Kurulum sayfasında) bir yedeğin yerini tutmaz ama sessiz bozulmayı yakalar: modül migration'ının oluşturduğunu söylediği tablo gerçekten var mı, rollerde tanımsız yetenek kaldı mı, çeviri anahtarları eşit mi. Düzenli (örneğin her dağıtımdan sonra) çalıştırın.
cp:security:audit güvenlik duruşunu puanlar; bkz. Güvenlik.
Günlükler
AACP → Bakım → Günlükler (system.logs.manage):
| Günlük | Ne |
|---|---|
| Uygulama günlüğü | Monolog; logging.min_level (varsayılan warning) üstü, logging.retention_days (30) kadar saklanır |
| Modül karantina günlüğü | cp-core/var/log/module_quarantine.log: hata veren hook'lar, modüller |
| E-posta günlüğü | cp_mail_logs; yeniden gönderim, mail.log_retention_days (90) |
| Denetim kaydı | Yönetici eylemleri; audit.retention_days (365) |
| Güvenlik telemetrisi | WAF/giriş olayları; ciddiyete göre 3–90 gün |
Eski satırlar zamanlanmış görevlerle (logging.purge, audit.purge) temizlenir. Kalıcı silme system.logs.purge yeteneği ister.
Çöp kutusu
Silinen kayıtlar kalıcı silinmeden önce çöp kutusuna düşer; geri yüklenebilir. Tür başına açma/kapama ve saklama süresi (varsayılan 30 gün) AACP → Bakım → Çöp kutusu'ndan ayarlanır. Ayrıntı: İçerik modeli.
Kurtarma konsolu
Çekirdek asla ölmez ilkesinin son sığınağı: /aacp/recovery. .env içinde bir kurtarma token'ı tanımlıysa (boşsa kapı kapalıdır) çalışır ve veritabanı olmadan açılır. Buradan:
- Hatalı bir modülü devre dışı bırakabilir,
- Önbelleği temizleyebilirsiniz.
Hiçbir modüle ya da temaya bağımlı değildir. WAF ve IP yasağı da bu adresi bilerek muaf tutar: kendini yasaklamış operatörün geri dönüş yolu burasıdır.
Kurtarma token'ı güçlü bir yetkidir: uzun ve rastgele üretin (php -r "echo bin2hex(random_bytes(32));"), paylaşmayın, kullanmadığınız ortamlarda boş bırakın.
Düzenli bakım listesi
| Sıklık | İş |
|---|---|
| Her dağıtım sonrası | cp:doctor; AACP → Karantina boş mu |
| Haftalık | Yedeğin uzak hedefe gittiğini kontrol edin (son yedek tarihine bakın) |
| Aylık | cp:security:audit; kullanılmayan yönetici hesapları; güncellemeleri uygulayın |
| Yılda bir | Geri yükleme provası: yedekten ayrı bir ortamda siteyi gerçekten ayağa kaldırın |
Geri yüklenmemiş bir yedek, yedeklenmiş sayılmaz.