Перейти к основному содержимому

Топология сервисов

Зачем нужно

Документ фиксирует, какие сервисы реально существуют в продакшене, какие у них границы и как они общаются.

Принцип разбиения

Один домен = один backend-сервис + один фронтенд (либо публичный сайт, либо рабочий кабинет, либо админка). Дробить домен на микросервисы можно только через ADR.

Multi-tenancy на старте моделируется через access scopes и actor context, без отдельного tenant_id в каждой таблице. Это закреплено в ADR-034.

Сервисы

СервисТипНазначение
identity-apibackendidentity домен, OAuth-сервер
identity-admin-webfrontendадминка identity и общие платформенные настройки; UI над platform reference-data, permissions catalog и feature flags
storefront-webfrontend (SSR/SSG)публичная витрина
storefront-apibackendадминка витрины, формы, leads, public read-model
crm-apibackendCRM домен
crm-webfrontendрабочий кабинет CRM/менеджеров
lms-apibackendLMS домен
lms-webfrontendучебный кабинет (ученик, родитель, преподаватель)
task-bank-apibackendбанк задач
task-bank-webfrontendредактор и каталог задач (внутренний)
competitions-apibackendолимпиады
competitions-webfrontendкабинет внешнего преподавателя и участника
management-apibackendmanagement домен, аналитика, цели, диагностика
management-webfrontendуправленческий dashboard
events-busинфраструктурашина доменных событий
gatewayreverse proxyпубличный API gateway (Nginx/Traefik)
redisинфраструктуракэш, сессии
postgresинфраструктураосновная БД (per-сервис)

Каждый backend-сервис имеет свою отдельную PostgreSQL-БД (database per service).

identity-api временно хостит platform reference-data tables и endpoints до выделения отдельного platform-service. Это runtime-размещение, а не перенос ownership из platform в identity.

Окружения

ОкружениеНазначение
localdev на машине разработчика, Docker Compose
devобщее интеграционное окружение
stagingпредрелизное, идентичное prod
prodпродакшен

Промежуточные окружения создаются по запросу через CI.

Маршрутизация

  • Публичный домен https://systematika.tld/ — storefront-web.
  • https://app.systematika.tld/ — учебный/рабочий кабинет (lms-web, crm-web, management-web, task-bank-web, competitions-web; маршрутизация по поддоменам или префиксам).
  • https://id.systematika.tld/ — identity (auth, OAuth screens, профиль).
  • https://api.systematika.tld/ — единый API gateway, маршрутизирует по префиксу /api/v2/<domain>/... на сервис домена.

Префикс API: /api/v2/<domain>/.... Версионирование описано в api-conventions.md.

Внешние зависимости

ЗависимостьНазначение
Email transportSMTP/SES/Mailgun (через identity transports registry)
SMS transportвнешний провайдер
Payment providerwebhook идёт в crm-api/payments/provider-webhook/{provider}
Object storageS3 или MinIO для файлов
ObservabilityGrafana stack (Prometheus, Loki, Tempo), Sentry

Доступ между сервисами

  • Сервисы не ходят в чужие БД.
  • Online-чтение чужих данных — только через API владельца с service token.
  • Долгоживущее состояние — через подписку на события.
  • Service-to-service токены выдаются identity authorization server по client_credentials grant с scoped permissions.

Что запрещено

  • Один сервис на два домена.
  • Прямой SQL-доступ в чужую БД.
  • Дублирование canonical-данных без описанной интеграции.
  • Развертывание сервиса без observability и health checks.

Связанные документы