microsrv:~$
Консоль

Примеры архитектурных сценариев

Готовые конфигурации OpenTofu для типовых сценариев: виртуальная машина с диском данных, микросервис в контейнере, кластер с балансировщиком и WireGuard.

Типовые сценарии развёртывания

Ниже представлены готовые конфигурации на языке HCL, проверенные на совместимость с OpenTofu и провайдером microsrv-cloud/microsrv.


Сценарий 1. Виртуальная машина с дополнительным диском данных

Используется для сервисов, требующих отдельного постоянного накопителя для баз данных (PostgreSQL, ClickHouse), логов или файлов приложения.

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    microsrv = {
      source = "microsrv-cloud/microsrv"
    }
  }
}

provider "microsrv" {}

data "microsrv_region" "central" {
  code = "ru-yndx-central"
}

data "microsrv_flavor" "std" {
  code = "std.1c2g"
}

data "microsrv_image" "ubuntu" {
  code = "ubuntu-noble"
}

resource "microsrv_project" "app" {
  name = "app-production"
}

resource "microsrv_ssh_key" "ops" {
  name       = "ops-key"
  public_key = var.ssh_public_key
}

resource "microsrv_vpc" "net" {
  project_id = microsrv_project.app.id
  region_id  = data.microsrv_region.central.id
  cidr       = "10.42.0.0/24"
}

resource "microsrv_network_interface" "eth0" {
  project_id = microsrv_project.app.id
  vpc_id     = microsrv_vpc.net.id
}

# Корневой диск ОС (20 ГБ)
resource "microsrv_volume" "boot" {
  project_id = microsrv_project.app.id
  region_id  = data.microsrv_region.central.id
  size_mib   = 20480
  clone_from = data.microsrv_image.ubuntu.code
}

# Выделенный диск для данных (50 ГБ)
resource "microsrv_volume" "data" {
  project_id = microsrv_project.app.id
  region_id  = data.microsrv_region.central.id
  size_mib   = 51200
}

resource "microsrv_vm" "db" {
  project_id            = microsrv_project.app.id
  region_id             = data.microsrv_region.central.id
  flavor_id             = data.microsrv_flavor.std.id
  class                 = "shared"
  name                  = "postgres-db"
  network_interface_ids = [microsrv_network_interface.eth0.id]
  ssh_key_ids           = [microsrv_ssh_key.ops.id]
  boot_volume_id        = microsrv_volume.boot.id
  volume_ids            = [microsrv_volume.data.id] # Второй диск доступен в ОС как /dev/vdb
}

# Подключение по SSH через шлюз платформы
resource "microsrv_gateway_route" "ssh" {
  project_id = microsrv_project.app.id
  compute_id = microsrv_vm.db.id
  protocol   = "ssh"
}

variable "ssh_public_key" {
  type = string
}

output "ssh_connect" {
  value = "ssh postgres-db@msrv.space"
}

Сценарий 2. Контейнер Nginx с HTTP-шлюзом

Запуск изолированного OCI-контейнера в песочнице gVisor с постоянным диском Stateful OverlayFS и автоматической публикацией по HTTP.

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    microsrv = {
      source = "microsrv-cloud/microsrv"
    }
  }
}

provider "microsrv" {}

data "microsrv_region" "central" {
  code = "ru-yndx-central"
}

# Для контейнеров доступен энергоэффективный профиль micro (512 МБ RAM)
data "microsrv_flavor" "micro" {
  code = "micro.1c512m"
}

resource "microsrv_project" "web" {
  name = "web-service"
}

resource "microsrv_vpc" "net" {
  project_id = microsrv_project.web.id
  region_id  = data.microsrv_region.central.id
  cidr       = "10.44.0.0/24"
}

resource "microsrv_network_interface" "eth0" {
  project_id = microsrv_project.web.id
  vpc_id     = microsrv_vpc.net.id
}

# Диск данных для кэша и логов
resource "microsrv_volume" "storage" {
  project_id = microsrv_project.web.id
  region_id  = data.microsrv_region.central.id
  size_mib   = 10240
}

# Загрузка официального образа Nginx
resource "microsrv_container_image" "nginx" {
  project_id = microsrv_project.web.id
  region_id  = data.microsrv_region.central.id
  ref        = "nginx:1.27-alpine"
}

resource "microsrv_container" "app" {
  project_id            = microsrv_project.web.id
  region_id             = data.microsrv_region.central.id
  flavor_id             = data.microsrv_flavor.micro.id
  class                 = "shared"
  image_id              = microsrv_container_image.nginx.id
  name                  = "nginx-frontend"
  command               = ["nginx", "-g"]
  args                  = ["daemon off;"]
  env                   = { "NGINX_PORT" = "80" }
  restart_policy        = "always"
  volume_ids            = [microsrv_volume.storage.id]
  network_interface_ids = [microsrv_network_interface.eth0.id]
}

# Публикация веб-порта через HTTP-шлюз платформы
resource "microsrv_gateway_route" "http" {
  project_id  = microsrv_project.web.id
  compute_id  = microsrv_container.app.id
  protocol    = "http"
  target_port = 80
  comment     = "Public web route"
}

output "container_id" {
  value = microsrv_container.app.id
}

Сценарий 3. Отказоустойчивый кластер за L4-балансировщиком

Развёртывание пула идентичных виртуальных машин за балансировщиком нагрузки с единым виртуальным IP-адресом (VIP) в сети VPC.

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    microsrv = {
      source = "microsrv-cloud/microsrv"
    }
  }
}

provider "microsrv" {}

data "microsrv_region" "central" {
  code = "ru-yndx-central"
}

data "microsrv_flavor" "std" {
  code = "std.1c2g"
}

data "microsrv_image" "ubuntu" {
  code = "ubuntu-noble"
}

resource "microsrv_project" "ha" {
  name = "ha-cluster"
}

resource "microsrv_ssh_key" "admin" {
  name       = "admin-key"
  public_key = var.ssh_public_key
}

resource "microsrv_vpc" "net" {
  project_id = microsrv_project.ha.id
  region_id  = data.microsrv_region.central.id
  cidr       = "10.45.0.0/24"
}

# Создание сетевых интерфейсов и дисков для двух нод: node-a и node-b
resource "microsrv_network_interface" "nic" {
  for_each   = toset(["node-a", "node-b"])
  project_id = microsrv_project.ha.id
  vpc_id     = microsrv_vpc.net.id
}

resource "microsrv_volume" "boot" {
  for_each   = toset(["node-a", "node-b"])
  project_id = microsrv_project.ha.id
  region_id  = data.microsrv_region.central.id
  size_mib   = 20480
  clone_from = data.microsrv_image.ubuntu.code
}

resource "microsrv_vm" "nodes" {
  for_each              = toset(["node-a", "node-b"])
  project_id            = microsrv_project.ha.id
  region_id             = data.microsrv_region.central.id
  flavor_id             = data.microsrv_flavor.std.id
  class                 = "shared"
  name                  = each.key
  network_interface_ids = [microsrv_network_interface.nic[each.key].id]
  ssh_key_ids           = [microsrv_ssh_key.admin.id]
  boot_volume_id        = microsrv_volume.boot[each.key].id
}

# Балансировщик нагрузки с VIP 10.45.0.10
resource "microsrv_load_balancer" "lb" {
  project_id = microsrv_project.ha.id
  vpc_id     = microsrv_vpc.net.id
  vip        = "10.45.0.10"

  listeners = [
    {
      protocol    = "tcp"
      listen_port = 80
      target_port = 80
      algorithm   = "round_robin"
    },
    {
      protocol    = "tcp"
      listen_port = 22
      target_port = 22
      algorithm   = "source_ip"
    }
  ]

  backends = [for vm in microsrv_vm.nodes : vm.id]

  health_check = {
    protocol    = "tcp"
    port        = 80
    interval_ms = 1000
    timeout_ms  = 500
  }
}

variable "ssh_public_key" {
  type = string
}

output "lb_vip" {
  value = microsrv_load_balancer.lb.vip
}

Сценарий 4. Удалённый доступ разработчика через WireGuard

Организация прямого защищённого туннеля с рабочего ноутбука в приватную сеть VPC.

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    microsrv = {
      source = "microsrv-cloud/microsrv"
    }
  }
}

provider "microsrv" {}

data "microsrv_region" "central" {
  code = "ru-yndx-central"
}

# Генерация ключей WireGuard на локальной машине:
# wg genkey | tee privatekey | wg pubkey > publickey
variable "wireguard_public_key" {
  type        = string
  description = "Base64 публичный ключ X25519 локального клиента WireGuard"
}

resource "microsrv_project" "vpn" {
  name = "vpn-access"
}

resource "microsrv_vpc" "net" {
  project_id = microsrv_project.vpn.id
  region_id  = data.microsrv_region.central.id
  cidr       = "10.46.0.0/24"
}

resource "microsrv_network_interface" "wg_nic" {
  project_id = microsrv_project.vpn.id
  vpc_id     = microsrv_vpc.net.id
}

resource "microsrv_wireguard_peer" "laptop" {
  project_id           = microsrv_project.vpn.id
  network_interface_id = microsrv_network_interface.wg_nic.id
  public_key           = var.wireguard_public_key
  comment              = "Developer MacBook"
}

# Вывод параметров для локального файла wg0.conf
output "wg_config_params" {
  value = microsrv_wireguard_peer.laptop.status
}

После применения tofu apply в атрибуте status будут доступны:

  • allocated_ip — IP-адрес пира в сети туннеля
  • endpoint_addr — внешний адрес шлюза microsrv
  • server_public_key — публичный ключ сервера для файла wg0.conf

Следующие шаги