# 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 ## Лицензия Внутренний проект компании.