Ручное управление серверами и базами данных — это источник ошибок, несогласованности и потери времени. 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
- Создайте проект в отдельной директории:
touch {main.tf,variables.tf,outputs.tf}
Шаг 1 - Конфигурация провайдера (`main.tf`)
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`)
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!):
sc_token = "your_oauth_token"
sc_id = "b1gvmr57rvq9"
sc_folder_id = "b1g8fp3ku62a"
db_password = "StRoNg!PaSsWoRd#123"
Шаг 3 - Сеть и безопасность (`main.tf`)
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`)
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 - Управляемая база данных (альтернатива ВМ)
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. Инициализация:
2. Планирование:
3. Применение:
4. Вывод подключения (`outputs.tf`):
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 apply # Сервер воссоздан за 4 минуты
Сценарий 2 - Масштабирование под нагрузкой
Меняем в коде:
cores = 8 # Было 4
memory = 16 # Было 8
}
Применяем: terraform apply — сервер пересоздается с новыми параметрами.
Сценарий 3 - Тестирование обновлений
terraform apply -var="db_password=Test@123" # Тестовая среда
# После проверки — перенос конфига в prod
Terraform не просто автоматизирует рутину. Он меняет философию управления:
- Версионность:
- Инфраструктура в Git = история изменений
- Надёжность:
- Идемпотентность = предсказуемость
- Безопасность:
- Код ручные настройки
- Экономия:
- Уничтожение неиспользуемых ресурсов одной командой