
Yeni sürümü yayına aldınız ve bir hata çıktı. Geri almak için depodan eski sürümü çekip tekrar kurmanız gerekiyor — ve bu on dakika sürüyor. Oysa eski sürüm hâlâ diskte dursaydı, geri alma bir saniye sürerdi.
Bu yazı, sunucudaki dağıtım dizin yapısını ele alıyor.
Klasik Yaklaşımın Sorunları
Doğrudan çalışan dizine yazmak yaygın ama sorunludur:
- Yayın sırasında site tutarsız olur.
- Geri alma yeniden kurulum gerektirir.
- Eski dosyalar kalabilir.
- Hangi sürümün çalıştığı belirsizleşir.
Birinci madde en görünür sorundur: dosyalar birer birer kopyalanırken gelen bir istek, yarısı yeni yarısı eski bir kod tabanıyla karşılaşır ve beklenmedik hatalar üretir.
Bu süre kısa olsa bile yoğun bir sitede yüzlerce isteği etkiler.
Üçüncü madde ise sinsi bir sorundur. Yeni sürümde silinmiş bir dosya, doğrudan kopyalama yönteminde diskte kalmaya devam eder ve eski kod hâlâ çalışabilir.
Sürümlü Dizin Yapısı
| Dizin | İçeriği |
|---|---|
| Sürümler | Her yayın ayrı klasörde |
| Güncel | Aktif sürüme bağlantı |
| Paylaşılan | Yüklemeler, günlükler, ayarlar |
İkinci satır tüm yaklaşımın anahtarıdır: web sunucusu sabit bir yolu gösterir, o yol ise bir sembolik bağlantıdır — sürüm değiştirmek, bağlantının hedefini değiştirmekten ibarettir ve anlık gerçekleşir.
Dosya kopyalama yayın öncesinde tamamlanmıştır; geçiş anı yalnızca bir işaretçi güncellemesidir.
Üçüncü satır ise kritik bir ayrımdır. Kullanıcı yüklemeleri ve günlükler sürüm klasörünün içinde olmamalıdır, aksi hâlde her yayında kaybolurlar.
Paylaşılan Dizinler
Sürümler arası taşınması gerekenler:
- Kullanıcı yüklemeleri.
- Günlük dosyaları.
- Ortam yapılandırması.
- Önbellek dizinleri.
- Oturum dosyaları.
Üçüncü madde güvenlik açısından da doğrudur: ortam yapılandırmasını sürüm klasörünün dışında tutmak, hem her yayında yeniden oluşturulmasını önler hem de o dosyanın depoya karışma riskini ortadan kaldırır.
Sürüm klasöründeki ilgili yollar bu paylaşılan konuma bağlantı olarak tanımlanır.
Dördüncü madde ise dikkat gerektirir. Bazı önbellekler sürüme özgüdür ve paylaşılmamalıdır; kod değiştiğinde eski önbellek geçersizdir.
Beşinci madde ise kullanıcıların yayın sırasında çıkış yapmasını önler.
Yayın Akışı
| Adım | Etki |
|---|---|
| Yeni sürüm klasörü oluştur | Canlıyı etkilemez |
| Kodu yerleştir | Canlıyı etkilemez |
| Bağımlılıkları kur | Canlıyı etkilemez |
| Paylaşılan bağlantıları kur | Canlıyı etkilemez |
| Kontrolleri çalıştır | Canlıyı etkilemez |
| Bağlantıyı değiştir | Geçiş anı |
| Servisleri yenile | Yeni kod devrede |
Bu akışın gücü ilk beş adımın risksiz olmasıdır: yayın hazırlığının tamamı canlı siteye hiç dokunmadan yapılır — bir adım başarısız olursa geçiş hiç yapılmaz ve kullanıcılar hiçbir şey fark etmez.
Beşinci adım özellikle değerlidir. Yeni sürümün açılıp açılmadığı, geçişten önce test edilebilir.
Yedinci adım ise çalışma zamanına göre değişir. Bazı ortamlar dosya değişikliğini otomatik algılar, bazıları yeniden başlatma gerektirir.
Geri Alma
Bu yapının en büyük kazancı budur:
- Eski sürüm diskte durur.
- Bağlantı geri çevrilir.
- İşlem saniyeler sürer.
Bu hız, kriz anında belirleyicidir: bozuk bir yayını geri almanın saniyeler sürmesi, sorunu araştırmak yerine önce geri alıp sonra sakince incelemenizi mümkün kılar.
Geri alma pahalıysa ekipler onu yapmak yerine canlıda hata ayıklamayı tercih eder ve kesinti uzar.
Ancak bir sınır vardır ve bilinmelidir: veritabanı şema değişiklikleri geri alınmaz.
Bu yüzden şema değişiklikleri geriye uyumlu yapılmalıdır; eski kod yeni şemayla da çalışabilmelidir.
Eski Sürümleri Temizlemek
- Belirli sayıda sürüm saklayın.
- Aktif sürümü asla silmeyin.
- Temizliği otomatikleştirin.
Birinci madde disk yönetimi için gereklidir: her yayın bağımlılıklarıyla birlikte yüzlerce megabayt yer kaplayabilir ve temizlik yapılmazsa disk aylar içinde dolar.
Beş sürüm saklamak çoğu ekip için yeterlidir; daha eskisine dönme ihtiyacı nadirdir.
İkinci madde bariz görünür ama otomatik temizlik betiklerinde kazayla ihlal edilebilir. Bağlantının gösterdiği klasör her zaman korunmalıdır.
Üçüncü madde ise unutmayı önler. Temizlik, yayın akışının son adımı olarak tanımlanmalıdır.
İzinler ve Sahiplik
| Dizin | İzin |
|---|---|
| Kod dizinleri | Salt okunur olabilir |
| Yükleme dizini | Yazılabilir |
| Günlük dizini | Yazılabilir |
| Yapılandırma dosyası | Kısıtlı okuma |
Birinci satır güçlü bir güvenlik önlemidir: kod dizinini web sunucusu kullanıcısına salt okunur yapmak, bir açıktan yararlanan saldırganın sunucuya dosya yazmasını engeller.
Bu, web kabuğu yerleştirme saldırılarının çoğunu etkisiz kılar.
Uygulamanın yazması gereken tek yerler paylaşılan dizinlerdir ve onlar da web kökünün dışında tutulmalıdır.
Konteyner Kullananlar İçin
- İmaj zaten değişmezdir.
- Sürüm etiketi bağlantının yerini alır.
- Geri alma eski etikete dönmektir.
Konteyner tabanlı yapılarda bu desen zaten yerleşiktir: konteyner imajları değiştirilemez olduğu için her sürüm doğal olarak ayrı bir varlıktır ve geri alma önceki imajı çalıştırmaktan ibarettir.
Ancak paylaşılan veri konusu aynen geçerlidir; kalıcı veri konteyner dışında tutulmalıdır.
Dizin düzeni yaklaşımı, konteyner kullanmayan geleneksel kurulumlarda aynı faydayı sağlar.
Sürümleri yan yana tutmak ek disk alanı gerektirir; sanal sunucu barındırma altyapısı paketlerinde disk kapasitesini bu yapıya göre planlamak gerekir.
Sonuç
Doğrudan çalışan dizine yazmanın en görünür sorunu tutarsızlıktır: dosyalar kopyalanırken gelen bir istek, yarısı yeni yarısı eski bir kod tabanıyla karşılaşır. Sürümlü dizin yapısı bunu çözer — hazırlığın tamamı canlıya dokunmadan yapılır, geçiş anı yalnızca bir bağlantı güncellemesidir. Asıl kazanç ise geri almadadır: saniyeler süren bir geri alma, ekiplerin canlıda hata ayıklamak yerine önce geri alıp sakince incelemesini sağlar. Kullanıcı yüklemelerini ve günlükleri sürüm klasörünün dışında tutun.
Sıkça Sorulan Sorular (SSS)
Doğrudan kopyalamanın sorunu ne?
Dosyalar birer birer kopyalanırken gelen istekler, yarısı yeni yarısı eski bir kod tabanıyla karşılaşır ve beklenmedik hatalar üretir. Ayrıca yeni sürümde silinmiş dosyalar diskte kalmaya devam eder ve eski kod hâlâ çalışabilir.
Sürümlü yapı nasıl çalışıyor?
Web sunucusu sabit bir yolu gösterir, o yol ise bir sembolik bağlantıdır. Yeni sürüm ayrı bir klasöre hazırlanır — kod yerleştirme, bağımlılık kurma ve kontroller canlıya hiç dokunmadan yapılır. Geçiş anı yalnızca bağlantının hedefini değiştirmekten ibarettir ve anlık gerçekleşir.
Neleri sürüm klasörü dışında tutmalıyım?
Kullanıcı yüklemeleri, günlük dosyaları, ortam yapılandırması ve oturum dosyaları. Bunlar sürüm klasörünün içindeyse her yayında kaybolurlar. Yapılandırmayı dışarıda tutmak ayrıca o dosyanın depoya karışma riskini de ortadan kaldırır.
Geri alma her zaman güvenli mi?
Kod tarafında evet, veritabanı tarafında hayır — şema değişiklikleri bağlantı çevrilerek geri alınmaz. Bu yüzden şema değişikliklerini geriye uyumlu yapın; eski kod yeni şemayla da çalışabilmelidir. O zaman geri alma gerçekten saniyeler sürer.