React Native İçin Self-Hosted OTA Güncellemeler: Hot Updater ile Adım Adım Rehber

React Native İçin Self-Hosted OTA Güncellemeler: Hot Updater ile Adım Adım Rehber
Bu yazıda, React Native projelerinde over-the-air (OTA) güncellemeleri kendi altyapınız üzerinde (self-hosted) yönetmek için kullanılan Hot Updater yaklaşımını hem teknik hem teknik olmayan yönleriyle ele alacağız. Amaç, mobil uygulamanızı her küçük değişiklikte mağazalara yeniden göndermeden güncelleyebilmek ve bunu güvenli, ölçeklenebilir ve maliyet kontrollü bir şekilde yapabilmektir. Kompanse Yazılım gibi React Native tabanlı ürünler geliştiren ekipler için bu mimari, yayın süreçlerini ciddi biçimde hızlandırır.
OTA Güncelleme Nedir ve Neden Önemlidir?
OTA (Over-the-Air) güncelleme, uygulama mağazasına yeni bir sürüm göndermeden, doğrudan uzaktaki bir sunucudan JavaScript bundle’ını ve ilgili varlıkları çekerek uygulamayı güncelleme yöntemidir. Kısaca:
- Hata düzeltmelerini ve küçük özellikleri çok daha hızlı yayınlarsınız.
- Mağaza inceleme (review) süreçlerine takılmadan kritik yamalar geçebilirsiniz.
- Özellikle React Native gibi JS tabanlı yapıda, native derleme gerektirmeyen değişiklikleri anında canlıya alırsınız.
Teknik olmayan açıdan bakarsak, OTA güncellemeler:
- Ürün ekiplerinin pazara çıkış süresini kısaltır.
- Müşteri geri bildirimlerine daha hızlı tepki vermenizi sağlar.
- Canlı ortamda A/B testleri ve kademeli dağıtım stratejilerini kolaylaştırır.
Hot Updater Nedir?
Hot Updater, React Native projeleri için tasarlanmış, provider tabanlı bir OTA güncelleme altyapısıdır. Temel olarak iki farklı kullanım modu sunar:
- Managed (yönetilen) mod: Supabase, Firebase, Cloudflare, AWS gibi hazır sağlayıcılarla hızlı entegrasyon.
- Self-hosted (custom) mod: Veritabanı katmanını tamamen kendinizin yönettiği, Hot Updater sunucu paketini kullanan özelleştirilebilir mimari.
Bu yazıda ağırlıklı olarak self-hosted yaklaşımı ve temel kurulum adımlarını ele alacağız; ancak önce managed kullanımın nasıl çalıştığını anlamak, mimariyi kavramanızı kolaylaştırır.
Temel Mimarinin Bileşenleri
Hot Updater ile bir OTA altyapısı kurarken üç ana bileşen vardır:
- CLI & Build Plugin: Uygulama bundle’ını üretir, paketler ve sunucuya yükler.
- Sunucu (Database Katmanı): Hangi sürümün hangi kullanıcıya gideceğini belirleyen metadata’yı tutar.
- Storage (Depolama): Asıl JavaScript bundle ve varlıkların saklandığı bulut depolama (S3, Supabase, Firebase vb.).
Self-hosted modda:
- Sunucu tarafında
@hot-updater/serverile kendi API’nizi kurarsınız. - CLI tarafında
@hot-updater/standalonekullanarak bu API’ye konuşursunuz. - Storage için yine AWS S3, Cloudflare R2, Supabase Storage veya Firebase Cloud Storage gibi sağlayıcıları kullanabilirsiniz.
Managed Mod: Temel Kullanım Adımları
Önce managed kullanımı kısaca görelim; çünkü self-hosted mimari de aynı mantığı izler, sadece veritabanı katmanı sizin kontrolünüzdedir.
1. Hot Updater Kurulumu
Projenize Hot Updater’ı eklemek için:
npm install hot-updater --save-dev
2. Provider Başlatma (Init)
İlk kurulum için interaktif CLI komutunu çalıştırırsınız:
npx hot-updater init
Bu komut ile:
- Build sistemi seçersiniz (Bare/React Native CLI, Re.Pack veya Expo).
- Provider seçersiniz (Supabase, Firebase, Cloudflare, AWS).
- Seçtiğiniz sağlayıcıya göre kimlik bilgileri ve kaynaklar için yönlendirilirsiniz.
3. Otomatik Oluşan Konfigürasyon Dosyaları
npx hot-updater init sonrasında iki temel dosya oluşur:
- .env.hotupdater: Sağlayıcıya ait URL, anahtar ve bucket bilgileri.
- hot-updater.config.ts: Build ve storage ayarlarını içeren TypeScript konfigürasyonu.
Örneğin Supabase ile bare React Native kullanıyorsanız konfigürasyon şu şekilde olabilir:
import { bare } from "@hot-updater/bare";
import { supabaseStorage, supabaseDatabase } from "@hot-updater/supabase";
import { defineConfig } from "hot-updater";
import { config } from "dotenv";
config({ path: ".env.hotupdater" });
export default defineConfig({
build: bare({
enableHermes: true,
}),
storage: supabaseStorage({
supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
bucketName: process.env.HOT_UPDATER_SUPABASE_BUCKET_NAME!,
}),
database: supabaseDatabase({
supabaseUrl: process.env.HOT_UPDATER_SUPABASE_URL!,
supabaseAnonKey: process.env.HOT_UPDATER_SUPABASE_ANON_KEY!,
}),
});
Buradaki .env değişkenleri yalnızca dağıtım sırasında CLI tarafından kullanılır, uygulama bundle’ının içine gömülmez. Özellikle react-native-dotenv gibi çözümler kullanıyorsanız güvenlik yönergelerini dikkate almak önemlidir.
4. Uygulamayı HotUpdater ile Sarmak
React Native tarafında, ana bileşeni HotUpdater.wrap ile sarmalayarak OTA kontrolünü aktif hale getirirsiniz:
import { HotUpdater } from "@hot-updater/react-native";
import { View, Text } from "react-native";
function App() {
return (
<View>
<Text>Hello World</Text>
</View>
);
}
export default HotUpdater.wrap({
baseURL: "https://your-update-server-url/api/check-update",
updateStrategy: "appVersion", // veya "fingerprint"
updateMode: "auto",
requestHeaders: {
// İsteğe bağlı özel header'lar
},
fallbackComponent: ({ progress, status }) => (
<View
style={{
flex: 1,
padding: 20,
borderRadius: 10,
justifyContent: "center",
alignItems: "center",
backgroundColor: "rgba(0, 0, 0, 0.5)",
}}
>
<Text style={{ color: "white", fontSize: 20, fontWeight: "bold" }}>
{status === "UPDATING" ? "Updating..." : "Checking for Update..."}
</Text>
{progress > 0 ? (
<Text style={{ color: "white", fontSize: 20, fontWeight: "bold" }}>
{Math.round(progress * 100)}%
</Text>
) : null}
</View>
),
})(App);
baseURL değeri, init işlemi sonrası terminal çıktısında veya provider konsolunda size verilir. Bu URL, uygulamanın yeni sürüm olup olmadığını kontrol ettiği endpoint’tir.
Self-Hosted (Custom) Mod: Kendi Hot Updater Sunucunuzu Kurun
Managed mod, hızlı başlangıç için idealdir; ancak birçok kurum, özellikle büyük ölçekli veya regülasyonlu sektörlerde, veritabanı ve metadata katmanını kendi kontrolünde tutmak ister. İşte burada Hot Updater’ın self-hosted modu devreye girer.
Self-Hosted Modun Temel Fikri
Self-hosted modda:
- Hot Updater’ın CLI’si, standalone repository üzerinden kendi API’nize konuşur.
- Sunucu tarafında
@hot-updater/serverile OTA için gerekli endpoint’leri sağlarsınız. - Storage yine resmi eklentilerle yönetilir; yani veritabanı sizde, dosya depolama bulutta kalabilir.
Kurulum için önce gerekli paketleri ekleyelim:
npm install @hot-updater/server @hot-updater/standalone --save-dev
CLI Tarafı: Self-Hosted Sunucuya Bağlanmak
Artık hot-updater.config.ts dosyanızda standaloneRepository kullanarak CLI’nin sizin self-hosted API’nize bağlanmasını sağlayabilirsiniz:
import { defineConfig } from "@hot-updater/core";
import { bare } from "@hot-updater/bare";
import { s3Storage } from "@hot-updater/aws";
import { standaloneRepository } from "@hot-updater/standalone";
export default defineConfig({
build: bare(),
storage: s3Storage({
region: "auto",
endpoint: process.env.R2_ENDPOINT,
credentials: {
accessKeyId: process.env.R2_ACCESS_KEY_ID!,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
},
bucketName: process.env.R2_BUCKET_NAME!,
}),
database: standaloneRepository({
baseUrl: "http://localhost:3000/hot-updater",
}),
});
Burada:
- storage: Cloudflare R2 üzerinden S3 uyumlu bir depolama kullanıyor.
- database:
standaloneRepositoryilehttp://localhost:3000/hot-updateradresindeki kendi sunucunuza istek atıyor.
Sunucu Tarafı: Storage URI Mantığı
Self-hosted modun en önemli noktalarından biri storage URI yaklaşımıdır. Akış şu şekildedir:
npx hot-updater deploykomutunu çalıştırdığınızda, CLI bundle’ı storage’a yükler ve karşılığında birstorageUriüretir.- Bu
storageUri, self-hosted veritabanınıza kaydedilir. - React Native istemcisi güncelleme kontrolü yaptığında, sunucu ilgili sürüm için
storageUribilgisini döner. - Sunucu, konfigüre ettiğiniz storage plugin üzerinden bu URI’yi gerçek bir indirme URL’sine çevirir ve istemci bu URL’den bundle’ı indirir.
Sunucu tarafında storages alanı, bu URI’leri çözecek (decode edecek) eklentilerin listesidir.
Birden Fazla Storage Plugin Kullanımı
Self-hosted sunucunuzda birden fazla storage sağlayıcısını aynı anda kullanabilirsiniz. Örneğin:
export const hotUpdater = createHotUpdater({
database: kyselyAdapter({ db, provider: "sqlite" }),
storages: [
s3Storage({ /* AWS S3 config */ }),
supabaseStorage({ /* Supabase config */ }),
myCustomStorage({ /* Özel storage config */ }),
],
basePath: "/hot-updater",
});
Bu yapı sayesinde:
- Eski sürümler S3’te, yeni sürümler Supabase’te olsa bile hepsini aynı API’den sunabilirsiniz.
- Farklı bölgelerde (region) farklı storage sağlayıcıları kullanabilirsiniz.
- Migration sürecinde eski ve yeni storage’ları aynı anda yönetebilirsiniz.
Genel tavsiye, CLI tarafındaki storage konfigürasyonunuzla sunucu tarafındaki storage listesini eşleştirmektir. Örneğin:
- CLI:
storage: s3Storage({ ... }) - Sunucu:
storages: [s3Storage({ ... })]
Böylece konfigürasyon basitleşir ve olası hatalar azalır.
Hangi ORM ve Framework ile Kullanabilirsiniz?
Hot Updater self-hosted mod, veritabanı ve web framework seçimi konusunda oldukça esnektir. Kompanse Yazılım gibi TypeScript ağırlıklı çalışan ekipler için bu esneklik büyük avantaj sağlar.
Desteklenen ORM’ler
- Drizzle: SQL’e yakın sözdizimi ve güçlü TypeScript desteği.
- Prisma: Şema odaklı, modern ve geliştirici dostu bir ORM.
- Kysely: Type-safe SQL query builder.
- MongoDB: Native MongoDB driver ile NoSQL tercih edenler için.
Desteklenen Framework’ler
- Hono: Web standardına yakın, hafif ve hızlı.
- Express: Node.js ekosisteminin en yaygın framework’lerinden.
- Elysia: Özellikle Bun ortamı için modern bir seçenek.
- Framework-agnostic: Web standardını destekleyen herhangi bir framework ile entegre edilebilir.
Güvenlik, Performans ve Üretim Ortamı İçin İpuçları
OTA altyapısı kurarken yalnızca teknik entegrasyonu değil, güvenlik ve operasyonel süreçleri de düşünmek gerekir.
Güvenlik
- API anahtarlarını ve provider kimlik bilgilerini her zaman
.envdosyalarında veya gizli değişkenlerde tutun. - Self-hosted sunucunuzda yetkilendirme ve rate limiting mekanizmalarını devreye alın.
- Güncelleme endpoint’lerinizi yalnızca mobil uygulamanızın erişebileceği şekilde kısıtlamayı değerlendirin.
Performans ve Ölçeklenebilirlik
- Storage tarafında CDN destekli çözümler (Cloudflare R2, AWS CloudFront vb.) kullanarak bundle indirme sürelerini kısaltın.
- Sunucu tarafında caching stratejileriyle aynı sürüm bilgisini tekrar tekrar hesaplamak yerine hızlıca döndürün.
- Loglama ve izleme (observability) araçlarıyla hangi sürümün ne kadar kullanıldığını takip edin.
Üretim Hazırlığı
Hot Updater sunucu paketi, graceful shutdown ve hata yönetimi gibi üretim ortamında kritik olan özellikleri destekler. Bu da kendi sunucunuzu kurarken altyapısal detaylara daha az zaman ayırmanızı sağlar.
İş Tarafı Açısından Self-Hosted Hot Updater’ın Avantajları
Teknik detayların ötesinde, self-hosted OTA mimarisi iş ekipleri için şu avantajları sunar:
- Veri egemenliği: Sürüm metadata’sı, dağıtım kuralları ve loglar tamamen sizin veritabanınızda tutulur.
- Maliyet kontrolü: Kullandığınız veritabanı ve storage çözümlerini bütçenize göre seçebilirsiniz.
- Esneklik: Farklı müşteri segmentlerine özel güncelleme stratejileri (örneğin belirli ülkelere farklı bundle) kurgulayabilirsiniz.
- Uyumluluk: Regülasyon gereği verinin belirli ülkede kalması gerekiyorsa, veritabanı ve storage seçiminizi buna göre yapabilirsiniz.
Sonuç: React Native Projelerinde Ölçeklenebilir OTA Stratejisi
React Native ile geliştirdiğiniz bir uygulamada, her küçük değişiklik için mağaza onayı beklemek zorunda kalmak hem geliştirme hızını hem de kullanıcı deneyimini olumsuz etkileyebilir. Hot Updater, hem managed hem de self-hosted modlarıyla bu soruna esnek ve modern bir çözüm sunar.
Özetle:
- Hızlı başlamak istiyorsanız Supabase, Firebase, Cloudflare veya AWS gibi provider’larla managed mod idealdir.
- Veri ve mimari üzerinde tam kontrol istiyorsanız self-hosted modla kendi Hot Updater sunucunuzu kurabilirsiniz.
- Drizzle, Prisma, Kysely veya MongoDB gibi ORM’lerle; Hono, Express veya Elysia gibi framework’lerle entegrasyon mümkündür.
Kompanse Yazılım gibi React Native odaklı çalışan ekipler için, doğru kurgulanmış bir OTA altyapısı; hem teknik borcu azaltır hem de ürün ekiplerinin yenilikleri kullanıcıya çok daha hızlı sunmasına yardımcı olur. İster küçük bir startup olun ister kurumsal bir ekip, Hot Updater ile self-hosted OTA mimarisi, uzun vadede sürdürülebilir ve güvenli bir güncelleme stratejisinin temelini oluşturur.