# Gyro Kapsayıcı'yı API, gyro CLI ve Terraform ile yönetin

https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-api-cli-terraform

- **Bu rehberde ne öğreneceksiniz**: Panelde yaptığınız her kapsayıcı işleminin API, `gyro container` komutları ve Terraform karşılığını; servis oluşturma, yayınlama, ölçekleme, geri alma, alan adı, gizli değer ve imaj deposu için örnekleri.
- **Süre**: 12 dakika
- **Kimin için**: Dağıtımı otomatikleştiren geliştiriciler.
- **Gerekenler**: API anahtarı ([Gyro API ile ilk adım](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-api-ilk-adim)); `gyro` 1.10 ya da üstü ([kurulum](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-cli-kurulum)); Terraform için sağlayıcı 0.9 ya da üstü ([Terraform rehberi](https://www.gyrohosting.com/bilgi-bankasi/makale/terraform-ile-gyro-bulut)).

## 1. Önce: kimlik ve ortam numarası

API anahtarı oluştururken izinleri işaretleyin: **hizmet okuma** (`services_read`) ve **hizmet yazma** (`services_write`); harcama bilgisi için **faturalama okuma** (`billing_read`). Güvenlik için anahtarı yalnız CI sunucunuzun IP'sine kısıtlayın.

Komutlardaki `{id}` / `12345`, **kapsayıcı ortamınızın hizmet numarasıdır**. Bulmak için:

```
gyro configure                  # bir kez: anahtarı kaydeder
gyro service list               # tüm hizmetleriniz; kapsayıcı ortamının numarasını bulun
```

## 2. Komut özeti

| İşlem | Komut |
| --- | --- |
| Servisleri listele / ayrıntı | `gyro container service list ID` · `gyro container service get ID AD` |
| Servis oluştur | `gyro container service create ID --name AD --image İMAJ --port 8080 --public` |
| Yeni sürüm yayınla | `gyro container service update ID AD --image İMAJ --reason "not"` |
| Ölçekle | `gyro container service scale ID AD --replicas N` |
| Yeniden başlat | `gyro container service restart ID AD` |
| Sürümler / geri al | `gyro container service revisions ID AD` · `gyro container service rollback ID AD [--revision N]` |
| Servis sil | `gyro container service delete ID AD` |
| Ortam değişkenleri | `gyro container env set ID AD --data '{"set":{"K":"V"}}'` · `--unset K` · `--replace 1` |
| Gizli değerler | `gyro container secret set ID AD --data @-` · `gyro container secret delete ID AD --keys K` |
| Alan adı | `gyro container domain add\|list\|verify\|remove` |
| Loglar / grafik / olaylar | `gyro container logs ID AD` · `gyro container metrics ID AD` · `gyro container events ID` |
| Düğüm havuzu | `gyro container nodes ID` |
| Gyro imaj deposu | `gyro container registry get\|images\|credentials\|rotate\|policy\|image-delete ID` |
| Özel dış depo | `gyro container external-registry set\|delete ID` |

Yıkıcı işlemler (silme, geri alma, parola yenileme) onay ister; betiklerde `--yes` kullanın. Çıktı için `-o json`, tek alan için `--query` kullanabilirsiniz.

## 3. gyro CLI örnekleri

```
# Servis oluştur
gyro container service create 12345 --name api \
  --image registry.ist.gyrohosting.com/<kodunuz>/api:1.0 --port 8080 \
  --replicas 2 --cpu-m 250 --memory-mi 256 --health-path /healthz --public

# Gizli değer (stdin ile, komut geçmişine yazılmaz)
echo '{"set":{"DB_PASSWORD":"çok-gizli"}}' | gyro container secret set 12345 api --data @-

# Yeni sürüm, sonra geri alma
gyro container service update 12345 api --image registry.ist.gyrohosting.com/<kodunuz>/api:1.1 --reason "release 1.1"
gyro container service rollback 12345 api --yes

# Alan adı bağla
gyro container domain add 12345 api --domain api.ornekfirma.com
gyro container domain verify 12345 api

# Loglar ve harcama
gyro container logs 12345 api --since-minutes 30
gyro billing balance get
```

## 4. REST API örnekleri

Taban adres `https://www.gyrohosting.com/api/v1/client`; kimlik `Authorization: Bearer $GYRO_TOKEN`.

```
B=https://www.gyrohosting.com/api/v1/client
H=(-H "Authorization: Bearer $GYRO_TOKEN" -H "Content-Type: application/json")

# Servisleri listele
curl -s "$B/cloud/containers/12345/services" "${H[@]}"

# Servis oluştur
curl -s -X POST "$B/cloud/containers/12345/services" "${H[@]}" -d '{
  "name":"api","image":"registry.ist.gyrohosting.com/<kodunuz>/api:1.0","port":8080,
  "replicas":2,"cpu_m":250,"memory_mi":256,"health_path":"/healthz","public":true}'

# Yeni sürüm
curl -s -X PATCH "$B/cloud/containers/12345/services/api" "${H[@]}" \
  -d '{"image":"registry.ist.gyrohosting.com/<kodunuz>/api:1.1","reason":"release 1.1"}'

# Ölçekle
curl -s -X POST "$B/cloud/containers/12345/services/api/scale" "${H[@]}" -d '{"replicas":3}'

# Geri al (onay ister)
curl -s -X POST "$B/cloud/containers/12345/services/api/rollback" "${H[@]}" -d '{"confirm":true}'

# Gizli değer
curl -s -X PUT "$B/cloud/containers/12345/services/api/secrets" "${H[@]}" -d '{"set":{"DB_PASSWORD":"çok-gizli"}}'
```

Tüm uçlar `/developers` sayfasındaki API başvurusundadır (`/cloud/containers/{id}/…`: `services`, `env`, `secrets`, `domains`, `logs`, `metrics`, `nodes`, `events`, `registry`, `external-registry`).

## 5. Terraform ile

```
variable "db_password" {
  type      = string
  sensitive = true
}

resource "gyro_container_service" "web" {
  service_id  = 12345                  # kapsayıcı ortamınızın hizmet numarası
  name        = "web"
  image       = "registry.ist.gyrohosting.com/<kodunuz>/web:1.4"
  port        = 8080
  replicas    = 2
  cpu_m       = 500
  memory_mi   = 512
  public      = true
  health_path = "/healthz"

  env     = { MODE = "prod" }
  secrets = { DB_PASSWORD = var.db_password }   # yalnız yazılır, geri okunmaz

  # Önce alan adınızdan gyro_container_service.web.host adresine CNAME yazın.
  domains = ["app.ornekfirma.com"]
}

output "web_url" {
  value = gyro_container_service.web.url
}
```

- Her değişiklik (kopya sayısı hariç) yeni sürüm oluşturur ve kesintisiz yayınlanır.
- Gizli değerler yalnız yazılır; dışarıdan silinirse sonraki planda fark görünür.
- İçe aktarma: `terraform import gyro_container_service.web 12345/web`. (İçe aktarmadan sonra ilk planda gizli değerler için bir fark görünmesi beklenir.)

## 6. Otomasyon ipuçları

- CI/CD için **ayrı bir API anahtarı** ve ayrı bir **imaj deposu parolası** kullanın; ikisini de gizli değişken olarak saklayın.
- Yayında imajı **sürüm etiketi ya da commit numarasıyla** verin (`latest` değil); `--reason` ile sürüm geçmişine commit numarasını yazın.
- Tam örnek: [GitHub Actions ile otomatik deploy](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-github-actions).

## 7. Sık sorulan sorular

**Ortam numarasını nereden bulurum?**

Müşteri panelinde hizmetin sayfa adresindeki numaradır ya da `gyro service list` çıktısında kapsayıcı ortamının numarasıdır.

**quota_exceeded hatası alıyorum, ne yapmalıyım?**

Havuz kapasitenizi aşıyorsunuz: kopya sayısını ya da boyutu azaltın, ya da üst pakete geçin.

**Sürüm yayını bitti mi nasıl anlarım?**

`gyro container service get ID AD` çıktısındaki durum `running` ve hazır kopya sayısı istenen sayıya eşit olunca bitmiştir.

**Terraform her planda fark gösteriyor, ne yapmalıyım?**

Çoğunlukla gizli değerler ya da dışarıdan yapılan değişikliklerdir; panelden değiştirdiğiniz alanları Terraform dosyasına da yansıtın.

## Sıradaki adım

- [GitHub Actions ile otomatik deploy](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-github-actions)
- [Harcamalar ekranı](https://www.gyrohosting.com/bilgi-bankasi/makale/harcamalar-ekrani-saat-saat-dokum)
