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
- CI platform bundle + source map üretir (store ile aynı script)
- Bundle imzalanır (private key yalnızca CI secret)
- Manifest yazılır:
binaryVersion,bundleHash,url,channel - Storage’a upload; content-hash dosya adı; eski versiyon silinmez
- CDN: manifest kısa TTL; bundle immutable cache
- Uygulama manifest poll eder
- İ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:
- Yeni key pair üret
- Yeni binary’ye yeni public key — store submit
- Eski key ile imzalı bundle’ları N release destekle
- 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
| Kaynak | Cache-Control | Not |
|---|---|---|
| manifest.json | no-store veya max-age=60 | Kısa TTL |
| bundle (hash adlı) | immutable, max-age=31536000 | Content-hash adı |
| asset (hash adlı) | immutable, max-age=31536000 | Aynı |
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
| Boyut | CodePush | Hot Updater / self-host |
|---|---|---|
| Kurulum | Hızlı | Daha fazla DevOps |
| Kontrol | Vendor | Tam sizde |
| İmza | Platforma bağlı | Sizin sorumluluğunuz |
| Maliyet | Servis + seat | Storage + CDN |
| Compliance | Vendor region | Kendi bucket |
| Rollback | Panel/CLI | Manifest + 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
bundleIdekleyin
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.