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

> Local geliştirme stack'i, override.yml servisleri, otomatik migration/seed

Dev ortamı `docker-compose.yml` + `docker-compose.override.yml` ile çalışır. `docker compose up` çağrıldığında override **otomatik** yüklenir — başka flag gerekmez. Tüm altyapı container olarak ayağa kalkar.

## Başlatma

```bash theme={null}
cp .env.example .env     # değerleri doldur (CHANGE_ME)
docker compose up -d --build
```

İlk `up`'ta sırasıyla: altyapı (Postgres → Redis → RabbitMQ → Seq → Keycloak) healthcheck'leri geçer, ardından API başlar. API ayağa kalkarken **migration'lar otomatik uygulanır** (`Services:Migration:AutoDeploy = true`) ve **Keycloak realm/client/user'ları otomatik provision edilir** (`KeycloakProvisioning:Enabled = true`).

<Note>
  API, altyapı servislerinin `condition: service_healthy` olmasını bekler (`depends_on`). Postgres/Redis/RabbitMQ/Keycloak hazır olmadan API başlamaz.
</Note>

## Servisler

| Servis       | Image                             | Host port                        | Container              |
| ------------ | --------------------------------- | -------------------------------- | ---------------------- |
| API          | `diyanetcleanarchitectureapi:dev` | `5005` (→ 8080), `5006` (→ 8081) | `diyanet-api`          |
| Website SPA  | `diyanet-website:dev`             | `3000` (→ 80)                    | `diyanet-website`      |
| Admin SPA    | `diyanet-admin:dev`               | `3001` (→ 80)                    | `diyanet-admin`        |
| PostgreSQL   | `postgres:16-alpine`              | `5432`                           | `diyanet-postgres`     |
| Redis        | `redis:7-alpine`                  | `6379`                           | `diyanet-redis`        |
| RabbitMQ     | `rabbitmq:3.13-management-alpine` | `5672`, `15672` (UI)             | `diyanet-rabbitmq`     |
| Keycloak     | `quay.io/keycloak/keycloak:26.0`  | `8080`                           | `diyanet-keycloak`     |
| Seq          | `datalust/seq:latest`             | `5341` (ingest), `5342` (UI)     | `diyanet-seq`          |
| pgAdmin      | `dpage/pgadmin4:latest`           | `5050`                           | `diyanet-pgadmin`      |
| RedisInsight | `redis/redisinsight:latest`       | `5540`                           | `diyanet-redisinsight` |
| Prometheus   | `prom/prometheus:v3.0.1`          | `9090`                           | `diyanet-prometheus`   |
| Grafana      | `grafana/grafana:11.4.0`          | `3030` (→ 3000)                  | `diyanet-grafana`      |

Postgres, Redis, RabbitMQ ve Keycloak healthcheck taşır. RabbitMQ, `rabbitmq_delayed_message_exchange` plugin'i ile gelir (MassTransit delayed redelivery için).

## Servis erişim tablosu

| Amaç           | URL                               | Giriş                                       |
| -------------- | --------------------------------- | ------------------------------------------- |
| API (Swagger)  | `http://localhost:5005/swagger`   | —                                           |
| API (Scalar)   | `http://localhost:5005/scalar/v1` | —                                           |
| Website        | `http://localhost:3000`           | Keycloak                                    |
| Admin          | `http://localhost:3001`           | Keycloak                                    |
| Keycloak admin | `http://localhost:8080`           | `admin` / `KEYCLOAK_ADMIN_PASSWORD`         |
| RabbitMQ UI    | `http://localhost:15672`          | `RABBITMQ_USER` / `RABBITMQ_PASSWORD`       |
| Seq UI         | `http://localhost:5342`           | — (dev'de auth kapalı)                      |
| pgAdmin        | `http://localhost:5050`           | `PGADMIN_EMAIL` / `PGADMIN_PASSWORD`        |
| RedisInsight   | `http://localhost:5540`           | Host `redis`, port `6379`, `REDIS_PASSWORD` |
| Prometheus     | `http://localhost:9090`           | —                                           |
| Grafana        | `http://localhost:3030`           | `admin` / `admin`                           |
| Hangfire       | `http://localhost:5005/jobs`      | `admin` / `admin`                           |

## Keycloak — iki realm

Provisioning, API başlarken iki dev realm'i otomatik kurar:

* `diyanet-vatandas-dev-realm` → client `diyanet-website` (public + PKCE, token 2 saat)
* `diyanet-yonetim-dev-realm` → client `diyanet-admin` (public + PKCE, token 5 dakika)

Realm'ler, client'lar, protocol mapper'lar ve test kullanıcıları `appsettings.Development.json` → `KeycloakProvisioning` bölümünden okunur. `RunOnce: true` olduğu için her başlatmada tekrar tetiklenmez.

<Warning>
  Dev compose iki ayrı Keycloak URL değişkeni kullanır: `KEYCLOAK_INTERNAL_URL` (API container içinden, `http://diyanet-keycloak:8080`) ve `KEYCLOAK_EXTERNAL_URL` (tarayıcıdan, `http://localhost:8080`). SPA bundle'ına external URL gömülür. `KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true` sayesinde discovery doc'taki `jwks_uri` istek host'una göre üretilir — aksi halde API `IDX10500 No security keys` hatası alır.
</Warning>

## Tek servisi yeniden derleme

```bash theme={null}
docker compose up -d --build diyanet-admin
docker compose logs -f diyanet-api
```

## Sonraki adımlar

<CardGroup cols={2}>
  <Card title="Komutlar" href="/operations/commands">
    Docker / dotnet ef / npm referansı.
  </Card>

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

  <Card title="Gözlemlenebilirlik" href="/operations/observability">
    Seq, Prometheus, Grafana, Hangfire.
  </Card>

  <Card title="Stage Docker" href="/operations/docker-stage">
    Reverse proxy'li dağıtım.
  </Card>
</CardGroup>
