# Архитектура ## Общая схема контейнеров ```mermaid flowchart LR user[Пользователь / браузер] nginx[nginx\n:80 / :443] backend[Backend API\nSymfony 7.3\nphp84:9000] cabinet[Cabinet legacy\nSymfony 5.4\nphp82:9000] nextjs[Sovamed site\nNext.js\nnextjs:3001] static[Static apps\nfrontend/adminPanel/kiosk dist] pg[(PostgreSQL\npgsql:5432)] redis[(Redis\nredis:6379)] bitrix[(Bitrix MySQL)] mis[Infoclinica / MIS] sms[SMS / Notisend] calltouch[Calltouch] user --> nginx nginx -->|api.sovamed.ru| backend nginx -->|cabinet.sovamed.ru| cabinet nginx -->|sovamed site| nextjs nginx -->|static dist| static backend --> pg backend --> redis backend --> bitrix backend --> mis backend --> sms backend --> calltouch cabinet --> pg cabinet --> redis cabinet --> bitrix cabinet --> mis cabinet --> sms cabinet --> calltouch ``` ## Роли сервисов - `nginx` - публичная точка входа, TLS, маршрутизация на PHP-FPM и статические файлы. - `php84` - PHP-FPM для `apps/backend`, рабочая директория `/var/www/backend`. - `php82` - PHP-FPM для `apps/cabinet`, рабочая директория `/var/www/cabinet`. - `pgsql` - PostgreSQL, данные монтируются в `infrastructure/pgsql/data`. - `redis` - Redis с обязательным паролем. - `nodejs` - helper-контейнер для Node-проектов, в текущем compose работает как долгоживущий контейнер без dev-команды. - `nextjs` - production-контейнер для `apps/sovamed`, но сами исходники `apps/sovamed` в текущем дереве отсутствуют. ## Потоки данных Backend и cabinet оба работают с медицинскими справочниками, врачами, филиалами, ценами, отзывами и записями. Оба проекта интегрируются с внешними системами: - Bitrix; - Infoclinica/MIS; - Calltouch; - SMS/уведомления; - Yandex/Direct в старом cabinet. Backend выглядит как новый API-слой и единое хранилище данных. Cabinet является старым монолитом с пользовательским интерфейсом, админскими страницами, публичным API и служебными командами синхронизации. ## Слои приложений ```mermaid flowchart TB http[HTTP request] controller[Controller\nмаршруты, request/response] dto[DTO / Form\nвалидация входных данных] service[Service / Bundle\nбизнес-логика и интеграции] repo[Repository\nзапросы Doctrine] entity[Entity\nмодель данных] db[(PostgreSQL / внешние БД)] external[Внешние API] http --> controller controller --> dto controller --> service controller --> repo service --> repo repo --> entity repo --> db service --> external ``` В `backend` этот слой выражен чище: контроллеры тоньше, логика вынесена в сервисы и DTO, роуты объявлены attributes. В `cabinet` часть логики остается внутри контроллеров и локальных `Bundle/*`-классов, потому что это старый монолит с Twig-страницами и админскими сценариями. ## Поток API-запроса backend ```mermaid sequenceDiagram participant Client as Клиент participant Nginx as nginx participant PHP as php84 participant Symfony as Symfony Kernel participant Controller as Controller participant Service as Service participant DB as PostgreSQL participant External as Внешний API Client->>Nginx: HTTPS запрос api.sovamed.ru Nginx->>PHP: FastCGI /public/index.php PHP->>Symfony: Request Symfony->>Controller: route + DI Controller->>Service: бизнес-операция Service->>DB: чтение/запись через Repository Service->>External: при необходимости MIS/Bitrix/SMS External-->>Service: ответ DB-->>Service: данные Service-->>Controller: результат Controller-->>Client: JsonResponse ``` ## Поток страницы cabinet ```mermaid sequenceDiagram participant User as Пользователь participant Nginx as nginx participant PHP as php82 participant Controller as Symfony Controller participant Service as Service/Bundle participant Twig as Twig participant DB as PostgreSQL User->>Nginx: HTTPS запрос cabinet.sovamed.ru Nginx->>PHP: FastCGI /public/index.php PHP->>Controller: route + security Controller->>Service: подготовка данных Service->>DB: Doctrine query DB-->>Service: сущности/массивы Service-->>Controller: результат Controller->>Twig: render template Twig-->>User: HTML ``` ## Где искать код - HTTP endpoints backend: `apps/backend/src/Controller`. - HTTP endpoints cabinet: `apps/cabinet/src/Controller`. - Модели Doctrine: `src/Entity` в каждом приложении. - Запросы к БД: `src/Repository`. - Бизнес-логика: `src/Service`. - Консольные задачи синхронизации: `src/Command`. - Twig-шаблоны cabinet: `apps/cabinet/templates`. - Frontend-ассеты cabinet: `apps/cabinet/assets`. ## Следующие страницы - [Backend: архитектура модулей](./apps/backend-architecture.md) - [Cabinet: архитектура модулей](./apps/cabinet-architecture.md) - [Модели данных](./data-model.md)