Files
web-frontend/docs/tz/technical-architecture.md
2026-05-01 14:50:06 +07:00

275 lines
16 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.

# 7. Техническая архитектура, стек и состав компонентов
## 7.1 Общая архитектурная схема
Программный продукт реализуется по клиент-серверной модели и включает веб-клиент, сервер бизнес-логики, базу данных, модуль интеграции и вспомогательные сервисы уведомлений.
<NamedMermaidDiagram name="architecture-overview" />
## 7.2 Состав прикладных сервисов
Согласно действующей карте деплоя в составе проекта используются следующие сервисы:
- `web-frontend` — клиентский и менеджерский веб-интерфейс
- `apollo-backend` — сервер GraphQL и бизнес-логика
- `vault` — централизованное хранилище секретов
- `tg-bot` — Telegram-контур
- `max-bot` — MAX-контур
- `bonus-bot` — бонусный мессенджерный контур
Основные прикладные сервисы `web-frontend` и `apollo-backend` разворачиваются через `dokploy_webhook` на сервере `main`.
## 7.3 Технологический стек фронтенда
Клиентская часть программного продукта реализуется на следующих технологиях:
- `Nuxt 4` — прикладной веб-фреймворк
- `Vue 3` — библиотека пользовательского интерфейса
- `@nuxtjs/apollo` и `@vue/apollo-composable` — работа с GraphQL
- `GraphQL Code Generator` — генерация типизированных GraphQL-документов
- `Tailwind CSS` и `daisyUI` — базовая стилизация интерфейсов
- `Storybook` — контур изоляционного просмотра компонентов
- `VitePress` — подготовка проектной документации
## 7.4 Технологический стек серверной части
Серверная часть программного продукта реализуется на следующих технологиях:
- `Node.js` — среда выполнения
- `Express 5` — HTTP-сервер
- `Apollo Server 5` — GraphQL-сервер
- `Prisma 7` — доступ к данным и ORM-слой
- `PostgreSQL` — основное хранилище данных
- `Zod` — валидация структур данных в прикладных сценариях
- `Nodemailer` — отправка уведомлений по электронной почте
## 7.5 Архитектура клиентской части
Клиентская часть организована по следующим слоям:
- страницы `app/pages` — входные экранные формы
- компоненты `app/components` — переиспользуемые элементы интерфейса
- composables `app/composables` — клиентская логика и представление данных
- GraphQL-документы `graphql/operations` — отдельные запросы и мутации
- сгенерированная типизированная схема `app/composables/graphql/generated.ts`
- серверные proxy и интеграционные обработчики `server/api`
Ключевые экранные маршруты текущей реализации:
- `/products` и `/products/[slug]` — каталог и карточка товара
- `/cart` — корзина
- `/client-orders` и `/client-orders/[id]` — клиентские заявки и заказы
- `/clients` и `/clients/[id]` — менеджерский контур клиентов
- `/orders` и `/orders/[id]` — менеджерский контур заказов
- `/catalog-settings` — административные настройки каталога
- `/bonus-program`, `/bonus-system/*` — бонусный контур
## 7.6 Карта слоев и компонентов
<NamedMermaidDiagram name="component-map" />
## 7.7 Архитектура серверной части
Серверная часть организована по следующим основным модулям:
- `src/server.js` — инициализация HTTP-сервера и GraphQL-сервера
- `src/schema.graphql` — контракт GraphQL API
- `src/resolvers.js` — реализация GraphQL-операций
- `src/context.js` — построение контекста запроса
- `src/auth.js` — аутентификация и токены доступа
- `src/access.js` — правила авторизации и проверки ролей
- `src/prisma-client.js` — точка подключения Prisma
- `src/messenger*.js`, `src/telegram*.js`, `src/max-mini-app.js` — мессенджерный контур и мини-приложения
## 7.8 Взаимодействие фронтенда и backend
Взаимодействие клиентской и серверной части строится через GraphQL API.
На стороне Nuxt используется серверный proxy-маршрут `/api/graphql`, который:
- принимает запросы браузера
- прокидывает cookie и авторизационные заголовки
- перенаправляет запрос в `apollo-backend`
- возвращает результат в клиентское приложение
Такой подход позволяет:
- изолировать прямой backend endpoint от браузерного клиента
- централизованно передавать авторизационные данные
- поддерживать единый клиентский GraphQL endpoint
## 7.9 Интеграционные и вспомогательные HTTP-точки
Помимо GraphQL API, во фронтенд-контуре реализованы вспомогательные серверные маршруты:
- `/api/graphql` — proxy в backend GraphQL API
- `/api/auth/messenger-start` — запуск сценариев messenger login / connect
- `/api/dadata/address` — подсказки адресов
- `/api/dadata/bank` — подсказки банковских реквизитов
- `/api/dadata/party` — подсказки контрагентов
- `/api/messenger-avatar/[connectionId]` — выдача изображений, связанных с мессенджерными подключениями
## 7.10 Компонентные требования к реализации
Архитектура программного продукта должна сохранять следующие правила:
- экранная логика должна находиться на уровне страниц и composables
- переиспользуемые элементы интерфейса должны быть вынесены в компоненты
- каждый GraphQL-документ должен храниться в отдельном `.graphql` файле
- клиентский код должен использовать сгенерированные типизированные документы
- серверная логика доступа к данным должна проходить через Prisma
- бизнес-правила доступа должны контролироваться серверной частью, а не только интерфейсом
## 7.11 Требования к конфигурации и секретам
Сервисы программного продукта должны получать прикладные секреты из `Vault`.
В конфигурации сервисов допускается хранение только bootstrap-параметров для подключения к Vault. Бизнес-секреты, ключи интеграций и иные чувствительные данные должны загружаться из Vault при старте приложения.
## 7.12 Инфраструктура, деплой и эксплуатационный контур
Текущая инфраструктурная схема проекта включает прикладные сервисы, сервис секретов, мессенджерные сервисы и вспомогательный worker-контур.
<NamedMermaidDiagram name="infrastructure-topology" />
Сервисы проекта и способ их развёртывания:
| Сервис | Путь в репозитории | Роль | Deploy mode | Сервер |
| --- | --- | --- | --- | --- |
| web-frontend | `web-frontend` | клиентский и менеджерский веб-интерфейс | `dokploy_webhook` | `main` |
| apollo-backend | `apollo-backend` | GraphQL API и бизнес-логика | `dokploy_webhook` | `main` |
| hatchet-worker | `hatchet-worker` | фоновый worker-контур | `dokploy_webhook` | `main` |
| tg-bot | `tg-bot` | Telegram-контур | `dokploy_webhook` | `main` |
| max-bot | `max-bot` | MAX-контур | `dokploy_webhook` | `main` |
| bonus-bot | `bonus-bot` | бонусный сервис | `dokploy_webhook` | `main` |
| vault | `vault` | сервис секретов | `dokploy_webhook` | `main` |
Серверная карта текущего проекта:
- сервер `main`
- Tailscale user: `root`
- Tailscale host: `dsrptlab`
Эксплуатационные операции доступа и диагностики выполняются через Tailscale SSH.
## 7.13 Dokploy и цепочка развёртывания
Для основных сервисов проекта используется режим `dokploy_webhook`.
Это означает следующую последовательность:
1. изменения фиксируются в Git-репозитории;
2. изменения публикуются в `main`;
3. Dokploy получает webhook-событие;
4. Dokploy выполняет сборку соответствующего сервиса;
5. сервис перезапускается с загрузкой секретов из Vault;
6. после старта выполняются bootstrap-действия, предусмотренные образом и entrypoint-командой.
Текущие особенности прикладных сервисов:
- `web-frontend` стартует через загрузку Vault env и запуск `.output/server/index.mjs`
- `apollo-backend` стартует через загрузку Vault env, `prisma migrate deploy` и запуск `src/server.js`
- bot-сервисы стартуют через общий паттерн загрузки Vault env и запуск `node src/server.js`
## 7.14 Vault и хранение секретов
Сервис `vault` развернут как отдельное приложение на базе образа `hashicorp/vault:1.21.3`.
Текущие инфраструктурные правила работы Vault:
- используется `raft` storage
- данные Vault сохраняются в `/vault/data`
- конфигурация сервиса хранится в `vault/config/vault.hcl`
- при старте выполняется проверка и, при необходимости, автоматический unseal из переменных окружения
- прикладные сервисы подключаются к Vault через bootstrap-переменные `VAULT_ADDR`, `VAULT_TOKEN`, `VAULT_KV_MOUNT`, `VAULT_SHARED_PATH`, `VAULT_PROJECT_PATH`, `VAULT_ENABLED`
Прикладные сервисы используют общий shell-bootstrap `load-vault-env.sh`, который:
- ожидает доступность Vault по health endpoint
- загружает shared secrets
- загружает project secrets
- экспортирует секреты в runtime environment процесса
## 7.15 Структура сервисных каталогов
Текущая сервисная структура репозитория:
- `web-frontend` — Nuxt-приложение, GraphQL operations, VitePress-документация
- `apollo-backend` — Apollo Server, Prisma schema, миграции, импорт каталога
- `tg-bot` — Telegram-сервис
- `max-bot` — MAX-сервис
- `bonus-bot` — бонусный сервис
- `hatchet-worker` — worker-контур
- `vault` — Dockerfile, конфигурация и entrypoint Vault
- `hatchet` — docker-compose инфраструктурного контура Hatchet
## 7.16 Контур фоновых процессов
В проекте присутствует отдельный контур фонового исполнения задач:
- `hatchet-worker` как прикладной worker
- `hatchet-engine` как движок исполнения
- `hatchet-dashboard` как интерфейс мониторинга
- отдельный `postgres` для Hatchet-контура
Конфигурация этого контура находится в `hatchet/docker-compose.yml`.
## 7.17 Зафиксированные runtime-версии и технологические зависимости
### Базовые runtime и контейнерные образы
| Компонент | Текущая версия |
| --- | --- |
| Node base image для web/backend/bots | `node:22-bookworm-slim` |
| Vault image | `hashicorp/vault:1.21.3` |
| Hatchet Postgres | `postgres:15.6` |
| Nuxt | `4.4.2` |
| Vue | `3.5.30` |
| Apollo Server | `5.5.0` |
| Prisma / Prisma Client | `7.6.0` |
| Mermaid | `11.14.0` |
| VitePress | `1.6.4` |
### Основные зависимости фронтенда
| Библиотека | Версия | Назначение |
| --- | --- | --- |
| `@nuxtjs/apollo` | `5.0.0-alpha.16` | GraphQL-клиентский слой |
| `@vue/apollo-composable` | `4.2.2` | composable API для GraphQL |
| `@apollo/client` | `3.14.1` | Apollo client runtime |
| `@nuxt/eslint` | `1.15.2` | linting Nuxt-проекта |
| `@nuxtjs/tailwindcss` | `6.14.0` | Tailwind integration |
| `daisyui` | `5.5.19` | UI primitives |
| `graphql` | `16.13.2` | GraphQL runtime |
| `@sentry/vue` | `10.46.0` | error tracking |
| `storybook` | `8.6.14` | UI component review |
### Основные зависимости backend
| Библиотека | Версия | Назначение |
| --- | --- | --- |
| `@apollo/server` | `5.5.0` | GraphQL server |
| `@as-integrations/express5` | `1.1.2` | Apollo + Express integration |
| `express` | `5.2.1` | HTTP server |
| `@prisma/client` | `7.6.0` | data access |
| `@prisma/adapter-pg` | `7.6.0` | Prisma adapter |
| `pg` | `8.20.0` | PostgreSQL driver |
| `graphql` | `16.13.2` | GraphQL runtime |
| `zod` | `4.3.6` | validation |
| `nodemailer` | `8.0.4` | email notifications |
| `dotenv` | `17.3.1` | env bootstrap in local/runtime layers |
## 7.18 Технические конфигурационные файлы
Ключевые технические файлы текущей реализации:
- `deploy-map.toml` — карта сервисов, deploy mode и серверов
- `web-frontend/nuxt.config.ts` — конфигурация Nuxt и Apollo
- `web-frontend/codegen.ts` — конфигурация GraphQL codegen
- `apollo-backend/prisma.config.ts` — конфигурация Prisma
- `apollo-backend/prisma/schema.prisma` — модель данных
- `web-frontend/scripts/load-vault-env.sh` — Vault bootstrap frontend
- `apollo-backend/scripts/load-vault-env.sh` — Vault bootstrap backend
- `vault/config/vault.hcl` — конфигурация Vault
- `vault/entrypoint.sh` — startup/unseal логика Vault