Terraform, cloud altyapınızı (sunucu, network, DB, DNS, firewall) kod olarak tanımlayıp versioning, review ve reproducibility sunar. Tıklayarak kurulan altyapı prod'da hata ile biter; Terraform'la aynı cluster'ı 10 farklı bölgede saniyelerde kurabilirsiniz.

Temel Yapı

İlgili rehberler: DNS nedir, ayarları değiştirme · Domain adı ve WHOIS sorgulama · Hosting türleri rehberi · Nginx yapılandırma · Plesk panel yönetimi

hcl
# main.tf
terraform {
  required_version = ">= 1.6"
  required_providers {
    hcloud = {
      source  = "hetznercloud/hcloud"
      version = "~> 1.45"
    }
  }
  backend "s3" {
    bucket = "my-tf-state"
    key    = "prod/terraform.tfstate"
    region = "eu-central-1"
  }
}

provider "hcloud" {
  token = var.hcloud_token
}

Temel Komutlar

bash
terraform init       # provider indir, backend kur
terraform fmt -recursive
terraform validate
terraform plan       # NE değişecek? — uygulamadan önce oku
terraform apply      # uygula (tekrar plan gösterir, evet ister)
terraform destroy    # her şeyi sil (dikkat!)

terraform state list
terraform state show hcloud_server.web
terraform output

Variables

hcl
# variables.tf
variable "hcloud_token" {
  type      = string
  sensitive = true
}

variable "server_count" {
  type    = number
  default = 2
  validation {
    condition     = var.server_count > 0 && var.server_count <= 10
    error_message = "1-10 arası olmalı."
  }
}

variable "region" {
  type    = string
  default = "nbg1"
}

# terraform.tfvars
hcloud_token = "your-token"
server_count = 3

Hetzner Örneği: Web + DB

hcl
resource "hcloud_ssh_key" "admin" {
  name       = "admin"
  public_key = file("~/.ssh/id_ed25519.pub")
}

resource "hcloud_network" "internal" {
  name     = "internal"
  ip_range = "10.0.0.0/16"
}

resource "hcloud_network_subnet" "main" {
  network_id   = hcloud_network.internal.id
  type         = "cloud"
  network_zone = "eu-central"
  ip_range     = "10.0.1.0/24"
}

resource "hcloud_server" "web" {
  count       = var.server_count
  name        = "web-${count.index + 1}"
  image       = "ubuntu-24.04"
  server_type = "cx22"
  location    = var.region
  ssh_keys    = [hcloud_ssh_key.admin.id]

  network {
    network_id = hcloud_network.internal.id
    ip         = "10.0.1.${10 + count.index}"
  }

  user_data = file("cloud-init.yaml")
}

resource "hcloud_load_balancer" "web_lb" {
  name               = "web-lb"
  load_balancer_type = "lb11"
  location           = var.region
}

Modules

Tekrar eden altyapıyı modül'e çıkarın — bir kere yazın, farklı env'lerde yeniden kullanın.

hcl
# modules/webapp/main.tf
variable "name" {}
variable "count" { default = 1 }

resource "hcloud_server" "this" {
  count       = var.count
  name        = "${var.name}-${count.index + 1}"
  image       = "ubuntu-24.04"
  server_type = "cx22"
}

output "ips" {
  value = hcloud_server.this[*].ipv4_address
}

# main.tf
module "frontend" {
  source = "./modules/webapp"
  name   = "frontend"
  count  = 3
}

module "backend" {
  source = "./modules/webapp"
  name   = "backend"
  count  = 2
}

State Yönetimi

Terraform, altyapının mevcut durumunu terraform.tfstate'te tutar. Ekip çalışırken remote state zorunludur — aksi halde aynı anda iki kişi apply yaparsa state bozulur.

hcl
# S3 + DynamoDB lock
terraform {
  backend "s3" {
    bucket         = "my-tf-state"
    key            = "prod/terraform.tfstate"
    region         = "eu-central-1"
    dynamodb_table = "tf-state-locks"  # state lock
    encrypt        = true
  }
}

# Alternatif: Terraform Cloud (HashiCorp), GCS, Azure Blob

Workspaces

bash
terraform workspace new staging
terraform workspace new production
terraform workspace select production
terraform workspace list

# Workspace-specific tfvars
terraform apply -var-file="prod.tfvars"

Drift Detection

bash
# Someone changed infra manually?
terraform plan -detailed-exitcode
# exit 0: değişiklik yok
# exit 2: plan değişiklik içeriyor
# CI'da düzenli çalıştır → alert

Import Mevcut Kaynak

bash
# UI'da elle oluşturulmuş kaynak var, Terraform'a al:
terraform import hcloud_server.web 12345678

# Terraform 1.5+ — import blocks
import {
  to = hcloud_server.web
  id = "12345678"
}

Terraform + CI/CD

yaml
# .github/workflows/terraform.yml
name: Terraform
on:
  pull_request:
    paths: ['terraform/**']
jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3
      - run: terraform init
        working-directory: terraform
      - run: terraform fmt -check -recursive
      - run: terraform validate
      - run: terraform plan -out=plan.bin
        env:
          TF_VAR_hcloud_token: ${{ secrets.HCLOUD_TOKEN }}

Modern Web Hosting ve Sunucu Altyapısı

Performanslı bir web hosting hizmeti üç temel altyapı kararına dayanır: NVMe SSD diskler (klasik SATA SSD'ye göre 4-6 kat IOPS), LiteSpeed Web Server veya Nginx + LSCache kombinasyonu (Apache'ye göre 9 kat istek kapasitesi) ve CloudLinux + Imunify360 izolasyonu. Hosting sağlayıcısının kontrol paneli (cPanel, Plesk, DirectAdmin), günlük yedek politikası, veri merkezi konumu ve destek ekibi yanıt süresi de büyük fark yaratır. Türkiye lokasyonu yerli ziyaretçilere düşük gecikme verirken; Hetzner Frankfurt veya OVH Roubaix gibi Avrupa lokasyonları global trafik için daha uygundur. Site büyüdükçe paylaşımlı hosting'ten VPS, ardından dedicated server'a geçiş; CPU/RAM/disk kaynaklarının web sitemizin ihtiyaçlarına göre ölçeklenmesini sağlar.