> ## Documentation Index
> Fetch the complete documentation index at: https://docs.diyanet.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# Ortam Değişkenleri

> .env örnek dosyaları, kategori tabloları ve appsettings ilişkisi

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ı                            |

<Warning>
  `.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.
</Warning>

## 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:

```text theme={null}
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

<CardGroup cols={2}>
  <Card title="Dev Docker" href="/operations/docker-dev">
    .env.example ile local stack.
  </Card>

  <Card title="Prod Docker" href="/operations/docker-prod">
    .env.prod ve Hetzner env'leri.
  </Card>

  <Card title="Keycloak ortamları" href="/keycloak/environments">
    Realm/client değişkenleri.
  </Card>

  <Card title="Komutlar" href="/operations/commands">
    \--env-file kullanımı.
  </Card>
</CardGroup>
