155 lines
5.8 KiB
Markdown
155 lines
5.8 KiB
Markdown
# Архитектура
|
||
|
||
## Общая схема контейнеров
|
||
|
||
```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)
|