Skip to main content
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

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:
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)
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.

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

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.

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:
StackComposeEnv
Platformdocker-compose.platform.yml.env.platform (sadece LE email)
Paylaşımlı infradocker-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 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

Ortam değişkenleri

.env.prod / .env.infra / .env.app kategorileri.

Stage Docker

Aynı mimarinin stage varyantı.

Gözlemlenebilirlik

Prometheus/Grafana opt-out.

Komutlar

Hetzner script referansı.