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

# Docker — Stage Ortamı

> nginx-proxy + acme-companion, path-based routing, dış altyapı

Stage ortamı `docker-compose.yml` + `docker-compose.stage.yml` ile çalışır. Bu override, uygulama servislerinin önüne **`nginx-proxy`** ve **`acme-companion`** (Let's Encrypt) koyar; tek domain altında path-based routing yapar. Altyapı (Postgres/Redis/RabbitMQ/Keycloak/Seq) bu compose'a **dahil değildir** — müşterinin mevcut sunucularından gelir.

## Başlatma

```bash theme={null}
cp .env.stage.example .env.stage   # PUBLIC_DOMAIN + secret'ları doldur
docker compose --env-file .env.stage \
  -f docker-compose.yml -f docker-compose.stage.yml up -d --build
```

## Routing

`nginx-proxy` (80/443) içeri gelen istekleri path'e göre yönlendirir:

| Path        | Servis      | `VIRTUAL_*`                                   |
| ----------- | ----------- | --------------------------------------------- |
| `/api/`     | API         | `VIRTUAL_PATH=/api/`, `VIRTUAL_PORT=8080`     |
| `/`         | Website SPA | `VIRTUAL_PATH=/`, `VIRTUAL_PORT=80`           |
| `/admin/`   | Admin SPA   | `VIRTUAL_PATH=/admin/`, `VIRTUAL_PORT=80`     |
| `/grafana/` | Grafana     | `VIRTUAL_PATH=/grafana/`, `VIRTUAL_PORT=3000` |

Her container şu env'leri taşır: `VIRTUAL_HOST=${PUBLIC_DOMAIN}`, `VIRTUAL_PATH`, `VIRTUAL_DEST`, `VIRTUAL_PORT` ve `LETSENCRYPT_HOST=${PUBLIC_DOMAIN}`. `acme-companion`, `LETSENCRYPT_HOST` taşıyan container'lar için otomatik sertifika alır/yeniler.

<Note>
  API host port AÇMAZ (`expose: 8080` — sadece iç ağ). nginx-proxy önde durur. API ortamı `ASPNETCORE_ENVIRONMENT=Staging`, `ASPNETCORE_FORWARDEDHEADERS_ENABLED=true` ile çalışır; CORS ve realm isimleri `PUBLIC_DOMAIN`'den türetilir (`diyanet-vatandas-stage-realm`, `diyanet-yonetim-stage-realm`).
</Note>

## Admin SPA — base path

Admin, stage'de `/admin/` altında serve edilir. Build arg'ı olarak `VITE_BASE_PATH=/admin/` geçilir; container env'i `BASE_PATH=/admin/` ile nginx template'i render edilir. Provisioning, Admin redirect URI'sını `https://${PUBLIC_DOMAIN}/admin/*` olarak set eder (`KeycloakProvisioning__Realms__1__Clients__0__RedirectUris__0`).

## Ön koşullar

* **DNS** — `PUBLIC_DOMAIN`'in A kaydı sunucunun public IP'sine point etmeli.
* **80/443 portları** internet'ten erişilebilir olmalı (Let's Encrypt HTTP-01 challenge için 80 zorunlu).
* Dış altyapı host'ları (`POSTGRES_HOST`, `REDIS_HOST`, `RABBITMQ_HOST`, `SEQ_HOST`, `KEYCLOAK_BASE_URL`) erişilebilir olmalı.

## stage.local — HTTP-only varyant

İnternet/DNS olmadan local'de stage mimarisini denemek için `docker-compose.stage.local.yml` kullanılır (acme-companion devre dışı, HTTP-only):

```bash theme={null}
docker compose --env-file .env.stage.local \
  -f docker-compose.yml -f docker-compose.stage.local.yml up -d --build
```

## Doğrulama

```bash theme={null}
docker ps
docker logs diyanet-acme-companion --tail 30        # sertifika log'u

curl -I https://${PUBLIC_DOMAIN}/                    # Website → 200
curl -I https://${PUBLIC_DOMAIN}/admin/              # Admin   → 200
curl -I https://${PUBLIC_DOMAIN}/api/health/ready    # API     → 200
```

## Sonraki adımlar

<CardGroup cols={2}>
  <Card title="Prod Docker" href="/operations/docker-prod">
    On-prem ve Hetzner çok-proje.
  </Card>

  <Card title="Ortam değişkenleri" href="/operations/env-variables">
    .env.stage.example kategorileri.
  </Card>

  <Card title="Gözlemlenebilirlik" href="/operations/observability">
    Grafana /grafana/ subpath.
  </Card>

  <Card title="Komutlar" href="/operations/commands">
    Compose komut referansı.
  </Card>
</CardGroup>
