Backup script v2 + DR runbook — 2 aylık silent failure giderildi
Kritik bulgu: Eski backup script config.local.php'de tanımsız olan $DB_NAME environment'ı bekliyordu — 2 ay+ boş (388 byte) yedek üretiyordu. Latest symlink April 28'i gösteriyordu; tüm sistem yedeksizdi.
- Yeni script (
ops/teknikdanisman_backup.sh): Master DB + tüm aktif tenant DB'leri ayrı ayrı dump · application files · SHA256SUMS · atomic latest symlink · 14 gün retention ·last_run.jsonmeta dosyası - Eski script:
/usr/local/bin/teknikdanisman_backup.sh.bak'a yedeklendi - İlk başarılı run: Master 27KB + 6 tenant (4.2MB+5×~150KB) + app 47MB · toplam 52MB · 14 günden eski 54 boş klasör otomatik temizlendi
- /health.php + /status.php: "Yedekleme" component'i eklendi — <30 saat OK, 30-48 saat warn, >48 saat fail. Sentry alarm uyumlu
- DR runbook (
docs/disaster-recovery.md) yazıldı: RPO ≤ 24 saat, RTO ≤ 4 saat hedefleri · 3 senaryo (tek tenant / master / full sunucu) adım adım · quarterly drill takvimi · eksikler listesi (off-site, GPG encryption, integrity test) - SECURITY.md Backup & DR + Observability bölümleri eklendi
Production yedek artık doğrulanmış şekilde işliyor.