Files
docs/architecture.md
T

155 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Архитектура
## Общая схема контейнеров
```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)