Перейти до вмісту

Бази даних та сховища

ІнстанціяEngineClassХто використовуєПризначення
studsearch-prodPostgres 17.9db.t4g.small · 20 GB → autoscale 50 GB (gp3)Abitly API · Abitly Strapi · Studsearch backend · Telegram bot🚨 SHARED prod-інстанція — окремі схеми на сервіс
abitly-mcp-replicaPostgres 17.9db.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-pgPostgres 17.9db.t4g.micro (30 GB)Abitly API devDev environment

Endpoint і назви shared інстанції:

host: studsearch-prod.cnugmkgsgbb0.eu-central-1.rds.amazonaws.com
db name: abitly_prod_db

Схеми у DB abitly_prod_db:

СхемаВласник-сервісSSM-параметрВміст
abitlyAbitly API (+ Telegram bot read-mostly)/abitly/prod/backend/DB_SCHEMAосновні 62 таблиці (вступ, користувачі, NMT, біллінг)
nmt_testsAbitly API— (створюється міграцією)⚠️ лише tutor_token_orders (біллінг tutor-токенів) — назва оманлива
telegramTelegram botвласні логи бота (update_log / sent_log)
publicAbitly Strapi/abitly/prod/strapi/DATABASE_SCHEMAконтент Strapi ⚠️
studsearchStudsearch backend/studsearch/prod/db/schemaдані Studsearch
marketingAbitly 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практичні тести НМТ + рейтинг-конвертація
Telegramtelegram_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нормалізовані довідники + коефіцієнти балів
ІнстанціяEngineПризначення
abitly-prod-cacheValkey 8.0.1, cache.t4g.smallAbitly API: BullMQ-черги + cache + rate-limit
abitly-dev-cacheValkey 8.0.1, cache.t4g.microdev

Wire-протокол сумісний з Redis 7.4, але це Valkey (форк Redis після ліцензійного конфлікту). У клієнтів (BullMQ, ioredis) додаткових налаштувань не потрібно, але документація — на valkey.io.

ІнстанціяХостХто використовує
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-префікси.

БакетПризначення
abitly-prod-strapi-mediaмедіа Strapi
abitly-events-devIceberg/Parquet data lake (analytics)
abitly-athena-results-devAthena query results
abitly-terraform-stateTerraform 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
  • 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-backup Lambda (Python 3.12, 1024 MB) → S3 abitly-db-backups-v2TODO: точний розклад/retention Lambda-бекапів.
  • 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).
  • Studsearch backend — TypeORM. ⚠️ Перевір db/synchronize=false у prod SSM (/studsearch/prod/db/synchronize) — auto-DDL на shared-інстансі небезпечний.
  • Strapi — власні Strapi-міграції (npm run upgrade).

Проблеми з БД → runbook db-issues. Прямий SQL — через aws ssm start-session на dev-bastion / psql з vault-кередами.