Add the Ansible README and expand prod bootstrap coverage for StorageBox keys, DB labels, DB stack configuration, and act runner setup. Update MongoDB configuration for replica set support and refresh prod roadmap/setup documentation for Swarm labels, StorageBox-backed cert paths, and recovery guidance.
🌍 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ı (
testveprod) - 🤖 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/testterraform/hetzner/prod
- 🤖 Her iki ortam için Ansible otomasyon varlıkları:
ansible/test/test-bootstrap.ymlansible/prod/prod-bootstrap.ymlansible/roles/*ansible/test/group_vars/*veansible/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.md—setup/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.mdtest-app-graphs.pngtest-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/tcp443/tcp
- Kritik servisler yalnızca private ağda erişilebilir (örneğin Vault
8200, PostgreSQL5432, MongoDB27017, 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 = trueetkinleştirilmiştir. - Terraform state ve gizli dosyalar commit'lenmemelidir.
Ayrıca bkz.:
- facts/firewall.md — tüm firewall kurallarının araç bazında özet dökümantasyonu
- setup/01-private-network-port-matrisi.md
terraform/hetzner/test/firewall.tfterraform/hetzner/prod/firewall.tf
🗂️ 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,sedveya 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_tokenadmin_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:
setup/00-genel-yol-haritasi.md— genel kararlar ve sınırlarsetup/01-private-network-port-matrisi.md— private/public port politikasısetup/02-test-terraform-iaac.md— test Terraform aşamasısetup/03-test-ansible-bootstrap.md— test OS/bootstrap/sertleştirmesetup/04-test-db-docker-kurulum.md— test DB stack kurulumu (Swarm üzerinde)setup/05-test-runner-ve-deploy-onkosullari.md— test runner ve deploy ön koşullarısetup/06-prod-terraform-iaac.md— prod Terraform aşamasısetup/07-prod-ansible-bootstrap.md— prod OS/bootstrap/sertleştirmesetup/08-prod-db-cluster-kurulum.md— prod DB cluster stack (MongoDB + Patroni/etcd)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,
.envgizli 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.ymlbeklenen bir çıktı yoludur; üretilene kadar mevcut olmayabilir.- Bazı yol haritası adımları, yalnızca bu depo değil, daha geniş kapsamlı
iklim.couygulama 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ı açıyor
- placement group'lar atanmış
- üretilen envanter YAML
ansible/{test,prod}/inventory/generated/*.ymlyoluna 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
- Hetzner Terraform Provider: https://registry.terraform.io/providers/hetznercloud/hcloud/latest
- Hetzner Networks: https://docs.hetzner.com/cloud/networks/overview/
- Hetzner Firewalls: https://docs.hetzner.com/cloud/firewalls/overview
- Hetzner Placement Groups: https://docs.hetzner.com/cloud/placement-groups/overview
- Docker Swarm overlay networking: https://docs.docker.com/engine/network/drivers/overlay/
- Gitea act_runner: https://docs.gitea.com/usage/actions/act-runner