Güncelleme sistemi
Güncelleme sistemi, bir sitenin kendini yok edebileceği tek parçadır; bu yüzden diğer sistemlerin yaklaşımlarıyla karşılaştırılarak tasarlandı.
Karşılaştırma
| Güncelleme nasıl yapılıyor? | Dikkat çeken | |
|---|---|---|
| WordPress | Panelden tek tık; çekirdek, eklenti ve tema ayrı | Kısmi paket (küçük indirme) var; imza doğrulaması çekirdeğin kendi paketiyle sınırlı |
| Drupal 11 | Kod ve şema ayrı adımlar; değişiklik bir kopyada yapılıp denetimlerden geçer | İmza desteği var ama varsayılan olarak atlanır; otomatik veritabanı yedeği yok |
| Sulu 3 | Panel güncelleyicisi yok; composer update ve CI |
Web süreci kod yazamaz, saldırı yüzeyi en küçük; Composer, CI ve SSH şart |
| CPalius | Panelden tek tık | İmzalı manifest, bakım modu, atomik yazma, DB yedeği, otomatik geri alma |
CPalius akışı
- Sürüm bilgisi doğrulanır:
latest.jsonEd25519 imzası, süre sonu (30 gün) ve geri düşürme denetimi. Başarısızsa hiçbir şey indirilmez. - Kilit ve bakım modu: iki güncelleme çakışmaz; ziyaretçiler kısa bir 503 sayfası görür.
- Veritabanı anlık görüntüsü (
db-<sürüm>.sql.gz) alınır. - Dosyalar iki adımda yazılır: önce her biri hedefinin yanına hazırlanır (
.cpnew), sonra hepsi kısa bir döngüderenameile yerine geçer. Hazırlıkta hata olursa canlı dosyalara dokunulmamış olur. - Hata olursa: dosyalar ve veritabanı birlikte geri yüklenir. Süreç ortada ölürse bir sonraki istek
public/index.phpiçinde, çerçeve yüklenmeden önce dosyaları geri alır; veritabanı geri yüklemesi ilk açılan istekte biter.
Sınırlar
- Geri alma, anlık görüntü ile hata arasında veritabanına yazılan her şeyi siler.
- Güncelleme sürerken kısa bir 503 sayfası gösterilir.
- İmzanın 30 günlük süresi vardır; yeni sürüm çıkmazsa elle tazelenir.
Kanallar ve imza yenileme: Kanallar ve imza.
Dosyalardan sonra: cp:update
Yeni sürümün dosyaları yerine geçtiğinde sitenin geri kalanını yeni koda uydurmak UpdateRunner işidir (cp:update komutu ya da panel). Sıra işin kendisidir:
- Migration'lar: önce şema; sonrasındaki her şey yeni bir sütuna dayanabilir.
- Güncelleme kancaları (update hook): şemanın ima ettiği veri düzeltmeleri.
- Modül yükseltmeleri: sürümü ilerleyen her modülün kendi
upgrade()işlemi ve yeni numaralı SQL migration dosyaları. Çekirdek artık günceldir. - Yapılandırma içe aktarımı: bildirimsel durum, onu anlayan koddan sonra gelir.
- Önbellek yeniden kurulumu: derlenmiş konteyner silinir, AssetMapper özetleri yeniden yazılır. (Paket bir Git anlık görüntüsüdür;
public/assetsGit'e girmez, bu adım olmazsa yeni içe aktarma girişleri 404 verir.)
Yeniden çalıştırılabilirlik
Her aşama kendi ilerlemesini kaydeder (migration tablosu, kancalar defteri, modül sürüm ayarı). Yarıda kalan bir çalıştırma tekrar çalıştırılabilir: biten iş atlanır, tekrarlanmaz. Bu yüzden güncelleyici güvenle devam edebildiği yerde hataları toplar ve işlemi bırakmaz; kimsenin adını bilmediği bir ara durumda bırakmaktan kaçınır.
Güncelleme kancası yazmak
Migration şemayı değiştirir; kanca veriyi değiştirir ya da DDL'in ifade edemediği her şeyi yapar: bir alan türü değişince düz indeksi yeniden kurmak, bir ayar değerini yeniden yazmak, yeni eklenen sütunu geri doldurmak.
final class BackfillSummaryHook implements UpdateHookInterface
{
public function id(): string { return 'portal.backfill_summary'; } // asla değişmez
public function version(): string { return '2.2.51'; } // hangi sürüme ait
public function description(): string { return 'Fill summary from body'; }
public function run(): ?string { /* idempotent iş */ return null; }
}
Sözleşme:
- Kimlik değişmez. "Yapıldı" bilgisi kimliktir; yeniden adlandırmak kancayı ikinci kez çalıştırır.
- Sürüme bağlıdır. Birkaç sürüm atlansa bile kancalar sürüm sırasıyla uygulanır.
- Yine de idempotent olmalı. Defter kanca döndükten sonra yazılır; kanca ortasında ölürse bir sonraki denemede tekrar çalışır.
Güncelleme bildirimleri
Çekirdek, modül ve tema güncellemelerini yöneticiler beklemeden görür: core.release_check cron işi 6 saatte bir çekirdek yayın bilgisini, yama bildirimini ve imzalı eklenti kataloğunu yeniler, ardından yeni bir sürüm varsa her yöneticinin bildirim kutusuna (AACP ve Studio'daki çan) "{ad} için yeni sürüm yayınlandı" notunu bırakır. Bildirime tıklayınca ilgili ekran açılır (çekirdek için Güncellemeler, modül ve tema için mağaza).
Aynı sürüm için bildirim bir kez düşer (öğe + sürüm anahtarıyla tekilleştirilir); aynı öğenin daha yeni bir sürümü çıkarsa yeni bildirim gelir. Çekirdekle uyumsuz bir eklenti sürümü bildirilmez. Cron çalışmıyorsa mağaza ve Güncellemeler ekranları eskisi gibi ziyaret anında yeniler; yani bildirim, cron'un düzenli çalıştığı sitelerin bonusudur.
Operatör için
| İş | Yol |
|---|---|
| Güncelleme var mı bak | AACP → Sistem → Güncellemeler |
| Komut satırından uygula | php cp-core/bin/console cp:update |
| Önce ne olacağını gör | cp:update --dry-run (makine okunur çıktı için --json) |
| Sorun çıkarsa | Önceki dosyalar cp-core/var/update/backup-<sürüm>/ altındadır |