Бази даних та сховища
Postgres
Section titled “Postgres”| Інстанція | Engine | Class | Хто використовує | Призначення |
|---|---|---|---|---|
studsearch-prod | Postgres 17.9 | db.t4g.small · 20 GB → autoscale 50 GB (gp3) | Abitly API · Abitly Strapi · Studsearch backend · Telegram bot | 🚨 SHARED prod-інстанція — окремі схеми на сервіс |
abitly-mcp-replica | Postgres 17.9 | db.t4g.small (read replica) | abitly-mcp (ECS) | Read-replica studsearch-prod — розвантажує read-only SQL MCP-сервісу з праймері. Та сама AZ (eu-central-1a) → read-offload, не failover-HA |
abitly-dev-pg | Postgres 17.9 | db.t4g.micro (30 GB) | Abitly API dev | Dev environment |
Endpoint і назви shared інстанції:
host: studsearch-prod.cnugmkgsgbb0.eu-central-1.rds.amazonaws.comdb name: abitly_prod_dbСхеми у DB abitly_prod_db:
| Схема | Власник-сервіс | SSM-параметр | Вміст |
|---|---|---|---|
abitly | Abitly API (+ Telegram bot read-mostly) | /abitly/prod/backend/DB_SCHEMA | основні 62 таблиці (вступ, користувачі, NMT, біллінг) |
nmt_tests | Abitly API | — (створюється міграцією) | ⚠️ лише tutor_token_orders (біллінг tutor-токенів) — назва оманлива |
telegram | Telegram bot | — | власні логи бота (update_log / sent_log) |
public | Abitly Strapi | /abitly/prod/strapi/DATABASE_SCHEMA | контент Strapi ⚠️ |
studsearch | Studsearch backend | /studsearch/prod/db/schema | дані Studsearch |
marketing | Abitly Marketing (план) | — | read-model + кампанії (ADR-0002) |
⚠️ Strapi у public — за замовчуванням Postgres створює об’єкти там. DROP SCHEMA public CASCADE зруйнує Strapi. У runbook → db-issues явно вписано.
Схема abitly — домени та таблиці (abitly-api-v2)
Section titled “Схема abitly — домени та таблиці (abitly-api-v2)”Power-сервіс схеми — Abitly API (NestJS · TypeORM). На 2026-06-15: 62 entity-таблиці, згруповані за доменом. Повний per-column довідник — у репо abitly-api-v2/docs/entities.md (джерело правди); тут лише карта доменів.
| Домен | Ключові таблиці | Призначення |
|---|---|---|
| Користувачі | users (STI: Applicant/Member/Student/Teacher/Other), users_grades, user_profile_changes, catalogs, saved_offers, pseudo_registered_users, refresh_tokens | акаунти, профілі, «Вступлісти», JWT-ротація |
| Біллінг (Free/Pro/Max + tutor) | plans, plan_features, subscriptions, subscription_invoices, premium_orders, user_feature_overrides, tutor_token_orders (схема nmt_tests) | тарифи й платежі (plans-billing) — у БД є, gating ще не ввімкнено |
| Матеріали | user_materials, material_refs, bundle_refs, material_change_logs | платні матеріали / Strapi-bundle |
| Пропозиції (Offers) | offers, concurs_subjects, offer_applicants, offer_applicants_subjects, offer_admitted_scores, prediction_statuses, appliement_explanations | вступні програми, конкурсні списки, прогноз вступу |
| Університети | universities, universities_info, university_contact_persons, faculties, university_graphs, graph_blocks, university_applicants_stats, university_relevance_scores, open_days | ЗВО, факультети, статистика, дні відкритих дверей |
| НМТ-тести | nmt_tests, nmt_questions, nmt_test_attempts, nmt_test_attempt_answers, nmt_test_categories, nmt_test_tabs, nmt_rating_systems, nmt_rating_points, anonymous_migration_logs | практичні тести НМТ + рейтинг-конвертація |
| Telegram | telegram_users, telegram_user_monitoring_offers, telegram_offer_logs, monitoring_open_days | прив’язка бот↔web, моніторинг оферів/днів |
| Довідники | regions, specialities, branches, subjects, subjects_score_data, specialty_coefficients, speciality_mapping, partners, table_metadata | нормалізовані довідники + коефіцієнти балів |
Cache / queue — Valkey (не Redis)
Section titled “Cache / queue — Valkey (не Redis)”| Інстанція | Engine | Призначення |
|---|---|---|
abitly-prod-cache | Valkey 8.0.1, cache.t4g.small | Abitly API: BullMQ-черги + cache + rate-limit |
abitly-dev-cache | Valkey 8.0.1, cache.t4g.micro | dev |
Wire-протокол сумісний з Redis 7.4, але це Valkey (форк Redis після ліцензійного конфлікту). У клієнтів (BullMQ, ioredis) додаткових налаштувань не потрібно, але документація — на valkey.io.
Search engine — Typesense
Section titled “Search engine — Typesense”| Інстанція | Хост | Хто використовує |
|---|---|---|
abitly-shared-typesense (EC2 t4g.small) | SSM TYPESENSE_HOST/PORT/PROTOCOL/API_KEY (хост однаковий для dev і prod — typesense.abitly.internal) | Abitly API (повнотекстовий пошук ЗВО/спеціальностей) |
⚠️ Одна інстанція і одні колекції діляться між dev і prod (Abitly API перемикає SEARCH_ENGINE): запис із dev перетирає прод-індекс — три інциденти цього класу за липень 2026 (пост-мортем 09–10.07). Записи guard-яться SEARCH_ENGINE=typesense; стратегічний фікс — per-env інстанції або namespace-префікси.
Object storage — S3
Section titled “Object storage — S3”| Бакет | Призначення |
|---|---|
abitly-prod-strapi-media | медіа Strapi |
abitly-events-dev | Iceberg/Parquet data lake (analytics) |
abitly-athena-results-dev | Athena query results |
abitly-terraform-state | Terraform state (analytics) |
abitly-backups-v1, abitly-db-backups-v2 | бекапи Postgres (Lambda abitly-dev-db-backup) |
abitly-{dev,prod}-{backend,frontend,strapi}-pipeline-* | CodePipeline артефакти |
studsearch-prod-pipeline-artifacts-*, elasticbeanstalk-eu-central-1-* | Studsearch pipeline + EB |
aws-cloudtrail-logs-* | CloudTrail audit |
Бекапи
Section titled “Бекапи”- AWS RDS automated backups (live-перевірено 2026-06-15):
studsearch-prod— 7 діб,abitly-dev-pg— 35 діб (dev > prod — навмисно чи misconfig?TODO:звірити).abitly-mcp-replica— 0 (репліка, власних бекапів не має). abitly-dev-db-backupLambda (Python 3.12, 1024 MB) → S3abitly-db-backups-v2—TODO:точний розклад/retention Lambda-бекапів.
Міграції
Section titled “Міграції”- Abitly API — TypeORM, конфіг
src/database/data-source.ts: схемаabitly(search_path),synchronize: false✅ (без auto-DDL у проді), query-cache 10 с. На 2026-06-15 — 161 міграція:1734111928121-InitMigration(2024-12-13) →1779897520902-AddPrimarySpecialityId(2026-05-27). Команди:npm run migration:generate / run / revert.- Архітектурні епохи з історії міграцій: довідники + офери (груд. 2024) → користувачі (січ. 2025) → денормалізація
offer_applicants+ статистика ЗВО (літо 2025) → Telegram-моніторинг (лип.–жовт. 2025) → система НМТ-тестів (лист. 2025 – січ. 2026) → біллінг / підписки / матеріали / refresh-токени / tutor-токени (лют.–бер. 2026).
- Архітектурні епохи з історії міграцій: довідники + офери (груд. 2024) → користувачі (січ. 2025) → денормалізація
- Studsearch backend — TypeORM. ⚠️ Перевір
db/synchronize=falseу prod SSM (/studsearch/prod/db/synchronize) — auto-DDL на shared-інстансі небезпечний. - Strapi — власні Strapi-міграції (
npm run upgrade).
Діагностика
Section titled “Діагностика”Проблеми з БД → runbook db-issues. Прямий SQL — через aws ssm start-session на dev-bastion / psql з vault-кередами.