Документация
API и автоматизация

Terraform provider для elistrax

Установка провайдера, минимальный main.tf, plan/apply. Готовый пример stack.

6 мин

Terraform-провайдер elistrax

Управляйте VPS-парком как кодом. Провайдер elistrax/elistrax покрывает: серверы, домены, DNS-записи, snapshots, firewall-правила, SSH-ключи.

Установка

main.tf:

terraform {
  required_providers {
    elistrax = {
      source  = "elistrax/elistrax"
      version = "~> 1.0"
    }
  }
}

provider "elistrax" {
  # Токен из панели → API → Tokens
  token = var.elistrax_token
}

Инициализация:

terraform init

API-токен

1. Панель → APITokensCreate. 2. Дайте scope: servers:write, dns:write, billing:read — в зависимости от того, что автоматизируете. 3. Скопируйте токен. Больше он не покажется.

Экспортируйте:

export TF_VAR_elistrax_token='...'

Первый сервер

resource "elistrax_ssh_key" "main" {
  name       = "laptop-2026"
  public_key = file("~/.ssh/id_ed25519.pub")
}

resource "elistrax_server" "web" {
  name         = "web-01"
  location     = "fsn1"          # Falkenstein
  plan         = "cpx21"          # 3 vCPU, 4 GB RAM, 80 GB NVMe
  image        = "ubuntu-24.04"
  ssh_key_ids  = [elistrax_ssh_key.main.id]

  labels = {
    env  = "prod"
    role = "web"
  }
}

output "web_ip" {
  value = elistrax_server.web.ipv4
}

Применить:

terraform plan
terraform apply

Сервер поднимется за 30-90 секунд.

DNS-запись

resource "elistrax_dns_zone" "main" {
  name = "example.com"
}

resource "elistrax_dns_record" "web" {
  zone_id = elistrax_dns_zone.main.id
  name    = "@"
  type    = "A"
  value   = elistrax_server.web.ipv4
  ttl     = 300
}

resource "elistrax_dns_record" "www" {
  zone_id = elistrax_dns_zone.main.id
  name    = "www"
  type    = "CNAME"
  value   = "example.com."
  ttl     = 300
}

Firewall

resource "elistrax_firewall" "web" {
  name = "web-fw"

  rule {
    direction   = "in"
    protocol    = "tcp"
    port        = "22"
    source_ips  = ["1.2.3.4/32"]  # только с офиса
  }

  rule {
    direction   = "in"
    protocol    = "tcp"
    port        = "80"
    source_ips  = ["0.0.0.0/0"]
  }

  rule {
    direction   = "in"
    protocol    = "tcp"
    port        = "443"
    source_ips  = ["0.0.0.0/0"]
  }
}

resource "elistrax_server_firewall" "web" {
  server_id   = elistrax_server.web.id
  firewall_id = elistrax_firewall.web.id
}

Snapshots

resource "elistrax_snapshot" "web_backup" {
  server_id   = elistrax_server.web.id
  description = "before-migration-2026-07"
}

Snapshot делается за 1-3 минуты, тарифицируется по $0.01/GB/месяц.

Модуль для нескольких серверов

locals {
  servers = {
    web-01 = { role = "web", plan = "cpx21" }
    web-02 = { role = "web", plan = "cpx21" }
    db-01  = { role = "db",  plan = "cpx41" }
  }
}

resource "elistrax_server" "cluster" {
  for_each     = local.servers
  name         = each.key
  location     = "fsn1"
  plan         = each.value.plan
  image        = "ubuntu-24.04"
  ssh_key_ids  = [elistrax_ssh_key.main.id]

  labels = {
    env  = "prod"
    role = each.value.role
  }
}

State и командная работа

Не храните terraform.tfstate в git — там токены и IP. Используйте remote state:

  • S3 backend (BackBlaze B2, Wasabi) — самый простой.
  • Terraform Cloud — бесплатно до 5 пользователей.
terraform {
  backend "s3" {
    endpoint = "s3.us-west-002.backblazeb2.com"
    bucket   = "tfstate-prod"
    key      = "elistrax/prod.tfstate"
    region   = "us-west-002"
    encrypt  = true
  }
}

Что дальше