Tüm sırlar ve ortama özel ayarlar .env dosyalarından gelir. Repoda yalnızca *.example şablonları bulunur; gerçek .env dosyaları .gitignore’dadır.
Örnek dosyalar
| Şablon | Ortam | Komut |
|---|
.env.example | Dev | cp .env.example .env |
.env.stage.example | Stage | cp .env.stage.example .env.stage |
.env.stage.local.example | Stage (HTTP-only) | cp .env.stage.local.example .env.stage.local |
.env.prod.example | Prod (tek müşteri) | cp .env.prod.example .env.prod |
.env.platform.example | Hetzner platform | cp .env.platform.example .env.platform |
.env.infra.prod.example | Hetzner paylaşımlı infra | cp .env.infra.prod.example .env.infra.prod |
.env.app.{diyanet,kurban,bagis}.prod.example | Hetzner app stack’leri | her proje için ayrı |
.env* dosyaları (örnekler hariç) .gitignore’dadır. Gerçek secret’lar repoya commit edilmez. Hetzner’da bash scripts/hetzner-env-init.sh secret’ları openssl rand ile otomatik üretir.
Kategoriler
PostgreSQL
| Değişken | Açıklama |
|---|
POSTGRES_USER / POSTGRES_PASSWORD | Kullanıcı + şifre |
POSTGRES_DB | Veritabanı adı (DiyanetCleanArchitecture) |
POSTGRES_HOST / POSTGRES_PORT | Stage/prod — dış sunucu (dev’de default postgres:5432) |
Redis & RabbitMQ
| Değişken | Açıklama |
|---|
REDIS_PASSWORD (+ REDIS_HOST/PORT) | Redis |
RABBITMQ_USER / RABBITMQ_PASSWORD (+ RABBITMQ_HOST) | RabbitMQ |
JWT
| Değişken | Kural |
|---|
JWT_BACKOFFICE_SECRET | min 32 karakter — uygulamanın kendi backoffice JWT’si |
JWT_OTP_SECRET | min 64 karakter — OTP challenge token’ı |
Keycloak
| Değişken | Açıklama |
|---|
KEYCLOAK_INTERNAL_URL | API container içinden (dev: http://diyanet-keycloak:8080) |
KEYCLOAK_EXTERNAL_URL | Tarayıcıdan (SPA bundle’a gömülür) |
KEYCLOAK_BASE_URL | Stage/prod — API’nin dış instance’a bağlandığı URL |
KEYCLOAK_ADMIN / KEYCLOAK_ADMIN_PASSWORD | Provisioning admin |
KEYCLOAK_CLIENT_SECRET | OAuth Keycloak client secret |
WEBSITE_KC_CLIENT_ID / ADMIN_KC_CLIENT_ID | Client ID’ler (diyanet-website / diyanet-admin) |
ADMIN_ROLES | Admin erişimi izinli roller (Admin,SuperAdmin) |
Google IdP (opsiyonel)
| Değişken | Açıklama |
|---|
GOOGLE_VATANDAS_CLIENT_ID / GOOGLE_VATANDAS_CLIENT_SECRET | Vatandaş realm Google broker’ı (redirect URI: {KEYCLOAK_EXTERNAL_URL}/realms/diyanet-vatandas-{env}-realm/broker/google/endpoint) |
pgAdmin (dev)
PGADMIN_EMAIL / PGADMIN_PASSWORD.
Reverse proxy / TLS (stage/prod)
| Değişken | Açıklama |
|---|
PUBLIC_DOMAIN | Public FQDN — sertifika ve CORS bundan türetilir |
LETSENCRYPT_EMAIL | acme-companion DEFAULT_EMAIL (rate-limit + renewal uyarıları) |
Observability
| Değişken | Açıklama |
|---|
OBSERVABILITY_PROJECT | Multi-project Grafana label (a/b/c) |
PROMETHEUS_RETENTION | TSDB tutma süresi (dev 15d, prod 30d) |
GRAFANA_ADMIN_USER / GRAFANA_ADMIN_PASSWORD | Grafana admin (prod’da güçlü şifre zorunlu) |
appsettings vs .env ilişkisi
.NET, __ (çift alt çizgi) ile iç içe config bölümlerini override eder. Compose, .env değerlerini bu konvansiyonla container env’ine yazar — appsettings.{Env}.json’daki karşılıklarını ezer:
ConnectionStrings__DiyanetCleanArchitectureDatabaseConnection=Host=...;Database=...;...
Keycloak__Vatandas__BaseUrl=http://diyanet-keycloak:8080
Jwt__Backoffice__Secret=${JWT_BACKOFFICE_SECRET}
KeycloakProvisioning__Realms__0__IdentityProviders__0__ClientId=${GOOGLE_VATANDAS_CLIENT_ID}
Yani appsettings.{Env}.json varsayılanları taşır; ortama özel/sır değerler .env → compose env → __ override zinciriyle gelir.
Sonraki adımlar
Dev Docker
.env.example ile local stack.
Prod Docker
.env.prod ve Hetzner env’leri.
Keycloak ortamları
Realm/client değişkenleri.
Komutlar
—env-file kullanımı.