> ## 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 — Prod Ortamı

> On-prem dağıtım, müşteri altyapısı, sertifika ve Hetzner çok-proje

Production, `docker-compose.yml` + `docker-compose.prod.yml` ile çalışır. Mimari **stage ile birebir aynıdır** (`nginx-proxy` + `acme-companion`, path-based routing) — fark prod realm isimleri, prod sertifikaları ve müşterinin mevcut altyapısına bağlanmasıdır.

## Başlatma

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

Routing yine path-based: `/` → Website, `/admin/` → Admin, `/api/*` → API, `/grafana/` → Grafana.

## Müşteri on-prem altyapısı

Prod'da altyapı container olarak çalışmaz; müşterinin **mevcut** servislerine bağlanılır. `.env.prod`'da host'lar verilir:

```text theme={null}
POSTGRES_HOST=postgres.prod.diyanet.local
REDIS_HOST=redis.prod.diyanet.local
RABBITMQ_HOST=rabbitmq.prod.diyanet.local
SEQ_HOST=seq.prod.diyanet.local
KEYCLOAK_BASE_URL=https://auth.diyanet.gov.tr      # API bağlanır (docker network dışından)
KEYCLOAK_EXTERNAL_URL=https://auth.diyanet.gov.tr  # tarayıcı gider (SPA bundle'ına gömülür)
```

<Note>
  Müşteri prod'u tipik olarak **Windows Server + mevcut PostgreSQL** (CREATE DATABASE yetkili) ve **intranet** ortamıdır. İntranette Let's Encrypt çalışmaz (HTTP-01 challenge internet erişimi ister) — bu durumda kurumun **kurumsal TLS sertifikası** nginx-proxy'nin cert volume'üne mount edilir, acme-companion devre dışı bırakılır.
</Note>

## Sertifika volume backup

`nginx-proxy-certs` volume'ü Let's Encrypt sertifikalarını tutar. Yeniden kurulum/taşımada rate-limit'e takılmamak için yedeklenmelidir:

```bash theme={null}
docker run --rm -v nginx-proxy-certs:/certs -v $(pwd):/backup alpine \
  tar czf /backup/certs-backup.tar.gz -C /certs .
```

Kurumsal cert kullanılıyorsa bu sertifika dosyaları (host'ta) yedeklenir.

## Test kullanıcıları

<Warning>
  `appsettings.Production.json`'da test kullanıcı tanımı **yoktur** — müşteri prod'unda olmamalıdır. Kullanıcılar Keycloak admin panelinden manuel oluşturulur veya kurumun mevcut IdP'sine federe edilir.
</Warning>

## Observability'i kapatma

Müşteri Prometheus/Grafana istemiyorsa:

1. `docker-compose.prod.yml` içindeki `prometheus` + `grafana` bloklarını yorumla.
2. `appsettings.Production.json`'da `Observability:Enabled = false` yap.

Health check endpoint'leri (`/health/*`) bağımsız çalışmaya devam eder.

## Hetzner — çok-proje demo

Tek bir Hetzner VPS üzerinde **3 ayrı proje** (Diyanet/Camii, Kurban, Bağış) paylaşımlı infra ile çalışır. Üç ayrı compose dosyası kullanılır:

| Stack            | Compose                           | Env                                    |
| ---------------- | --------------------------------- | -------------------------------------- |
| Platform         | `docker-compose.platform.yml`     | `.env.platform` (sadece LE email)      |
| Paylaşımlı infra | `docker-compose.shared-infra.yml` | `.env.infra.prod`                      |
| App (×3)         | `docker-compose.app.yml`          | `.env.app.{diyanet,kurban,bagis}.prod` |

Tek Postgres içinde 4 DB (`diyanet`, `kurban`, `bagis`, `keycloak`), tek Keycloak (6 client), tek Redis/RabbitMQ/Seq. Paylaşımlı `platform-nginx-proxy`, `VIRTUAL_HOST`'a göre her container'a vhost üretir.

```bash theme={null}
bash scripts/hetzner-bootstrap.sh     # Docker + UFW + deploy user
bash scripts/hetzner-env-init.sh      # env dosyalarını + secret'ları üret
bash scripts/hetzner-platform.sh up   # platform (bir kez)
bash scripts/hetzner-deploy.sh infra  # paylaşımlı infra (bir kez)
bash scripts/hetzner-deploy.sh app diyanet
bash scripts/hetzner-deploy.sh app kurban
bash scripts/hetzner-deploy.sh app bagis
```

Domain pattern: `diyanet.pro` (root), `kurban.diyanet.pro`, `bagis.diyanet.pro`, `sso.diyanet.pro` (Keycloak), `grafana.diyanet.pro`, `seq.diyanet.pro`. Detaylar `HETZNER.md`'de.

## Sonraki adımlar

<CardGroup cols={2}>
  <Card title="Ortam değişkenleri" href="/operations/env-variables">
    .env.prod / .env.infra / .env.app kategorileri.
  </Card>

  <Card title="Stage Docker" href="/operations/docker-stage">
    Aynı mimarinin stage varyantı.
  </Card>

  <Card title="Gözlemlenebilirlik" href="/operations/observability">
    Prometheus/Grafana opt-out.
  </Card>

  <Card title="Komutlar" href="/operations/commands">
    Hetzner script referansı.
  </Card>
</CardGroup>
