16 KiB
7. Техническая архитектура, стек и состав компонентов
7.1 Общая архитектурная схема
Программный продукт реализуется по клиент-серверной модели и включает веб-клиент, сервер бизнес-логики, базу данных, модуль интеграции и вспомогательные сервисы уведомлений.
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— работа с GraphQLGraphQL 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 Карта слоев и компонентов
7.7 Архитектура серверной части
Серверная часть организована по следующим основным модулям:
src/server.js— инициализация HTTP-сервера и GraphQL-сервераsrc/schema.graphql— контракт GraphQL APIsrc/resolvers.js— реализация GraphQL-операцийsrc/context.js— построение контекста запросаsrc/auth.js— аутентификация и токены доступаsrc/access.js— правила авторизации и проверки ролейsrc/prisma-client.js— точка подключения Prismasrc/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-контур.
Сервисы проекта и способ их развёртывания:
| Сервис | Путь в репозитории | Роль | 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.
Это означает следующую последовательность:
- изменения фиксируются в Git-репозитории;
- изменения публикуются в
main; - Dokploy получает webhook-событие;
- Dokploy выполняет сборку соответствующего сервиса;
- сервис перезапускается с загрузкой секретов из Vault;
- после старта выполняются bootstrap-действия, предусмотренные образом и entrypoint-командой.
Текущие особенности прикладных сервисов:
web-frontendстартует через загрузку Vault env и запуск.output/server/index.mjsapollo-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:
- используется
raftstorage - данные 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 Vaulthatchet— docker-compose инфраструктурного контура Hatchet
7.16 Контур фоновых процессов
В проекте присутствует отдельный контур фонового исполнения задач:
hatchet-workerкак прикладной workerhatchet-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 и Apolloweb-frontend/codegen.ts— конфигурация GraphQL codegenapollo-backend/prisma.config.ts— конфигурация Prismaapollo-backend/prisma/schema.prisma— модель данныхweb-frontend/scripts/load-vault-env.sh— Vault bootstrap frontendapollo-backend/scripts/load-vault-env.sh— Vault bootstrap backendvault/config/vault.hcl— конфигурация Vaultvault/entrypoint.sh— startup/unseal логика Vault