# 04 - Prod Terraform IaC Bu asamanin amaci prod Hetzner Cloud Project icinde HA odakli IaaS kaynaklarini Terraform ile olusturmaktir. Bu dokuman prod Terraform ajanina tek basina verilebilir. ## Kapsam Terraform prod ortaminda sunlari olusturur: - Private network: `iklim-prod-net` - Subnetler: - App/Swarm subnet: `10.20.10.0/24` - DB subnet: `10.20.20.0/24` - Firewall: - Public ingress: sadece `22/tcp`, `80/tcp`, `443/tcp` - Private ingress: `07-private-network-port-matrisi.md` dosyasindaki prod kurallari - SSH key - Placement groups: - `prod-swarm-spread` - `prod-db-spread` - Servers: - `prod-swarm-01` - `prod-swarm-02` - `prod-swarm-03` - `prod-db-01` - `prod-db-02` - `prod-db-03` - Ansible inventory output DB cluster yazilimi Terraform ile kurulmayacak. DB node'lari sadece makine, network ve firewall seviyesinde hazirlanacak. ## Onerilen Dosya Yapisi ```text terraform/ hetzner/ prod/ versions.tf providers.tf variables.tf locals.tf network.tf firewall.tf placement.tf servers.tf outputs.tf terraform.tfvars.example ``` `terraform.tfvars`, state dosyalari ve token repo'ya commit edilmeyecek. ## Degiskenler Minimum degiskenler: ```hcl hcloud_token = "secret" environment = "prod" location = "fsn1" image = "ubuntu-24.04" server_type_swarm = "cx42" server_type_db = "cx52" admin_ssh_public_key_path = "~/.ssh/id_ed25519.pub" admin_allowed_cidrs = ["X.X.X.X/32"] ``` Server type degerleri kapasiteye gore degisebilir. Bu dokuman topoloji ve guvenlik kararini tanimlar; sizing daha sonra revize edilebilir. ## Server Rolleri ve Private IP PlanI | Server | Private IP | Rol | | --- | --- | --- | | `prod-swarm-01` | `10.20.10.11` | Swarm manager + app worker + runner | | `prod-swarm-02` | `10.20.10.12` | Swarm manager + app worker + runner | | `prod-swarm-03` | `10.20.10.13` | Swarm manager + app worker + runner | | `prod-db-01` | `10.20.20.11` | Manuel DB cluster node | | `prod-db-02` | `10.20.20.12` | Manuel DB cluster node | | `prod-db-03` | `10.20.20.13` | Manuel DB cluster node | Private IP'ler sabit tanimlanmalidir. ## Placement Group Karari Prod icin iki ayri spread placement group: ```text prod-swarm-spread: prod-swarm-01/02/03 prod-db-spread: prod-db-01/02/03 ``` Bu sayede Swarm quorum node'lari kendi aralarinda farkli fiziksel host'lara, DB node'lari da kendi aralarinda farkli fiziksel host'lara yerlestirilmeye calisilir. Notlar: - Hetzner kabinet secimi dogrudan sunmaz. - Spread placement group farkli fiziksel host hedefler. - Farkli lokasyon/region felaket kurtarma bu asamada konu disidir. - Ileride scale buyudugunde multi-location DR ayri tasarlanmalidir. ## Public Firewall Public ingress: | Port | Kaynak | Hedef | | --- | --- | --- | | `22/tcp` | `admin_allowed_cidrs` | Tum prod node'lari | | `80/tcp` | `0.0.0.0/0`, `::/0` | Prod gateway entrypoint | | `443/tcp` | `0.0.0.0/0`, `::/0` | Prod gateway entrypoint | Prod'da su portlar public acilmayacak: - `8200/tcp` Vault - `5432/tcp` PostgreSQL - `27017/tcp` MongoDB - `6379/tcp` Redis - `5672/tcp`, `15672/tcp`, `61613/tcp`, `15674/tcp` RabbitMQ - `2377/tcp`, `7946/tcp`, `7946/udp`, `4789/udp` Docker Swarm - `9180/tcp` APISIX Admin API - `9090/tcp` Prometheus - `3000/tcp` Grafana Bu servisler gerekiyorsa private network, VPN, bastion veya admin CIDR ile sinirlandirilmis ek kural uzerinden erisilebilir. Varsayilan public politika kapali kalir. ## Kabul Kriterleri - `terraform plan` sadece prod Hetzner Project token'i ile calisir. - 6 server olusur. - Swarm node'lari `prod-swarm-spread` placement group icindedir. - DB node'lari `prod-db-spread` placement group icindedir. - Public firewall sadece `22`, `80`, `443` ingress'e izin verir. - Private firewall `07-private-network-port-matrisi.md` ile uyumludur. - Terraform state ve secret tfvars commit edilmez.