Environment_Infrastructure/setup/04-prod-terraform-iaac.md
2026-05-09 16:26:06 +03:00

3.8 KiB

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

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:

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:

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.