React Native
Fullstack Mobil — Bölüm 5: Production'a Deploy
Serinin finali: API'yi Azure App Service'e, mobil uygulamayı EAS Build ile TestFlight ve Play Store'a yayınlıyoruz. GitHub Actions, CORS/rate limiting, migration stratejileri, OTA updates, monitoring — production hazırlığının her yönü.
23 Nisan 2026
6 dk okuma
25
0
IDE tarafinda: Visual Studio tarafinda backend projesine sag tiklayip Publish dediginizde bu sihirbaz acilir. Azure App Service'i secip, production slot'unu isaretleyip Finish ile deploy tamam. Mobil taraf ayrica EAS Build ile store'lara gidiyor.
Merhaba arkadaşlar, serinin son bölümündeyiz. Dört bölüm boyunca yazdığımız şeyi şimdi production'a çıkarıyoruz. API'yi buluta, mobil uygulamayı TestFlight ve Google Play'e. Hem ücretsiz/ucuz hosting seçeneklerini, hem de EAS Build ile store yayınlamayı göreceğiz.Deploy Öncesi Checklist
Production'a çıkmadan önce hiçbir şekilde atlanmaması gereken şeyler:
- [ ] Tüm secret'lar environment variable'da (appsettings.json'da değil)
- [ ] JWT secret key en az 32 karakter ve kimseyle paylaşılmamış
- [ ] HTTPS zorunlu, HTTP yok
- [ ] CORS policy daraltılmış (AllowAnyOrigin production'da kabul edilemez)
- [ ] Rate limiting eklenmiş (.NET 7+ yerleşik)
- [ ] Error handling middleware — hata detayları istemciye sızmasın
- [ ] Logging — Serilog + file veya cloud sink
- [ ] DB migration'ları production DB'de uygulandı
API'yi Buluta: Seçenekler
.NET 9 API'niz için ücretsiz veya ucuz seçenekler:
Azure App Service (ücretsiz tier var):
- En doğal .NET hosting, Microsoft'un kendi platformu
- GitHub Actions entegrasyonu otomatik
- Azure SQL veya PostgreSQL ile uyumlu
Railway (5 USD kredi/ay):
- Git push ile deploy, Heroku benzeri
- PostgreSQL, Redis hazır eklentiler
- Dashboard'dan env variable yönetimi
Fly.io:
- Docker container tabanlı, 3 küçük vm ücretsiz
- Global edge network — kullanıcıya yakın
-
fly deploy tek komutDigitalOcean App Platform:
- 5 USD/ay'dan başlıyor
- Managed database ile kolay
Azure App Service ile Deploy (Örnek)
Burada Azure App Service'i anlatayım çünkü en kolayı:
1. Azure hesabı oluşturun (ücretsiz 200 USD kredi)
2. Resource Group oluşturun:
rg-blogapp-prod3. App Service oluşturun:
- Runtime:
.NET 9- OS: Linux (daha ucuz)
- Plan: B1 (Basic, 13 USD/ay) veya F1 (Free, test için)
4. Azure SQL Database oluşturun:
blogappdb5. App Service → Configuration → Application settings:
ConnectionStrings__Default = Server=tcp:YOUR-SERVER.database.windows.net,1433;Database=blogappdb;User Id=...;Password=...;Encrypt=True
Jwt__Key = (yeni oluşturulmuş uzun secret key)
Jwt__Issuer = https://api.blogapp.com
Jwt__Audience = https://www.blogapp.com
ASPNETCORE_ENVIRONMENT = Production
6. GitHub Actions ile deploy:# .github/workflows/deploy-api.yml
name: Deploy API
on:
push:
branches: [main]
paths: ['api/**']
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@@v4
- uses: actions/setup-dotnet@@v4
with:
dotnet-version: '9.0.x'
- name: Publish
run: dotnet publish api/BlogApp.Api.csproj -c Release -o publish
- name: Deploy to Azure
uses: azure/webapps-deploy@@v3
with:
app-name: blogapp-api
publish-profile: ${{ secrets.AZURE_PUBLISH_PROFILE }}
package: publish
Azure portal'dan publish profile'i indirip GitHub secret'a (AZURE_PUBLISH_PROFILE) ekleyin. Artık main'e push olunca otomatik deploy.Migration'ları Production'da Uygulamak
İki yaklaşım var:
1. Uygulama startup'ta:
db.Database.Migrate() — basit ama concurrent instance'larda sorun olur2. CI pipeline'da: Ayrı bir migration job — daha güvenli, production-safe
# Pipeline adımı
dotnet ef database update --connection "$PROD_CONN_STRING" --project api/BlogApp.Api.csproj
Production HardeningAPI için kritik güvenlik katmanları:
// CORS — sadece kendi domain'lerinize izin verin
builder.Services.AddCors(o =>
{
o.AddDefaultPolicy(p => p
.WithOrigins("https://www.blogapp.com", "exp://...") // Expo dev için
.AllowAnyHeader()
.AllowAnyMethod());
});
// Rate limiting
builder.Services.AddRateLimiter(opt =>
{
opt.AddFixedWindowLimiter("default", o =>
{
o.PermitLimit = 100;
o.Window = TimeSpan.FromMinutes(1);
});
});
app.UseRateLimiter();
// Hata yakalama
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async ctx =>
{
ctx.Response.StatusCode = 500;
await ctx.Response.WriteAsJsonAsync(new { error = "Bir şeyler ters gitti" });
});
});
Mobil Uygulamayı Store'a Çıkarmak: EAS BuildExpo'nun EAS (Expo Application Services) servisi production build'i alıp store'lara yükler. Ücretsiz tier'ı var, yeterli.
cd mobile
npm install -g eas-cli
eas login
eas build:configure
Bu komut eas.json oluşturur:{
"cli": { "version": ">= 5.0.0" },
"build": {
"preview": {
"distribution": "internal",
"ios": { "simulator": true }
},
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}
app.json'ı Production'a Hazırlayın{
"expo": {
"name": "BlogApp",
"slug": "blogapp",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#0f172a"
},
"ios": {
"bundleIdentifier": "com.semgoksu.blogapp",
"supportsTablet": true
},
"android": {
"package": "com.semgoksu.blogapp",
"versionCode": 1,
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#0f172a"
}
},
"extra": {
"eas": { "projectId": "..." }
}
}
}
İlk Build# iOS için (Apple Developer hesabı gerekli)
eas build --platform ios --profile production
# Android için
eas build --platform android --profile production
Build 10-20 dakika sürer, EAS bulutunda yapılır. Tamamlanınca URL alırsınız — .ipa veya .aab dosyası hazır.TestFlight ve Play Store Yayınlama
EAS Submit otomatik yapıyor:
eas submit --platform ios --profile production
eas submit --platform android --profile production
- iOS: App Store Connect'e yüklenir, TestFlight'ta 7200 external tester'a dağıtabilirsiniz, App Store review 1-3 gün sürer- Android: Google Play Console'a yüklenir, internal test → closed test → open test → production kademesi
Version Management
Her yeni release için:
# 1. Kod değişiklikleri
git commit -am "v1.1.0 - Yeni özellikler"
# 2. Version bump (app.json'da)
# "version": "1.1.0"
# Android: "versionCode": 2
# 3. Build
eas build --platform all --profile production --auto-submit
Over-the-Air Updates (OTA)Store approval beklemeden JS-only değişiklikler göndermek için:
eas update --branch production --message "Critical bug fix"
Bu özellik sadece JavaScript/asset değişiklikleri için çalışır. Native kod değiştiyse tam build gerek.Monitoring & Crash Reporting
Production'a çıktıktan sonra:
- Sentry: Crash reporting + performance (hem API hem mobil)
- Application Insights: Azure'daysanız native entegrasyon
- Firebase Crashlytics: Google'ın ücretsiz mobil crash reporting
npm install sentry-expo
# veya @@sentry/react-native
İlk kurulumdan sonra her crash otomatik raporlanır, kullanıcı adı / device / OS versiyonu ile.Kontrol Listesi — Son Bakış
Launch'tan önce son kez:
- [ ] API HTTPS'te ve domain'e bağlı mı?
- [ ] DB backup stratejisi tanımlı mı? (Azure SQL otomatik yapar)
- [ ] CORS production origin'leriyle sınırlı mı?
- [ ] Rate limiting aktif mi?
- [ ] Loglar bir yere akıyor mu?
- [ ] Mobile app icon + splash güzel mi?
- [ ] Privacy Policy ve Terms URL'leri app.json'da mı? (store zorunlu)
- [ ] App store screenshots 5-8 adet hazır mı?
- [ ] App store description SEO dostu yazılmış mı?
Serinin Kapanışı
Beş bölüm boyunca sıfırdan tam çalışan bir fullstack mobil uygulama çıkardık:
1. Mimari — monorepo, stack seçimleri, iki uçlu dev
2. Backend — .NET 9 API, EF Core, CRUD, DTO
3. Auth — JWT, BCrypt, Axios interceptor, Zustand
4. Frontend — Navigation, React Query, ekranlar, formlar
5. Deploy — Azure, EAS Build, store yayını, monitoring
Elinizde artık:
- Azure'da çalışan bir API
- Google Play ve App Store'da yayınlanmış bir mobil uygulama
- GitHub'da CI/CD ile otomatik deploy
- Crash monitoring + logs
Bundan sonrası özelleştirme: push notification (Expo Notifications), analytics (Mixpanel / Amplitude), feature flags (LaunchDarkly), A/B testing. Her biri için ayrı bir makale yazacağım.
Beni bu uzun yolculukta takip ettiğiniz için teşekkürler. Yorumlarda yapmak istediğiniz uygulamayı anlatın, bir sonraki seriyi ona göre planlayabilirim. Sağlıcakla kalın, yolunuz hep açık olsun...
Yorumlar (0)
Henüz yorum yok. İlk yorumu sen yap!