Новости
Serverspace запустил обновленную партнерскую программу
Serverspace Black Friday
BK
июня 26, 2025
Обновлено июня 24, 2025

Настройка виртуального сервера с базой данных через Terraform пошаговое руководство

Terraform Базы данных

Ручное управление серверами и базами данных — это источник ошибок, несогласованности и потери времени. Terraform позволяет описывать инфраструктуру как код, обеспечивая повторяемость, версионность и автоматизацию. Это руководство поможет вам настроить виртуальный сервер с PostgreSQL через Terraform, создав надёжную и воспроизводимую среду для ваших приложений.

Что такое Terraform: Ваш универсальный строитель

Terraform — не просто инструмент, это язык для диалога с облаком. С помощью декларативного кода (HCL) вы описываете желаемое состояние инфраструктуры

"Мне нужно 3 сервера Ubuntu 22.04, 4 vCPU, 8GB RAM, с PostgreSQL 15, репликацией и ежедневными бэкапами"

Как это работает:

  • Пишите код с описанием ресурсов (серверы, сети, БД)
  • Terraform создаёт план выполнения
  • После подтверждения — строит инфраструктуру
  • Запоминает текущее состояние в файле
  • При изменениях — вычисляет дельту и применяет её

Terraform: Острая бритва Оккама

Достоинства:

  • Единый язык для любого облака (AWS, GCP, Azure, Yandex Cloud и т.д.)
  • Идемпотентность — повторное применение не ломает работающую систему
  • Граф зависимостей — автоматическое определение порядка создания ресурсов
  • Экосистема модулей — готовые решения для типовых задач
  • План изменений — предпросмотр последствий перед реальным применением

Недостатки:

  • Кривая обучения — требует понимания принципов IaC
  • Абстракции утечки — иногда нужно лезть в ручное управление
  • Состояние (state) — боль при потере или конфликтах
  • Ограниченная логика — сложные условия требуют хитростей

Жесткая правда: По данным HashiCorp, внедрение Terraform даёт:

  • На 60% сокращение времени развертывания
  • На 90% снижение ошибок конфигурации
  • На 40% уменьшение затрат на инфраструктуру

Пошаговая настройка: Сервер PostgreSQL в Serverspace

Шаг 0 - Подготовка

  • Установите Terraform
  • Настройте доступ к ServerSpace VPS
  • Создайте проект в отдельной директории:
mkdir sc-postgres && cd sc-postgres

touch {main.tf,variables.tf,outputs.tf}

Шаг 1 - Конфигурация провайдера (`main.tf`)

terraform {

required_providers {

servsersapce = {

source = "serversapce-vps/serversapce"

version = "0.95.0"

}

}

}

provider "serversapce" {

token     = var.sc_token

cloud_id  = var.sc_cloud_id

folder_id = var.sc_folder_id

zone      = "ru-central1-a"

}

Шаг 2 - Секреты и переменные (`variables.tf`)

variable "sc_token" {

description = "Serversapce OAuth token"

type        = string

sensitive   = true

}

variable "sc_id" {

description = "Serversapce ID"

type        = string

}

variable "sc_folder_id" {

description = "Serverspace Folder ID"

type        = string

}

variable "db_password" {

description = "PostgreSQL admin password"

type        = string

sensitive   = true

}

Важно! Создайте `.tfvars` файл для значений (не коммитить в Git!):

# secret.auto.tfvars

sc_token     = "your_oauth_token"

sc_id  = "b1gvmr57rvq9"

sc_folder_id = "b1g8fp3ku62a"

db_password  = "StRoNg!PaSsWoRd#123"

Шаг 3 - Сеть и безопасность (`main.tf`)

resource "serverspace_vpc_network" "db_network" {

name = "postgres-network"

}

resource "serverspace_vpc_subnet" "db_subnet" {

name           = "postgres-subnet"

network_id     = serverspace_vpc_network.db_network.id

v4_cidr_blocks = ["192.168.10.0/24"]

zone           = "ru-central1-a"

}

resource "serverspace_vpc_security_group" "db_sg" {

name        = "postgres-security-group"

network_id  = serverspace_vpc_network.db_network.id

ingress {

description    = "PostgreSQL"

port           = 5432

protocol       = "TCP"

v4_cidr_blocks = ["0.0.0.0/0"] # Ограничьте на проде!

}

ingress {

description    = "SSH"

port           = 22

protocol       = "TCP"

v4_cidr_blocks = ["192.168.0.0/16"] # Доступ только из внутренней сети

}

egress {

description    = "Outgoing traffic"

protocol       = "ANY"

v4_cidr_blocks = ["0.0.0.0/0"]

}
}

Шаг 4 - Виртуальная машина с PostgreSQL (`main.tf`)

resource "serverspace_compute_instance" "db_server" {

name        = "postgres-master"

platform_id = "standard-v3"

zone        = "ru-central1-a"

resources {

cores  = 4

memory = 8

}

boot_disk {

initialize_params {

image_id = "fd82sqrj4uk9" # Ubuntu 22.04

size     = 20

}

}

network_interface {

subnet_id = serverspace_vpc_subnet.db_subnet.id

nat       = true

security_group_ids = [serverspace_vpc_security_group.db_sg.id]

}

metadata = {

ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"

}

provisioner "remote-exec" {

inline = [

"sudo apt update",

"sudo apt install -y postgresql-15",

"sudo systemctl enable postgresql"

]

connection {

type        = "ssh"

user        = "ubuntu"

private_key = file("~/.ssh/id_rsa")

host        = self.network_interface[0].nat_ip_address

}

}

}

Шаг 5 - Управляемая база данных (альтернатива ВМ)

resource "serverspace_mdb_postgresql_cluster" "prod_db" {

name        = "production-db"

environment = "PRESTABLE"

network_id  = serverspace_vpc_network.db_network.id

config {

version = 15

resources {

resource_preset_id = "s2.micro" # 2 vCPU, 8GB RAM

disk_size          = 100

disk_type_id       = "network-ssd"

}

}

host {

zone      = "ru-central1-a"

subnet_id = serverspace_vpc_subnet.db_subnet.id

}

user {

name     = "admin"

password = var.db_password

permission {

database_name = "prod_db"

}

}

database {
name  = "prod_db"
owner = "admin"
}
}

Шаг 6 - Запуск и проверка

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

terraform init # Загрузка провайдера

2. Планирование:

terraform plan # Предпросмотр изменений

3. Применение:

terraform apply # Ввод yes после проверки плана

4. Вывод подключения (`outputs.tf`):

output "vm_public_ip" {

value = serverspace_compute_instance.db_server.network_interface[0].nat_ip_address

}

output "db_connection" {

value = "postgres://admin:${var.db_password}@${serverspace_mdb_postgresql_cluster.prod_db.host[0].fqdn}:6432/prod_db"

sensitive = true

}

Либо же во избежание использования и трудозатрат возможно воспользоваться, услугами по автоматизации развертывания Terraform по следующей [ссылке](https://my.serverspace.ru/automation?pid=510372).

Жизненные сценарии - Как Terraform спасает в критических ситуациях

Сценарий 1 - Катастрофа в дата-центре

terraform destroy -target=serverspace_compute_instance.db_server

terraform apply # Сервер воссоздан за 4 минуты

Сценарий 2 - Масштабирование под нагрузкой

Меняем в коде:

resources {

cores  = 8 # Было 4

memory = 16 # Было 8

}

Применяем: terraform apply — сервер пересоздается с новыми параметрами.

Сценарий 3 - Тестирование обновлений

terraform workspace new staging # Клон инфраструктуры

terraform apply -var="db_password=Test@123" # Тестовая среда

# После проверки — перенос конфига в prod

Terraform не просто автоматизирует рутину. Он меняет философию управления:

  • Версионность:
    • Инфраструктура в Git = история изменений
  • Надёжность:
    • Идемпотентность = предсказуемость
  • Безопасность:
    • Код ручные настройки
  • Экономия:
    • Уничтожение неиспользуемых ресурсов одной командой
Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
050000 г. Алматы пр. Сейфуллина, д. 502
+7 (777) 555-36-66
ООО «ИТГЛОБАЛКОМ ЛАБС»