docs: add getting-started guide with terraform init/plan/apply/destroy workflow

This commit is contained in:
“Naeel”
2026-07-17 10:35:37 +04:00
parent 5dbb2acda4
commit cf8cccc199
+291
View File
@@ -0,0 +1,291 @@
# Начало работы с Nubes Terraform (TEST)
Это руководство поможет вам установить Terraform и развернуть первую инфраструктуру в облаке Nubes (тестовый стенд).
## 0. Установка Terraform
Версия 1.0 или выше.
1. **Скачать**: [hashicorp.com/terraform/install](https://developer.hashicorp.com/terraform/install) или [Yandex Cloud Mirror](https://hashicorp-releases.yandexcloud.net/terraform/) (без VPN)
2. **Установить**: распаковать, положить `terraform` в `PATH`
3. **Проверить**: `terraform -version`
---
## 1. Конфигурация провайдера
Создайте `main.tf`:
```hcl
terraform {
required_providers {
nubes = {
source = "registry.kube5s.ru/nubes-test/nubes"
version = "5.1.2"
}
}
}
provider "nubes" {
api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
api_token = var.api_token
}
variable "api_token" {
type = string
sensitive = true
}
```
!!! info "TEST стенд"
- Личный кабинет: [https://deck-test.ngcloud.ru/dashboard/](https://deck-test.ngcloud.ru/dashboard/)
- API: `https://lk-api-gateway-test.ngcloud.ru/api/v1/svc`
!!! tip "Безопасность"
Не храните токен в `main.tf`. Используйте `terraform.tfvars` или переменные окружения.
---
## 2. Получение API токена
1. Зайдите в Личный кабинет → Профиль → Токены
2. Нажмите «Выпустить тех-токен»
3. **Сохраните токен** — он показывается только один раз
Создайте `terraform.tfvars`:
```hcl
api_token = "eyJhbGciOi..." # Ваш токен
```
---
## 3. Команды Terraform
### `terraform init`
Загружает провайдер. Выполняется **один раз** при старте проекта. При смене версии — `terraform init -upgrade`.
```bash
terraform init
```
### `terraform plan`
Показывает что будет создано/изменено/удалено. Безопасно, ничего не меняет.
```bash
terraform plan
```
### `terraform apply`
Применяет изменения. Создаёт/меняет/удаляет ресурсы в облаке.
```bash
terraform apply
# или сразу без подтверждения:
terraform apply -auto-approve
```
### `terraform destroy`
Удаляет ВСЕ ресурсы из манифеста.
```bash
terraform destroy
```
!!! warning "Suspend vs Destroy"
По умолчанию `terraform destroy` **не удаляет** инстанс — переводит в `Suspend`. См. раздел 5.
### `terraform state list` / `terraform state show`
Просмотр ресурсов под управлением Terraform.
```bash
terraform state list
terraform state show nubes_postgres.baza
```
---
## 4. Примеры ресурсов
### PostgreSQL
Скопируйте из [примера PostgreSQL](postgres_example.md) — заполните `TODO` своими значениями.
```hcl
resource "nubes_postgres" "baza" {
resource_name = "pg-tst01"
cluster_configuration {
cpu = 500
memory = 512
replicas = 1
disk = 10
}
startup_configuration {
resource_realm = "k8s-3-sandbox-nubes-ru"
}
access_configuration {
master_access_list = jsonencode(["10.0.0.0/8"])
master_ip_space = "no-needed"
slave_access_list = jsonencode([])
slave_ip_space = "no-needed"
}
postgres_configuration {
version = "17"
ssl_required = true
pooler_master = false
pooler_slave = false
}
backup_configuration {
s3_uid = "UUID-вашего-S3" # Обязательно
retain = 7
schedule = "0 0 * * *"
}
autoscale_configuration {
enabled = false
schedule = 0
percent = 10
quota = 100
}
}
```
### S3 Bucket
```hcl
resource "nubes_s3bucket" "my_files" {
resource_name = "bucket_0"
bucket_name = "my-unique-bucket-name"
s3_user_uid = "UUID-вашего-S3"
}
```
Подробные примеры — в разделе **Ресурсы** (левое меню), вкладка **Example** у каждого ресурса.
---
## 5. Suspend, Adopt и жизненный цикл
Провайдер **не удаляет** инстансы при `terraform destroy` по умолчанию. Вместо этого переводит в `Suspend`.
### `suspend_on_destroy` (по умолчанию `true`)
| Значение | `terraform destroy` | Удаление из манифеста |
|----------|--------------------|-----------------------|
| `true` | Инстанс → `Suspend` | Инстанс → `Suspend` |
| `false` | Только удаление из state | Только удаление из state |
### `adopt_existing_on_create` (по умолчанию `false`)
| Значение | Поведение при `apply` |
|----------|-----------------------|
| `false` | Если инстанс уже есть → ошибка |
| `true` | `running` → adopt под управление; `suspended` + совпадение параметров → resume + adopt |
### `operation_timeout`
Таймаут ожидания операции. По умолчанию `"10m"`. Для долгих операций можно увеличить:
```hcl
operation_timeout = "15m"
```
!!! warning "Один инстанс — один state"
Не подключайте один инстанс к двум манифестам — получите конфликт управления.
---
## 6. Связка сервисов (Lucee + PostgreSQL)
```hcl
resource "nubes_postgres" "db2" {
resource_name = "pg-tst0"
startup_configuration {
resource_realm = "k8s-3-sandbox-nubes-ru"
}
cluster_configuration {
cpu = 500
memory = 512
replicas = 1
disk = 10
}
access_configuration {
master_access_list = jsonencode(["10.0.0.0/8"])
master_ip_space = "no-needed"
slave_access_list = jsonencode([])
slave_ip_space = "no-needed"
}
postgres_configuration {
version = "17"
ssl_required = true
pooler_master = false
pooler_slave = false
}
backup_configuration {
s3_uid = "UUID-вашего-S3"
retain = 7
schedule = "0 0 * * *"
}
autoscale_configuration {
enabled = false
schedule = 0
percent = 10
quota = 100
}
}
resource "nubes_lucee" "app1" {
resource_name = "lucy1"
resource_realm = nubes_postgres.db2.startup_configuration.resource_realm
domain = "web03"
git_path = "https://github.com/user/repo.git"
json_env = jsonencode({
testds_class = "org.postgresql.Driver"
testds_bundleName = "org.postgresql.jdbc"
testds_bundleVersion = "42.6.0"
testds_connectionString = "jdbc:postgresql://$${nubes_postgres.db2.state_out_flat[\"internalConnect.master\"]}:5432/postgres"
testds_username = nubes_postgres.db2.vault_secrets["adminUser"]
testds_password = nubes_postgres.db2.vault_secrets["adminPass"]
})
app_version = "5.4"
depends_on = [nubes_postgres.db2]
}
```
---
## 7. Типичный рабочий процесс
```bash
# 1. Клонируем/создаём проект
mkdir my-infra && cd my-infra
# 2. Создаём main.tf (скопировать из примера выше)
# 3. Создаём terraform.tfvars с токеном
# 4. Инициализация
terraform init
# 5. Проверка плана
terraform plan
# 6. Применение
terraform apply
# 7. При необходимости — удаление
terraform destroy
```