Saat 02:00'de mesaj geldi: servis down. Loglar connection refused ile doluydu. Sebep? docker-compose'ta volume yanlış yola mount edilmişti — veritabanı /var/lib/postgresql/data yerine boş bir klasöre bağlanmıştı.

Health check yoktu ve restart policy always'dı — konteyner kök nedeni göstermeden sürekli yeniden başlıyordu. Dışarıdan servis "ayakta" görünüyordu ama istekler timeout oluyordu.

İlk hamle rollback'ti, ama son backup snapshot üç gün önceydi. Üç günlük veri gitti — kasıtlı silme değil, uygulama boş volume üzerinde yeni bir veritabanı başlattığı için.

Incident sonrası birkaç basit kural koyduk: ikinci review olmadan docker-compose değişikliği yok, merge öncesi otomatik backup olmadan deploy yok, staging volume path'leri production ile birebir aynı olmalı.

Kritik tüm servislere healthcheck ekledik. Postgres için pg_isready, API için gerçekten DB'ye bağlanan /health endpoint'i — boş 200 OK değil.

Az kişinin söylediği teknik detay: depends_on sadece başlama sırasını garanti eder, hazır olmayı değil. Healthcheck olmadan startup race condition neredeyse kaçınılmaz.

Artık her deploy sonrası smoke test var: basit DB sorgusu, API isteği ve konteyner içinde mount point kontrolü. 30 saniye ekler, 02:00 uyanışını önler.

En pahalı dersler zaman ve sinir ister. Ama sağlam bir checklist ile en azından aynı hatayı tekrarlamazsın.