# 01 - Test Terraform IaC Bu asamanin amaci test Hetzner Cloud Project icinde minimum IaaS kaynaklarini Terraform ile olusturmaktir. Bu dokuman tek basina uygulanabilir olacak sekilde yazilmistir. ## Kapsam Terraform test ortaminda sunlari olusturur: - Private network: `iklim-test-net` - Subnetler: - App/Swarm subnet: `10.10.10.0/24` - DB subnet: `10.10.20.0/24` - Firewall: - Public ingress: sadece `22/tcp`, `80/tcp`, `443/tcp` - Private ingress: `07-private-network-port-matrisi.md` dosyasindaki test kurallari - SSH key - Placement group: `test-spread` - Server: - `test-swarm-01` - `test-db-01` - Ansible inventory output Terraform DB yazilimini kurmaz. DB node sadece makine, network ve firewall seviyesinde hazirlanir. ## Onerilen Dosya Yapisi ```text terraform/ hetzner/ test/ versions.tf providers.tf variables.tf locals.tf network.tf firewall.tf placement.tf servers.tf outputs.tf terraform.tfvars.example ``` `terraform.tfvars` commit edilmeyecek. `.gitignore` icinde ignore edilmelidir. ## Degiskenler Minimum degiskenler: ```hcl hcloud_token = "secret" environment = "test" location = "fsn1" image = "ubuntu-24.04" server_type_swarm = "cx32" server_type_db = "cx42" admin_ssh_public_key_path = "~/.ssh/id_ed25519.pub" admin_allowed_cidrs = ["X.X.X.X/32"] ``` `location` icin tek lokasyonla baslanir. Farkli region/lokasyon felaket kurtarma bu asamada konu disidir; ileride dokumana eklenmelidir. ## Server Rolleri | Server | Private IP | Rol | | --- | --- | --- | | `test-swarm-01` | `10.10.10.11` | Swarm manager + app worker + Gitea runner | | `test-db-01` | `10.10.20.11` | Manuel DB kurulumu icin hazir DB node | Private IP'ler Terraform icinde sabit tanimlanmalidir. Ansible inventory ve firewall kurallari deterministik kalir. ## Firewall Kurallari Public ingress: | Port | Kaynak | Hedef | | --- | --- | --- | | `22/tcp` | `admin_allowed_cidrs` | Tum test node'lari | | `80/tcp` | `0.0.0.0/0`, `::/0` | `test-swarm-01` | | `443/tcp` | `0.0.0.0/0`, `::/0` | `test-swarm-01` | Public ingress icin `8200/tcp`, `5432/tcp`, `27017/tcp`, `5672/tcp`, `15672/tcp`, `6379/tcp`, `2379/tcp`, `9180/tcp`, `9090/tcp`, `3000/tcp` acilmayacak. Private ingress icin `07-private-network-port-matrisi.md` kaynak alinacak. ## Placement Group `test-spread` placement group `type = "spread"` olacak. Testte iki server oldugu icin bu grup `test-swarm-01` ve `test-db-01` makinelerinin farkli fiziksel host'lara dagitilmasini hedefler. Not: Spread placement group farkli kabinet veya lokasyon garantisi degildir; tek fiziksel host arizasinin etkisini azaltir. ## Terraform Cikti Beklentisi `outputs.tf` minimum su bilgileri uretmelidir: ```hcl output "ansible_inventory_yaml" { sensitive = false } output "test_private_ips" { sensitive = false } output "test_public_ips" { sensitive = false } ``` Inventory output'u daha sonra `ansible/inventory/generated/test.yml` dosyasina yazilabilir. Inventory dosyasinda secret bulunmayacaksa commit edilebilir; secret veya token icerirse commit edilmeyecek. ## Kabul Kriterleri - `terraform plan` sadece test Hetzner Project token'i ile calisir. - `terraform apply` sonrasinda 2 server olusur. - Iki server private network uzerinden birbirine erisebilir. - Public internetten sadece `22`, `80`, `443` firewall seviyesinde aciktir. - Vault `8200` public'ten kapali kalir. - Terraform state repo'ya commit edilmez.