Hot Updater

Hot Updater ile Modern OTA

Hot UpdaterOTADevOps

Self-hosted OTA: bundle imzalama, CDN cache, binary↔JS versiyon sözleşmesi ve CodePush sonrası vendor-agnostic güncelleme stratejisi.

EG

Emre Gürbüz

27 Temmuz 2026 · 4 dk okuma

CodePush bir dönem fiili standarttı; App Center’ın evrimi ve vendor riski ekipleri self-hosted / modern OTA araçlarına (Hot Updater ve benzerleri) yöneltti. Temel fikir aynı: native binary sabitken JS ve asset güncelle. Fark: kontrol sizin CDN’inizde, imzanızda ve CI pipeline’ınızda.

“CodePush klonu kurmak” yetmez — güvenilir dağıtım sistemi kurmaktır. OTA = Over-The-Air (mağaza dışı) güncelleme.

Neden CodePush alternatifi?

Vendor-hosted OTA limitleri:

  • Vendor lock-in: Fiyat, SLA, kapanma riski
  • Compliance: Veri yerleşimi (KVKK, GDPR), audit trail
  • Özelleştirme: Cohort rollout, şirket içi auth
  • Maliyet: Yüksek DAU’da egress pahalı olabilir

Hot Updater benzeri akış: CLI ile publish → object storage → cihaz SDK manifest çeker → imza/hash doğrular → atomik swap → reload.

Self-host’un bedeli DevOps saatidir — küçük ekip için erken olabilir.

Referans mimari

  1. CI platform bundle + source map üretir (store ile aynı script)
  2. Bundle imzalanır (private key yalnızca CI secret)
  3. Manifest yazılır: binaryVersion, bundleHash, url, channel
  4. Storage’a upload; content-hash dosya adı; eski versiyon silinmez
  5. CDN: manifest kısa TTL; bundle immutable cache
  6. Uygulama manifest poll eder
  7. İndirme → hash + imza verify → atomik swap → reload prompt

Örnek bundle + deploy akışı:

yarn react-native bundle --platform android --dev false \
  --bundle-output dist/android/index.android.bundle \
  --sourcemap-output dist/android/index.android.bundle.map

# İmza + upload CI job'ında
# hot-updater deploy --platform android --channel production

Her adım idempotent olmalı — retry’da corruption üretmemeli.

İmzalama: pazarlık konusu değil

Self-host’ta siz güven köküsünüz. CDN/bucket compromise → kötü niyetli JS en büyük risk.

Zorunlu kontroller:

  • Private key yalnızca CI secret; laptop’ta değil
  • Public key uygulama binary’sinde embed — rotation planı yazılı
  • Hash mismatch → asla apply; telemetry
  • Verify fail metrikleri + alert

Key rotation

Public key binary’de olduğu için rotation store release ister:

  1. Yeni key pair üret
  2. Yeni binary’ye yeni public key — store submit
  3. Eski key ile imzalı bundle’ları N release destekle
  4. Eski private key revoke

Yılda bir drill edin.

CDN ve cache

En sık production bug’ları cache kaynaklı:

  • Manifest eski cache’de → kullanıcı yeni bundle görmez
  • Bundle immutable değil → ara node eski dosya servis eder
  • Purge unutulması → rollback yayınlandı ama CDN eski
KaynakCache-ControlNot
manifest.jsonno-store veya max-age=60Kısa TTL
bundle (hash adlı)immutable, max-age=31536000Content-hash adı
asset (hash adlı)immutable, max-age=31536000Aynı

Purge API’yi rollback runbook’una yazın.

Binary ↔ JS versiyon sözleşmesi

CodePush’ta targetBinaryVersion hazırdır. Self-host’ta manifest şemasını siz tanımlarsınız:

{
  "binaryVersion": "2.4.0",
  "channel": "production",
  "bundleId": "2026.07.27.183",
  "hermes": true,
  "minBinaryVersion": "2.4.0",
  "maxBinaryVersion": "2.4.99",
  "bundleUrl": "https://cdn.example.com/bundles/abc123.hbc",
  "signature": "base64..."
}

Native breaking change’de minBinaryVersion yükseltin. En az staging ve production channel; staging auth zayıf olmasın.

CodePush ile karşılaştırma

BoyutCodePushHot Updater / self-host
KurulumHızlıDaha fazla DevOps
KontrolVendorTam sizde
İmzaPlatforma bağlıSizin sorumluluğunuz
MaliyetServis + seatStorage + CDN
ComplianceVendor regionKendi bucket
RollbackPanel/CLIManifest + CDN purge

Ne zaman self-host?

Mantıklı: Regüle sektör, yüksek yayın frekansı, vendor riskini azaltma, DevOps kapasitesi var.

Erken: Ayda bir hotfix; iki kişilik ekip; CodePush hâlâ compliance’ı karşılıyor.

Monitoring

  • Download success/fail
  • Verify fail count
  • Apply success; reload sonrası crash spike
  • Manifest fetch latency
  • Crashlytics release tag’ine OTA bundleId ekleyin

Sık tuzaklar

  • İmza verify’ı “sonra ekleriz”
  • Manifest ve bundle aynı cache politikası
  • Rollback’te eski URL silinmiş
  • Hermes tutarsızlığı — store vs OTA farklı metro config
  • Source map arşivlenmemesi
  • Key rotation planı yok

Production checklist

  • Hermes tutarlılığı — store script = OTA script
  • İmza verify zorunlu; fail’de apply yok
  • Manifest: kısa TTL / no-store
  • Bundle: content-hash + immutable
  • Rollback: önceki URL canlı ve imzalı
  • Channel: staging / production + auth
  • Source map bundleId ile eşleşik
  • Verify fail + download fail alert
  • Key rotation runbook test edildi
  • CDN purge otomasyonlu

Özet

Modern OTA, CodePush klonu değil; imza, versiyon sözleşmesi, CDN hijyeni ve rollback disiplini olan dağıtım sistemidir. Native sınırı aşamazsınız — ama JS hotfix’lerini kendi altyapınızda, audit edilebilir koşturursunuz. DevOps yatırımını önceden hesaplayın.


Diğer yazılar