Sem Göksu
Sem Göksu
Yazılım · Yolculuk · Fenerbahçe
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 26 0
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 komut

DigitalOcean 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-prod
3. 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: blogappdb
5. 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
Publish sihirbazi - Azure App Service hedefi secili, production resource group'u.
Publish sihirbazi - Azure App Service hedefi secili, production resource group'u.

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.

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 olur
2. 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 Hardening
API 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 Build
Expo'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...
Etiketler: #ASP.NET #C#
Paylaş:

Yorumlar (0)

Henüz yorum yok. İlk yorumu sen yap!

Yorum bırak

* Yorumlar moderasyon sonrası yayınlanır. E-posta gizli tutulur.