Neden Ortam Yonetimi Önemli?
Her ciddi projede en az uc ortam vardir: development, staging ve production. Her ortamin farkli API URL'leri, farkli veritabani baglantilari ve farkli API key'leri olur. Bu degiskenleri kod icine yazmak hem guvenlik riski olusturur hem de ortamlar arasi gecisi zorlastirir.
Dev / Staging / Production Ayrimi
- Development: Yerel makine, mock servisler, debug açık (API_URL=http://localhost:8000)
- Staging: Production kopyasi, gerçek API'ler ama test verileri, QA ortami
- Production: Canli kullanicilar, hata toleransi minimum, debug kapalı
.env Dosya Yonetimi
Proje kokunde ortam basina ayri .env dosyalari oluştur:
- .env.development (yerel gelistirme)
- .env.staging (test ortami)
- .env.production (canli ortam)
- .env.example (tum degiskenlerin listesi, gerçek degerler yok, git'e commit edilir)
.env.example yeni katilan gelistiriciler icin rehber gorevi gorur. Icinde API_URL=your_api_url_here gibi placeholder'lar bulunur.
Secret Guvenligi
Git'e Secret Commit Etme
.gitignore'da su satirlar mutlaka olmali: .env, .env.local, .env.development, .env.staging, .env.production, *.keystore, *.jks
Git gecmisi kalicidir, silsen bile erisilir. Push edilen secret mutlaka rotate edilmeli. Populer botlar açık repo'lari tarayarak API key'leri dakikalar icinde calar.
Ne Gizlenmeli?
- Gizli: API secret key'ler, DB sifreleri, signing key'ler, webhook secret'lar
- Public olabilir: Firebase public key, Analytics ID, public URL'ler
Mobil uygulamada client-side'a konan HER deger reverse engineering ile okunabilir. Gercekten gizli degerleri backend'de tut, client'a verme.
EAS Secrets (Expo)
- eas secret:create ile secret ekle, eas secret:list ile listele
- Build sirasinda environment variable olarak inject edilir
- process.env.SECRET_NAME ile erisirsin
- Secret'lar EAS sunucularinda sifrelenmis saklanir
- Takim uyelerinin yetkileri yonetilebilir
- Profil bazli farkli secret tanimlanabilir
Expo Config Plugins ile Ortam Degiskenleri
app.json yerine app.config.js kullanarak dinamik yapilandirma yap:
- process.env degerlerini oku
- Ortama gore farkli bundle ID, uygulama adi veya ikon belirle
- Extra alani ile runtime'da erisilebilir degerler tanimla
- Constants.expoConfig.extra uzerinden runtime'da oku
- Dikkat: Bu degerler binary'ye gomulur, gizli bilgi koyma
React Native'de Ortam Degiskenleri
Web'den Farki
Web'de NEXT_PUBLIC_ prefix'i ile client'a acilan degerler vardir. React Native'de boyle bir mekanizma yok, tum env degiskenleri build zamaninda cozumlenir.
react-native-config
- .env dosyasini okur, build zamaninda inject eder
- Ortam basina farkli .env secimi destekler
- Config.API_URL seklinde kullanilir
Kritik Fark
- Web'de bazi degerler sunucuda kalir (private), bazilari client'a gider
- Mobile'da build zamaninda inject edilen her deger APK/IPA icinde okunabilir
- Hassas key'leri mobile build'e koyma, backend proxy kullan
iOS Info.plist ve Android BuildConfig
| Platform | Yapilandirma | Erisim |
|---|---|---|
| iOS | Info.plist + Xcode schemes | Bundle.main.infoDictionary |
| Android | build.gradle + product flavors | BuildConfig.FIELD_NAME |
| Expo | app.config.js + extra | Constants.expoConfig.extra |
| RN Bare | react-native-config + .env | Config.FIELD_NAME |
iOS'ta User-Defined build settings ile plist'e deger aktarilir. Android'de product flavors ile ortam basina farkli applicationId, ikon ve degerler tanimlanir.
CI/CD'de Secret Injection
GitHub Actions
- Repository Settings > Secrets and variables > Actions
- YAML'da secrets.API_KEY seklinde referans ver
- Environment bazli secret tanimlanabilir
EAS Build
- eas secret:create ile tanimla
- eas.json icinde build profilleri ile env ayrimi yap
Best Practices
- CI/CD platformunun native secret yonetimini kullan
- Secret'lari log'a yazma (maskeleme aktif olsun)
- Secret rotation periyodik yap (90 gun onerilir)
- Minimum yetki prensibi uygula
Ortam yonetimi "sonra hallederiz" denilen ama sorun cikinca en cok zaman kaybi yaratan konudur. Bastan dogru kur, sonra rahat et.