# Terraform ile Gyro Bulut sunucusu: sağlayıcı kurulumu ve ilk apply

https://www.gyrohosting.com/bilgi-bankasi/makale/terraform-ile-gyro-bulut

- **Bu rehberde ne öğreneceksiniz**: Gyro Terraform sağlayıcısını kurmayı, API anahtarını güvenle vermeyi, bir SSH anahtarı ve bir bulut sunucuyu kodla tanımlamayı, `plan` ve `apply` ile oluşturmayı, panelden açtığınız sunucuyu Terraform'a almayı ve `destroy`'un ne yaptığını.
- **Süre**: 15 dakika (sunucunun hazırlanması genellikle 1-2 dakika)
- **Kimin için**: Altyapısını kodla tanımlamak ve sürüm kontrolünde tutmak isteyen geliştiriciler ve DevOps ekipleri.
- **Gerekenler**: Terraform 1.x, Gyro API anahtarı (`cloud_read`, `cloud_write`, `cloud_order`, `cloud_delete` izinleriyle), hesapta sipariş tutarını karşılayacak bakiye, bir SSH açık anahtarı.

## 1. Sağlayıcı hakkında

Gyro'nun resmi Terraform sağlayıcısı Terraform Registry'de **gyro-hosting/gyro** adıyla yayındadır (bu rehber yazılırken sürüm 0.2.1). Gyro Public API'yi kullanır; panelde yaptığınız işleri kodla tanımlamanızı sağlar.

| Tür | Adlar |
| --- | --- |
| Kaynaklar (resource) | `gyro_server`, `gyro_ssh_key`, `gyro_domain_record`, `gyro_mail_mailbox`, `gyro_mail_alias`, `gyro_storage_bucket`, `gyro_storage_key`, `gyro_app_install`, `gyro_webhook`, `gyro_api_key`, `gyro_reseller_customer` |
| Veri kaynakları (data source) | `gyro_products`, `gyro_locations`, `gyro_images`, `gyro_services` |

Bu rehber bulut sunucu üzerinden temel akışı anlatır; diğer kaynakların belgeleri [Registry sayfasında](https://registry.terraform.io/providers/gyro-hosting/gyro/latest/docs).

> **Dikkat**
> 
> `gyro_server` oluşturmak gerçek bir sipariştir ve **hesap bakiyenizden** ödenir. Bu yüzden kaynakta `confirm_order = true` yazmak zorunludur; yazmazsanız Terraform sunucu oluşturmaz.

## 2. API anahtarını hazırlama

1. Müşteri panelinde hesap menüsünden **API Kimlik Bilgileri**'ni açın ve Terraform için **ayrı** bir anahtar oluşturun ([Gyro API'ye ilk adım](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-api-ilk-adim)).
2. İzinler: `cloud_read`, `cloud_write`, `cloud_order` (sunucu açmak için), `cloud_delete` (sunucu silmek için).
3. Anahtarı ortam değişkenine koyun; `.tf` dosyasına yazmayın: bash`read -rs GYRO_TOKEN && export GYRO_TOKEN`

Sağlayıcı anahtarı `GYRO_TOKEN` değişkeninden okur. CI'da (GitHub Actions, GitLab CI) aynı adı taşıyan bir gizli değişken tanımlayın.

## 3. Yapılandırma dosyası

Boş bir klasörde `main.tf` oluşturun:

```
terraform {
  required_providers {
    gyro = {
      source  = "gyro-hosting/gyro"
      version = "~> 0.3"
    }
  }
}

# Anahtarı GYRO_TOKEN ortam değişkeninden okur.
provider "gyro" {}

resource "gyro_ssh_key" "laptop" {
  name       = "laptop"
  public_key = file("~/.ssh/id_ed25519.pub")
}

resource "gyro_server" "web" {
  plan          = "standart-2-4"     # Gyro Bulut Standart 2 vCPU / 4 GB
  region        = "eu-de-1"          # Almanya (Falkenstein)
  cycle         = "monthly"
  image         = "ubuntu-24.04"
  hostname      = "web-1.ornekfirma.com"
  ssh_key_ids   = [tonumber(gyro_ssh_key.laptop.id)]
  power_state   = "running"
  confirm_order = true               # sunucu oluşturmak bakiyeden ödenen bir siparişdir
}

output "web_ipv4" {
  value = gyro_server.web.ipv4
}
```

### Hangi `plan` ve `region`?

`plan` paketi (ör. `standart-2-4`), `region` lokasyonu belirler. Bölgeler: `eu-de-1` Falkenstein, `eu-de-2` Nürnberg, `eu-fi-1` Helsinki, `us-east-1` Ashburn, `us-west-1` Hillsboro, `ap-sg-1` Singapur. İsterseniz plan+region yerine tek bir ürün numarası da verebilirsiniz (`product_id`; sitede paketin **Başlayın** düğmesinin açtığı sipariş adresindeki sayı, ör. `…/siparis/server/814`).

Sürüm 0.2 kullanıyorsanız: 0.3'e geçmek mevcut sunucuları yeniden oluşturmaz. Eski `server_type`/`location` alanları çalışır ama uyarı verir; yeni yapılandırmalarda `plan`/`region` kullanın.

Tüm satıştaki paketleri Terraform'dan da listeleyebilirsiniz. Şu bloğu ekleyip `terraform plan` çalıştırın:

```
data "gyro_locations" "tum" {}

data "gyro_products" "tum" {
  available_only = true
}

locals {
  sehir = { for l in data.gyro_locations.tum.locations : l.region => l.city }
}

output "paketler" {
  value = [for p in data.gyro_products.tum.products :
    "${p.plan}  ${p.region}  ${local.sehir[p.region]}  ${p.monthly_price} ${p.currency}"]
}
```

Çıktı her paketi plan adı, bölgesi, şehri ve aylık fiyatıyla verir; istediğinizi `plan` ve `region`'a yazın.

### `gyro_server` alanları

| Alan | Zorunlu | Açıklama |
| --- | --- | --- |
| `plan` + `region` | evet* | Paket ve lokasyon (*ya da tek başına `product_id`) |
| `image` | evet | İşletim sistemi, ör. `ubuntu-24.04`, `debian-12`; liste için `gyro_images` |
| `confirm_order` | evet | `true` olmalı |
| `cycle` | hayır | `monthly` (varsayılan), `quarterly`, `semiannually`, `annually` |
| `hostname` | hayır | Sunucu adı (tam alan adı biçiminde) |
| `ssh_key_ids` | hayır | `gyro_ssh_key` kimlikleri (şu an oluştururken en çok 1) |
| `user_data` | hayır | cloud-init betiği (en çok 32 KB) |
| `power_state` | hayır | `running` ya da `stopped` |
| `auto_renew` | hayır | Hizmeti otomatik yenileme |
| `delete_immediately` | hayır | `terraform destroy` davranışı (Bölüm 6) |

Okunabilen alanlar: `id` (paneldeki hizmet numarası), `ipv4`, `ipv6_network`, `cores`, `memory_gb`, `disk_gb`, `status`, `price`, `currency`, `due_date`.

## 4. plan ve apply

```
terraform init      # sağlayıcıyı indirir
terraform plan      # ne yapılacağını gösterir, hiçbir şey oluşturmaz
terraform apply     # onayınızdan sonra siparişi verir ve sunucu hazır olana kadar bekler
```

`apply` sırasında Terraform sunucunun durumunu belirli aralıklarla sorgular; sunucu çalışır hale gelince IP adresini çıktı olarak verir:

```
Outputs:
web_ipv4 = "203.0.113.10"
```

Ardından `ssh root@203.0.113.10` ile bağlanabilirsiniz. Sunucu müşteri panelinde de **Hizmetlerim** altında görünür.

> **Bilgi**
> 
> Bekleme süresini sağlayıcı ayarlarıyla değiştirebilirsiniz: `poll_interval_seconds` (varsayılan 5) ve `poll_timeout_minutes` (varsayılan 15).

### Değişiklik yapmak

- `hostname`, `power_state` ve `auto_renew` değişikliği sunucuyu silmeden, yerinde uygulanır.
- `plan`, `region` (ya da `product_id`), `image`, `cycle`, `ssh_key_ids` ya da `user_data` değişikliği sunucuyu **silip yeniden oluşturur**; bu, yeni bir sipariş ve eski sunucudaki verinin kaybı demektir. `plan` çıktısında `must be replaced` görürseniz durun ve kontrol edin.
- Paketi verinizi koruyarak büyütmek için `plan`'ı değiştirmeyin; panelden **Yükseltme/Düşürme** sekmesini kullanın, ardından `.tf` dosyasındaki `plan`'ı yeni paketle güncelleyin.

## 5. Panelden açtığınız sunucuyu Terraform'a almak

Var olan bir sunucuyu yeniden oluşturmadan Terraform yönetimine alabilirsiniz:

1. `main.tf` içine sunucuyu tanımlayan bir `gyro_server` bloğu yazın (`plan`, `region`, `image` mevcut sunucuyla aynı olmalı).
2. Paneldeki hizmet numarasıyla içe aktarın: bash`terraform import gyro_server.web 47466`
3. `terraform plan` çalıştırın; değişiklik görünmüyorsa tanım ve sunucu eşleşmiştir.

SSH anahtarları da aynı yolla alınır: `terraform import gyro_ssh_key.laptop <anahtar-no>`.

## 6. destroy ne yapar?

> **Dikkat**
> 
> Varsayılan olarak `terraform destroy` sunucuyu **hemen iptal eder**: faturalama durur, sunucu kapatılır ve bekleme süresi (3 gün) sonunda tüm verisiyle kalıcı olarak silinir.

Hemen iptal yerine bir iptal talebi açılmasını istiyorsanız kaynağa `delete_immediately = false` ekleyin; bu durumda talep işlenene kadar sunucu çalışmaya ve faturalanmaya devam eder.

Üretim sunucularını yanlışlıkla silmemek için Terraform'un kendi korumasını kullanın:

```
resource "gyro_server" "db" {
  # ...
  lifecycle {
    prevent_destroy = true
  }
}
```

## 7. Sorun giderme

| Belirti | Olası neden | Çözüm |
| --- | --- | --- |
| `Missing API key` / `missing_token` | `GYRO_TOKEN` tanımlı değil | `export GYRO_TOKEN=…` (ya da CI gizli değişkeni) |
| `insufficient_scope` | Anahtarda `cloud_order` ya da `cloud_delete` yok | Anahtarı düzenleyip izni ekleyin |
| `insufficient_balance` | Bakiye sipariş tutarını karşılamıyor | Bakiye yükleyin, `apply`'ı tekrarlayın |
| `confirm_required` | `confirm_order = true` yazılmamış | Kaynağa ekleyin |
| `product_not_orderable` | Paket o an satışta değil ya da numara yanlış | `gyro_products` çıktısından güncel bir numara seçin |
| `server_locked` | Sunucuda süren bir işlem var | Birkaç dakika bekleyip tekrar `apply` |
| `ip_not_allowed` | Anahtar IP ile kısıtlı, CI başka IP'den bağlanıyor | CI'ın çıkış IP'sini anahtarın izinli listesine ekleyin |
| `ssh_key_exists` (409) | Aynı açık anahtar hesabınızda zaten kayıtlı | Kayıtlı anahtarı `terraform import gyro_ssh_key.<ad> <anahtar-no>` ile alın; aynı `gyro_ssh_key` kimliğini birden fazla sunucuda kullanabilirsiniz |

## 8. Sık sorulan sorular

**Terraform state dosyamda gizli bilgi olur mu?**

`user_data` gibi alanlar hassas olarak işaretlidir ve ekranda gösterilmez, ancak state dosyasına yazılır. State'i herkese açık bir depoda tutmayın; uzak ve şifreli bir arka uç (backend) kullanın.

**Sunucu oluşturma ne kadar sürer?**

Sipariş ve ödeme saniyeler içinde, kurulum genellikle 1-2 dakika sürer. `apply` sunucu çalışır hale gelene kadar bekler.

**Aynı yapılandırmayla birden çok sunucu açabilir miyim?**

Evet, `count` ya da `for_each` ile. Her sunucu ayrı bir siparişdir ve bakiyenizden ödenir; önce `plan` ile kaç kaynak oluşacağını kontrol edin.

**Türkiye VDS sunucularını Terraform ile açabilir miyim?**

Bu sürümde `gyro_server` Gyro Bulut sunucuları içindir. Diğer hizmetlerinizi `gyro_services` veri kaynağıyla okuyabilirsiniz.

**Sağlayıcı kaynak kodu nerede?**

Açık kaynaklıdır (MPL-2.0): [github.com/Gyro-Hosting/terraform-provider-gyro](https://github.com/Gyro-Hosting/terraform-provider-gyro). Hata ve öneri bildirimi için depodaki "Issues" bölümünü kullanabilirsiniz.

> **Biliyor muydunuz?**
> 
> Tek seferlik işler için Terraform yerine `gyro` CLI daha hızlıdır: `gyro server list`, `gyro server snapshot create <no>`. Kurulum için [gyro CLI kurulumu ve ilk komutlar](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-cli-kurulum).

## Sıradaki adım

- **Sunucunuz hazır:** [Bulut panel turu](https://www.gyrohosting.com/bilgi-bankasi/makale/bulut-panel-turu) ile panelde neler yapabileceğinizi görün.
- Paketler ve fiyatlar: [Gyro Bulut Sunucu](https://www.gyrohosting.com/bulut-sunucu)
