* Introduces an Ansible role for installing and registering `act_runner` for Gitea Actions. * Automates PostgreSQL and MongoDB deployment on Docker Swarm in the test environment, leveraging Docker named volumes for data persistence. * Translates core documentation, including `README.md` and `setup/04-test-db-docker-kurulum.md`, to Turkish. * Adds comprehensive documentation for firewall architecture (`facts/firewall.md`) and Docker Swarm node recovery (`facts/swarm-node-recovery.md`). * Enhances security hardening by ensuring `fail2ban` is enabled and streamlining admin SSH key management via Ansible. * Updates Ansible vault structure to support new secret variables and adds `.vault_pass` to `.gitignore`.
10 KiB
🌍 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