Murat ÖZDEMİR fd6a0b4f46 docs: fix roadmap inconsistencies between test-env and prod-env
Corrects six documentation files to match the actual deployed pipeline
behavior and align test/prod approaches where they share the same code.

prod-env/02-godaddy-credentials.md
- Step 1: correct secret file from .env.secrets.shared to .env.secrets.swag;
  add clarifying note that .env.secrets.shared holds AppRole/DB secrets
  and must not be used for GoDaddy credentials.
- Step 4: document that GoDaddy A records are now managed automatically
  by the pipeline's 'Update DNS Records' step via the GoDaddy API;
  reference the Gitea variable PROD_FLOATING_IP that must be set once.

prod-env/08-deploy-pipeline-update.md
- Add Step 2 documenting the new 'Update DNS Records' pipeline step
  (GoDaddy API, idempotent check-before-update, requires jq and
  vars.PROD_FLOATING_IP).
- Renumber subsequent steps 3-8 to accommodate the new step.
- Fix DB hostnames in Step 7 (Run Database Init Scripts) from
  iklimco_postgresql/iklimco_mongodb to postgresql/mongodb, matching
  how Swarm overlay DNS resolves service names inside iklimco-net.
- Update context block: correct DB hostname description, replace
  outdated storagebox path note with env-var approach, list new steps.
- Update final step order to 24 steps including the DNS step and
  Release Deploy Lock; mark Wait for etcd as NEW.

prod-env/09-verify.md
- Insert check #2 for the precipitation image directory
  (/mnt/storagebox/precipitation/images) and iklimco_image-data volume
  bind mount, mirroring the equivalent check in test-env/08-verify.md.
- Renumber all subsequent checks (3-12) to maintain sequential ordering.

test-env/03-infra-stack-changes.md
- Update SWAG service volume snippet: replace hardcoded paths
  (swag-vl:/config, /opt/iklimco/swag/dns-conf, /opt/iklimco/swag/site-confs)
  with env-var forms (${SWAG_CONFIG_DIR:-swag-vl}, ${SWAG_DNS_CONF_DIR:-...},
  ${SWAG_SITE_CONFS_DIR:-...}) to match docker-stack-infra.yml.
- Update cert-reloader volume snippet: replace swag-vl and /opt/iklimco/ssl
  with ${SWAG_CONFIG_DIR:-swag-vl} and ${SWAG_CERT_DIR:-/opt/iklimco/ssl},
  enabling StorageBox override in prod without changing the base file.

test-env/04-swag-nginx-configs.md
- Replace RESTRICTED_IP_1/RESTRICTED_IP_2 individual env vars with
  RESTRICTED_IPS (comma-separated CIDR list) in the required-vars section,
  matching env-test/.env and the actual pipeline.
- Update all three IP-restricted template examples (apigw, rabbitmq,
  grafana) from allow ${RESTRICTED_IP_1}; allow ${RESTRICTED_IP_2}; to
  ${RESTRICTED_IPS_BLOCK}, matching the actual .conf.tpl files in the repo.
- Rewrite the deploy step section to match the real pipeline: docker run
  alpine for file writing, RESTRICTED_IPS_BLOCK generation via sed, and
  envsubst with explicit SWAG_VARS filter to protect nginx $upstream_* vars.

test-env/07-deploy-pipeline-update.md
- Step 2 (Prepare SWAG Directories): replace sudo-tee approach with the
  actual docker-run-alpine method used in deploy-test.yml; add nginx
  reload block; update notes to reflect RESTRICTED_IPS_BLOCK generation.
- Step 4 (Re-order): correct step numbering to match actual pipeline
  (21 steps); mark 'Wait for etcd' as already present in pipeline rather
  than a new addition; add Bootstrap Vault TLS Placeholder which was
  missing from the documented order.
2026-05-16 16:52:48 +03:00

🌍 Sunucu Ortam ve Altyapıları

iklim.co test ve prod ortamları için Hetzner Cloud üzerinde Infrastructure-as-code ve operasyonel runbook deposu.

Bu depo şunları kapsar:

  • 🧱 Hetzner altyapısı için Terraform kaynakları (test ve prod)
  • 🤖 Ansible bootstrap playbook'ları, paylaşımlı roller ve envanter hedefleri
  • 📚 Uçtan uca kurulum rehberleri ve yol haritası dokümanları
  • 📊 Boyutlandırma/maliyet analizi ve referans kaynakları

🎯 Kapsam

Temel amaç, sorumluluk sınırları net biçimde tanımlanmış, standart ve belgelenmiş bir altyapı provisioning süreci oluşturmaktır:

  • 🧱 Terraform: bulut altyapısını oluşturur (sunucular, private ağlar, firewall'lar, placement group'lar, floating IP'ler, SSH key kaydı, envanter çıktısı)
  • 🤖 Ansible: OS hazırlığı, güvenlik sertleştirme, Docker/Swarm, runner kurulumu ve StorageBox mount süreçlerini depodaki playbook ve paylaşımlı roller aracılığıyla yönetir
  • 🚀 Uygulama/stack dağıtımı: yol haritası dokümanlarında referans verilen ilgili deployment workflow'ları ve stack manifest'leri tarafından yönetilir

📌 Mevcut Depo Durumu

Bu depo şu an ağırlıklı olarak şunları içermektedir:

  • 🧱 Hazır Terraform kodu:
    • terraform/hetzner/test
    • terraform/hetzner/prod
  • 🤖 Her iki ortam için Ansible otomasyon varlıkları:
    • ansible/test/test-bootstrap.yml
    • ansible/prod/prod-bootstrap.yml
    • ansible/roles/*
    • ansible/test/group_vars/* ve ansible/prod/group_vars/*
  • 📦 Envanter çıktıları ve hedef yollar:
    • ansible/test/inventory/generated/test.yml (takip edilen örnek)
    • ansible/prod/inventory/generated/prod.yml (beklenen çıktı yolu)
  • 📘 Detaylı kurulum aşamaları:
    • setup/00-genel-yol-haritasi.mdsetup/09-prod-runner-ha-ve-swarm.md
  • 🛣️ Ortam yol haritası adımları:
    • roadmap/test-env/*
    • roadmap/prod-env/*
  • 📈 Kapasite planlama ve referans grafikler:
    • hetzner-sizing-report.md
    • test-app-graphs.png
    • test-db-graphs.png

🧭 Hedef Ortam Topolojisi

🧪 Test

Node Rol Private IP Önerilen Tip
iklim-app-01 Swarm manager + app worker + test runner 10.10.10.11 cpx42
iklim-db-01 DB host (manuel/stack tabanlı DB kurulum yolu) 10.10.20.11 cpx42

🏭 Production

Node Rol Private IP Önerilen Tip
iklim-app-01 Swarm manager + app worker + runner (birincil FIP hedefi) 10.20.10.11 cpx42
iklim-app-02 Swarm manager + app worker + runner 10.20.10.12 cpx42
iklim-app-03 Swarm manager + app worker + runner 10.20.10.13 cpx42
iklim-db-01 DB cluster node 10.20.20.11 cpx32
iklim-db-02 DB cluster node 10.20.20.12 cpx32
iklim-db-03 DB cluster node 10.20.20.13 cpx32

🔐 Güvenlik ve Ağ Temeli

Terraform ve kurulum dokümanlarına yansıtılan temel kararlar:

  • Test ve prod, ayrı Hetzner Cloud proje ve token'larıyla birbirinden yalıtılmıştır.
  • Kamuya açık gelen trafik şunlarla sınırlıdır:
    • 22/tcp (yalnızca admin CIDR'ları)
    • 80/tcp
    • 443/tcp
  • Kritik servisler yalnızca private ağda erişilebilir (örneğin Vault 8200, PostgreSQL 5432, MongoDB 27017, iç gözlemlenebilirlik ve broker portları).
  • Host dağılımı stratejisi için placement group'lar kullanılmaktadır.
  • Sunucu kaynaklarında yanlışlıkla silinmeye karşı prevent_destroy = true etkinleştirilmiştir.
  • Terraform state ve gizli dosyalar commit'lenmemelidir.

Ayrıca bkz.:

🗂️ Depo Yapısı

Environment_Infrastructure/
├── ansible/
│   ├── prod/
│   │   ├── ansible.cfg
│   │   ├── group_vars/
│   │   └── prod-bootstrap.yml
│   ├── roles/
│   │   ├── base/
│   │   ├── docker/
│   │   ├── hardening/
│   │   ├── node_dirs/
│   │   ├── storagebox/
│   │   ├── storagebox_ssh_key/
│   │   └── swarm/
│   ├── test/
│   │   ├── ansible.cfg
│   │   ├── group_vars/
│   │   ├── inventory/
│   │   │   └── generated/
│   │   │       └── test.yml
│   │   └── test-bootstrap.yml
│   └── requirements.yml
├── roadmap/
│   ├── test-env/
│   └── prod-env/
├── setup/
│   ├── 00-genel-yol-haritasi.md
│   ├── 01-private-network-port-matrisi.md
│   ├── 02-test-terraform-iaac.md
│   ├── 03-test-ansible-bootstrap.md
│   ├── 04-test-db-docker-kurulum.md
│   ├── 05-test-runner-ve-deploy-onkosullari.md
│   ├── 06-prod-terraform-iaac.md
│   ├── 07-prod-ansible-bootstrap.md
│   ├── 08-prod-db-cluster-kurulum.md
│   └── 09-prod-runner-ha-ve-swarm.md
├── terraform/
│   └── hetzner/
│       ├── test/
│       └── prod/
├── facts/
│   └── firewall.md
├── hetzner-sizing-report.md
├── setup-vs-roadmap-map.md
├── test-app-graphs.png
└── test-db-graphs.png

Ön Koşullar

  • Terraform >= 1.6
  • Hetzner Cloud hesabı ve ortam başına API token
  • SSH anahtar çifti (public key yolu Terraform değişkenlerinde kullanılır)
  • Linux/macOS kabuk araçları (bash, cp, sed veya tercih edilen metin editörü)
  • İlerleyen aşamalarda gerekli: Ansible, Docker, Gitea/Harbor/StorageBox erişimi

🛠️ Terraform Kullanımı

1) 🧪 Test Altyapısı

cd terraform/hetzner/test
cp terraform.tfvars.example terraform.tfvars

terraform.tfvars değerlerini düzenle:

  • hcloud_token
  • admin_allowed_cidrs
  • isteğe bağlı geçersiz kılmalar (location, image, sunucu tipleri, key yolu)

Ardından çalıştır:

terraform init
terraform plan
terraform apply
mkdir -p ../../../ansible/test/inventory/generated
terraform output -raw ansible_inventory_yaml > ../../../ansible/test/inventory/generated/test.yml

2) 🏭 Production Altyapısı

cd terraform/hetzner/prod
cp terraform.tfvars.example terraform.tfvars

terraform.tfvars değerlerini düzenle:

  • hcloud_token (prod token)
  • admin_allowed_cidrs
  • isteğe bağlı geçersiz kılmalar

Ardından çalıştır:

terraform init
terraform plan
terraform apply
mkdir -p ../../../ansible/prod/inventory/generated
terraform output -raw ansible_inventory_yaml > ../../../ansible/prod/inventory/generated/prod.yml

🧱 Kurulum Akışı (Kanonik Sıra)

Kurulum dokümanlarını bu sırayla kullan:

  1. setup/00-genel-yol-haritasi.md — genel kararlar ve sınırlar
  2. setup/01-private-network-port-matrisi.md — private/public port politikası
  3. setup/02-test-terraform-iaac.md — test Terraform aşaması
  4. setup/03-test-ansible-bootstrap.md — test OS/bootstrap/sertleştirme
  5. setup/04-test-db-docker-kurulum.md — test DB stack kurulumu (Swarm üzerinde)
  6. setup/05-test-runner-ve-deploy-onkosullari.md — test runner ve deploy ön koşulları
  7. setup/06-prod-terraform-iaac.md — prod Terraform aşaması
  8. setup/07-prod-ansible-bootstrap.md — prod OS/bootstrap/sertleştirme
  9. setup/08-prod-db-cluster-kurulum.md — prod DB cluster stack (MongoDB + Patroni/etcd)
  10. setup/09-prod-runner-ha-ve-swarm.md — prod runner HA ve deploy kilit modeli

🛣️ Yol Haritası Dokümanları

Yol haritası klasörleri; Swarm stack'leri, SWAG, APISIX, pipeline güncellemeleri ve doğrulama kontrol listeleri için entegrasyon çalışmalarını takip eder:

  • roadmap/test-env/*
  • roadmap/prod-env/*

Bu dokümanlar zaman zaman ilgili repolardan (örneğin uygulama ana deposu workflow ve stack dosyaları) dosyalara referans verir. Bu altyapı temeliyle hizalanmış uygulama rehberleri olarak değerlendirilmelidir.

💰 Boyutlandırma ve Maliyet Özeti

Referans: hetzner-sizing-report.md

Önerilen temel yapı:

  • Test: 2 x cpx42 (app + db)
  • Prod: 3 x cpx42 (app) + 3 x cpx32 (db)

Rapordaki yaklaşık aylık toplam:

  • Test: $59.98
  • Prod: $139.44
  • Toplam: $199.42

🔑 Gizli Bilgi ve State Yönetimi

Kesinlikle commit'lenmemeli:

  • terraform.tfvars, *.tfvars, *.tfstate, .terraform/
  • private key'ler, sertifikalar, .env gizli bilgileri
  • runner token'ları ve vault parola dosyaları

Zorunlu kalıplar için .gitignore dosyasına bkz.

Önerilen:

  • çalışma zamanı gizli bilgilerini güvenli gizli depolarda / şifreli vault dosyalarında tut
  • üretilen çalışma zamanı artifakt'larını, açıkça temizlenmedikçe versiyon kontrolü dışında tut

⚠️ Bilinen Eksikler / Notlar

  • ansible/prod/inventory/generated/prod.yml beklenen bir çıktı yoludur; üretilene kadar mevcut olmayabilir.
  • Bazı yol haritası adımları, yalnızca bu depo değil, daha geniş kapsamlı iklim.co uygulama deposundaki dosyaları hedef alır.

Hızlı Doğrulama Kontrol Listesi

Terraform apply sonrası:

  • sunucular beklenen isimler ve private IP'lerle oluşturulmuş
  • floating IP mevcut ve bağlı
  • firewall'lar yalnızca amaçlanan public portlarııyor
  • placement group'lar atanmış
  • üretilen envanter YAML ansible/{test,prod}/inventory/generated/*.yml yoluna aktarılmış

Bootstrap/deploy aşamaları sonrası:

  • Swarm durumu ve etiketleri dökümantasyonla eşleşiyor
  • DB erişimi yalnızca private ağdan mümkün
  • Vault/API gateway'leri public/private erişim kurallarına uyuyor
  • Runner ve deploy kilit davranışı ortam politikasıyla örtüşüyor

🔗 Referanslar

Description
No description provided
Readme 2.6 MiB
Languages
HCL 83.6%
Jinja 16.4%