Containers (C4 рівень 2)
Деталізація — які сервіси, бази та сховища існують, як пов’язані.
flowchart LR
subgraph abitly[Abitly.org]
direction TB
a_web[Web · Next.js<br/>ECS Fargate / Amplify dev]
a_mini[Mini App · Next.js<br/>Railway]
a_bot[Telegram bot · aiogram 3<br/>AWS ECS Fargate]
a_cms[Strapi v5<br/>EC2]
a_api[NestJS API<br/>ECS Fargate]
a_mcp[abitly-mcp<br/>ECS Fargate]
a_analytics[Analytics Lambda<br/>+ Firehose + S3]
a_email[Email service · Fastify<br/>Lambda + Dynamo + Scheduler]
a_marketing[Marketing · worker<br/>ECS — план]
a_crm[CRM/Support bot · grammY<br/>Lambda + API GW]
a_parse[abitly-parse · Python ETL<br/>ECS Fargate scheduled 3×/день]
a_sim[vstup-simulation · Node<br/>ручний запуск /wide-run]
end
edbo_src[ЄДЕБО / abit-poisk / osvita<br/>зовнішні джерела вступу]
subgraph studsearch[Studsearch.org]
direction TB
s_web[Web · Next.js<br/>Amplify]
s_api[NestJS Backend<br/>Elastic Beanstalk]
s_bot[Telegram bot<br/>TODO host]
end
subgraph data[Дані]
direction TB
pg[(Postgres 17.9<br/>RDS · t4g.small<br/>SHARED INSTANCE)]
pg_dev[(Postgres dev<br/>abitly-dev-pg)]
pg_ro[(Read-replica<br/>abitly-mcp-replica)]
valkey[(Valkey 8.0.1<br/>ElastiCache)]
ts[(Typesense<br/>EC2)]
s3_media[(S3<br/>strapi-media)]
s3_lake[(S3 Iceberg<br/>analytics)]
ddb_crm[(DynamoDB<br/>abitly-crm-bot)]
end
a_web --> a_api
a_web --> a_cms
a_web -- cross-product --> s_api
a_web -- track() --> a_analytics
a_mini --> a_api
a_bot -.-> a_api
a_api -- "schema: abitly" --> pg
a_api --> valkey
a_api --> ts
a_cms -- "schema: public" --> pg
a_cms --> s3_media
a_bot -- "schema: abitly" --> pg
a_analytics --> s3_lake
a_mcp -- "read-only SQL" --> pg_ro
pg -. "replication" .-> pg_ro
a_marketing -- "SELECT: abitly" --> pg
a_marketing -- "schema: marketing" --> pg
a_marketing --> valkey
a_marketing -- facts --> a_cms
a_marketing -- events --> s3_lake
a_marketing -- telegram --> a_bot
a_marketing --> esp[ESP · email<br/>зовнішній]
a_api -- "lifecycle/contacts<br/>no-op без env" --> a_email
a_email --> ses_eo[AWS SES<br/>·EO legacy contacts]
a_crm --> ddb_crm
a_crm -- "webhook + Send API" --> meta_graph[Meta Graph API<br/>IG Direct + Messenger]
s_web --> s_api
s_api -- "schema: studsearch" --> pg
s_api -- cross-product --> a_api
s_bot -.-> s_api
edbo_src --> a_parse
a_parse -- "upsert schema: abitly<br/>(dev і prod одночасно)" --> pg
a_parse --> pg_dev
a_sim -- "читає abitly,<br/>пише wide_competition" --> pg
Ключові зв’язки
Section titled “Ключові зв’язки”| Звідки | Куди | Що передається |
|---|---|---|
| Abitly Web | Abitly API | bus-data (REST), JWT в cookie |
| Abitly Web | Strapi | контент (REST/GraphQL) |
| Abitly Web | Studsearch backend | cross-product search |
| Abitly Web | Analytics | track() події через POST на Lambda |
| Mini App | Abitly API | те ж + Telegram init data |
| Telegram bot | Postgres (abitly + власна telegram) | читає вступ-дані (офери/бали/дні відкр. дверей); пише профілі, моніторинг і логи |
| Telegram bot | Abitly API | непрямий звʼязок: спільна схема abitly (власник — API) + контракт link-токенів. Прямих HTTP-викликів нема |
| Studsearch backend | Abitly API | cross-product дані (env abitly_url) |
| Abitly API | Valkey | BullMQ-черги, кеш, rate-limit |
| Abitly API | Typesense | search index queries |
| Abitly API | Postgres | основні дані |
| abitly-mcp | Read-replica (abitly-mcp-replica) | read-only SQL семантичним шаром — розвантажує праймері |
| Strapi | Postgres | контент |
| Strapi | S3 | медіа |
| Marketing (план) | Postgres | read-model (SELECT abitly) + writes у marketing |
| Marketing (план) | ESP / Telegram bot | відправлення кампаній |
| Marketing (план) | Lake-house | engagement-події + атрибуція |
| Abitly API | Email service | fire-and-forget HTTP: контакт при реєстрації, checkout-started/-completed (нагадування кошика); no-op без EMAIL_SERVICE_URL |
| CRM/Support bot | DynamoDB abitly-crm-bot | стан розмов, мапінги повідомлень, журнал; ізольований від shared Postgres |
| CRM/Support bot | Telegram + Meta Graph API | звернення з TG DM / Instagram Direct / Messenger → топіки форум-групи «Abitly CRM», двосторонній міст |
| Email service | AWS SES (SES-only з 17.07; EO — legacy contact upsert) | broadcast-движок + lifecycle-нагадування; suppression/ledger у DynamoDB (email-маркетинг) |
| abitly-parse | Postgres (dev і prod) | upsert довідників вступу і заяв (offers, offer_requests, …) зі ЄДЕБО/abit-poisk/osvita |
| vstup-simulation | Postgres | читає abitly.offers/offer_requests, пише схему wide_competition + prediction_status |
TODO в діаграмі
Section titled “TODO в діаграмі”- Studsearch Telegram bot — host та зв’язки (підтверджено: НЕ у
studsearch-backend-v2; де живе —TODO:). - Mini App ↔ Telegram WebApp init data validation flow (показати окремо).
Інфраструктурна мапа → infrastructure. Sequence-діаграми ключових flow → data-flows. Потоки даних вступу end-to-end → data-архітектура.