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

# 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

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

# 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

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.

# 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.

# 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
Uyarı
terraform.tfstate içinde düz metin olarak secret''lar bulunabilir. Asla Git''e commit etmeyin, backend''i şifreli tutun.

Workspaces

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

# 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

# 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

# .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.

Terraform ile IaC kurulumu

AWS, Hetzner, Azure için Terraform altyapı tasarımı ve migration için iletişime geçin

WhatsApp