Problem, şema değişikliğini eski kod hâlâ canlıyken deploy'a bağlamak. Çözüm: geriye uyumlu (expand/contract) migration'lar, app deploy'undan ayrılmış; kolonu nullable ekle, backfill'i ayrı throttle'lı adımda yap, eski'yi sonraki sürümde sil.
#ci-cd#veritabanı#laravel
Symlink değişimi atomik ama OPcache dosya yolundan beslenir; `current` yolu değişmediği için worker'lar eski bytecode'u sunmaya devam eder. Çözüm: symlink'i çevir, sonra PHP-FPM'i graceful reload et (restart değil), gerekirse `opcache_reset`. Octane'de kod bellekte tutulduğu için `octane:reload` şart.
#ci-cd#laravel#deploy
1.2 GB imaj, tüm build toolchain'ini üretime taşır — yavaş ve geniş saldırı yüzeyi. Multi-stage build ile derleme araçlarını ilk aşamada bırak; Go için final aşama `scratch`/distroless (birkaç MB), PHP için `fpm-alpine` + `vendor/`. Non-root çalış.
#ci-cd#docker#altyapı
Gitflow'un uzun ömürlü dalları sürüklenir; merge'ler bu yüzden acı verir. Trunk-Based küçük değişiklikleri sürekli main'e alır, ama ancak bitmemiş özellik kullanıcıya ulaşamazsa işe yarar — feature flag'lerin işi tam budur. Deploy'u release'den ayırırsın.
#ci-cd#git#mimari
Bu tam olarak GoReleaser'ın işi. Tag push'unda tetiklenen bir GitHub Actions workflow'u cross-compile eder, GitHub Release'i yayımlar ve `brews:` bloğuyla Homebrew tap formülünü otomatik günceller. Kullanıcı `brew install` ile kurar.
#ci-cd#go#deploy
Anahtar `.env`'de, verinin yanındaysa sunucuyu ele geçiren saldırgan hem veriyi hem anahtarı alır; şifreleme neredeyse hiçbir şey kazandırmaz. KMS/Vault anahtarı veriden ayırır ve ham anahtarı uygulamaya hiç vermez (envelope encryption). TC kimlik/kart için tokenization tercih et; rotasyon + audit.
#veritabanı#güvenlik#altyapı
Root ve Docker soketine sahip kalıcı bir runner, sunucu ele geçirilmesini bekleyen bir açıktır. İki ilke: ephemerality (her job taze, atılır bir ortamda çalışıp yok edilir) ve izolasyon (gerçek Docker soketi/root verme, unprivileged container/VM). Fork PR'larını çalıştırma.
#ci-cd#güvenlik#docker
Local state + 3 kişi = bozulma ve race. State'i remote backend'e taşı: S3 (versiyonlu, şifreli) state dosyası için, DynamoDB ise state locking için. Apply'dan önce kilit alınır, ikinci apply bekler. Ortam başına ayrı state ve CI'dan apply.
#ci-cd#altyapı#terraform
Gecelik dump 18 saatlik RPO demek — üretimde kabul edilemez. PITR kapatır: periyodik base backup al, WAL'ı sürekli S3'e arşivle, kurtarırken base'i geri yükle ve `recovery_target_time` ile hatalı `DELETE`'in 3 saniye öncesine kadar replay et. pgBackRest/WAL-G kullan, restore'u prova et.
#veritabanı#postgresql#dayanıklılık
Bloklayan `ALTER TABLE` 20M satırı kilitler. Expand/contract yap: yeni kolonları nullable ekle, kod hem eski hem yeniye yazsın (dual-write), geçmişi throttled batch'lerle backfill et + doğrula, okumayı yeni şemaya geçir, sonra eskiyi düşür. Her adım bağımsız deploy edilebilir ve geri alınabilir.
#veritabanı#postgresql#ci-cd