terraform-contour-mirror/README.md
kochetkov.s cd68e73e40 feat: Add Terraform infrastructure for pulse project
- Add modules: yc-s3, yc-postgresql, k8s-namespace, k8s-secrets
- Add live configuration for stage environment
- Add GitLab CI with downstream pipelines
- Implement best practices from theory.md
2026-01-19 15:15:14 +03:00

131 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Terraform Infrastructure for Pulse Project
Этот репозиторий содержит инфраструктуру как код (IaC) для проекта Pulse, развернутого в Yandex Cloud.
## Структура репозитория
```
.
├── modules/ # Переиспользуемые Terraform модули
│ ├── yc-s3/ # Модуль для создания S3 бакета
│ ├── yc-postgresql/ # Модуль для создания PostgreSQL кластера
│ ├── k8s-namespace/ # Модуль для создания Kubernetes namespace
│ └── k8s-secrets/ # Модуль для создания Kubernetes секретов
├── live/ # Живая инфраструктура
│ ├── terragrunt.hcl # Глобальная конфигурация Terragrunt
│ ├── stage/ # Окружение stage
│ │ ├── env.hcl # Конфигурация окружения
│ │ ├── namespace/ # Namespace pulse
│ │ ├── s3/ # S3 бакет pulse
│ │ ├── postgresql/ # PostgreSQL база данных
│ │ └── secrets/ # Kubernetes секреты
│ ├── prod/ # Окружение production
│ └── preprod/ # Окружение preprod
├── scripts/ # Вспомогательные скрипты
│ └── generate-pipeline.sh # Генератор GitLab CI пайплайна
└── .gitlab-ci.yml # Основной GitLab CI конфигурация
```
## Требования
- Terraform >= 1.0
- Terragrunt >= 0.50.0
- Доступ к Yandex Cloud
- Доступ к Kubernetes кластеру
## Переменные окружения
Для работы с инфраструктурой необходимо установить следующие переменные окружения:
### Yandex Cloud
- `YC_TOKEN` - токен для доступа к Yandex Cloud API
- `YC_CLOUD_ID` - ID облака
- `YC_FOLDER_ID` - ID каталога (или `YC_STAGE_FOLDER_ID`, `YC_PROD_FOLDER_ID`, `YC_PREPROD_FOLDER_ID`)
### Terraform State
- `TF_STATE_BUCKET` - имя S3 бакета для хранения состояния Terraform
- `TF_STATE_DYNAMODB_ENDPOINT` - endpoint YDB для блокировок состояния
- `TF_STATE_DYNAMODB_TABLE` - имя таблицы YDB для блокировок
### Kubernetes
- `KUBECONFIG` - путь к конфигурации Kubernetes (по умолчанию `~/.kube/config`)
- `KUBE_CONTEXT` - контекст Kubernetes (опционально)
### Docker Registry
- `DOCKER_REGISTRY_URL` - URL Docker registry (по умолчанию `cr.yandex`)
- `DOCKER_REGISTRY_USERNAME` - имя пользователя Docker registry
- `DOCKER_REGISTRY_PASSWORD` - пароль или токен Docker registry
### Сеть
- `YC_NETWORK_ID` - ID сети для PostgreSQL
- `YC_SUBNET_ID` - ID подсети для PostgreSQL
## Использование
### Локальная разработка
1. Перейдите в директорию нужного компонента:
```bash
cd live/stage/namespace
```
2. Инициализируйте Terragrunt:
```bash
terragrunt init
```
3. Просмотрите план изменений:
```bash
terragrunt plan
```
4. Примените изменения:
```bash
terragrunt apply
```
### Развертывание всех компонентов
Для развертывания всех компонентов окружения используйте:
```bash
cd live/stage
terragrunt run-all apply
```
## GitLab CI
Проект использует динамическую генерацию GitLab CI пайплайнов через downstream pipelines. При каждом коммите:
1. Запускается джоба `generate-pipeline`, которая сканирует структуру `live/` и создает джобы для каждого компонента
2. Запускается downstream пайплайн с сгенерированными джобами
Для каждого компонента создаются три джобы:
- `validate-{env}-{component}` - валидация конфигурации
- `plan-{env}-{component}` - планирование изменений
- `apply-{env}-{component}` - применение изменений (manual для prod)
## Созданные ресурсы
### Stage окружение
- **Namespace**: `pulse` в Kubernetes
- **S3 бакет**: `pulse` с публичным доступом
- **PostgreSQL**: кластер `pulse-pg-stage` с базой `pulse_db` и пользователем `pulse`
- **Секреты Kubernetes**:
- `dockerhub` - доступ к Yandex Container Registry
- `pulse-s3-secret` - ключи доступа к S3
- `pulse-postgresql-secret` - параметры подключения к PostgreSQL
## Безопасность
⚠️ **Важно**: Все секреты (пароли, ключи доступа) хранятся в Terraform state в открытом виде. Убедитесь, что:
- Бэкенд для state зашифрован (AES-256)
- Доступ к state строго ограничен
- Используется блокировка состояния через YDB
## Лицензия
Внутренний проект компании.