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
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.
AWS, Hetzner, Azure için Terraform altyapı tasarımı ve migration için iletişime geçin