# POSTGRES — Пример: Serverless-функции с Managed PostgreSQL Демонстрирует интеграцию sless (serverless functions) с управляемым PostgreSQL (nubes_postgres). ## Что делает этот пример 1. **Создаёт Managed PostgreSQL** через Terraform (nubes_postgres + nubes_postgres_user + nubes_postgres_database) 2. **Инициализирует БД**: одноразовый `sless_job` создаёт таблицу `terraform_demo_table` 3. **Запускает 3 HTTP-сервиса**: - `pg-info` (Node.js 20) — версия PostgreSQL-сервера + количество строк в таблице - `pg-table-reader` (Python 3.11) — чтение всех строк из таблицы - `pg-table-writer` (Python 3.11) — добавление новой строки ## Структура файлов ``` POSTGRES/ ├── main.tf # terraform + провайдеры (sless, nubes_cloud) ├── postgres.tf # Managed PostgreSQL: DB, пользователь, locals с credentials ├── resources.tf # Namespace и сетевые ресурсы ├── functions.tf # sless_job (init) + 3 x sless_service ├── terraform.tfvars # Переменные: realm, s3_uid, token ├── stress_test.sh # Стресс-тест функций (не трогает PG lifecycle) ├── stress_destroy_apply.sh.disabled # ОТКЛЮЧЁН — стресс-тест PG lifecycle ├── code/ │ ├── sql-runner/ # Python: одноразовое выполнение SQL (CREATE TABLE) │ ├── pg-info/ # Node.js: версия PG + строки │ ├── table-rw/ # Python: list_rows + add_row │ ├── pg-stats/ # Python: расширенная статистика PG │ ├── funcs-list/ # Утилита: листинг функций │ └── stress-*/ # Функции для стресс-тестирования └── scripts/ # Вспомогательные скрипты ``` ## Как запустить ### Предварительные требования - Terraform >= 1.3 - Токен sless: `SLESS_TOKEN` (или в `terraform.tfvars`) - Токен nubes_cloud: `NUBES_TOKEN` - Доступ к realm (например, `ffd1f598c169b0ae`) ### Запуск ```bash # 1. Инициализация terraform init # 2. Проверка плана terraform plan # 3. Применение (создаст PG + сервисы, запустит init job) terraform apply ``` > Первый `apply` может занять 10–15 минут: создание PG-инстанса + kaniko-сборка образов. ### Переменные (`terraform.tfvars`) ```hcl realm = "ffd1f598c169b0ae" # Реалм (namespace в sless) s3_uid = "s01234" # S3 bucket для nubes_postgres бэкапов sless_token = "..." # Bearer-токен для sless API nubes_token = "..." # Bearer-токен для nubes_cloud API ``` ### Вывод после apply ``` Outputs: table_reader_url = "https://sless.kube5s.ru/v1/namespaces/.../services/pg-table-reader/invoke" table_writer_url = "https://sless.kube5s.ru/v1/namespaces/.../services/pg-table-writer/invoke" ``` ### Вызов функций ```bash # Информация о PG (Node.js) curl https://.../services/pg-info/invoke # Список строк таблицы (Python) curl https://.../services/pg-table-reader/invoke # Добавить строку (Python) curl -X POST https://.../services/pg-table-writer/invoke \ -H "Content-Type: application/json" \ -d '{"title": "Hello from sless!"}' ``` ## Стресс-тест `stress_test.sh` — нагружает функции HTTP-запросами. Запускать после `terraform apply`: ```bash ./stress_test.sh ``` > `stress_destroy_apply.sh.disabled` — ранний тест PG lifecycle (destroy+apply цикл). > **Отключён** из-за проблем с удалением postgres_user в определённых сценариях.