Архитектурный обзор

Как устроен текущий CUBIX target и где размещать новые изменения.

Текущий стек

  • Nuxt 4 и Vue 3 с TypeScript.
  • Nuxt UI и Tailwind CSS v4 для новых интерфейсов.
  • Nuxt Server API routes для серверной логики.
  • Prisma и PostgreSQL для хранения данных.
  • nuxt-auth-utils для пользовательских сессий.
  • Nuxt Content для этой документации.

Изолированные экземпляры

CUBIX разворачивается как isolated instance: приложение и база данных клиента отделены от других клиентов. Конфигурация экземпляра задаётся окружением и сервером, поэтому браузер не выбирает базу, экземпляр или границу доступа.

Правила изоляции:

  • проверяй сессию на сервере;
  • не принимай tenantId, подключение к БД или instance identifier из body/query;
  • фильтруй ресурсы по серверному контексту и текущей Prisma-схеме;
  • не смешивай данные между экземплярами;
  • не добавляй tenant-фильтр к модели, где такого поля нет.

Слои приложения

app/pages/                 маршруты и композиция экранов
app/components/            прикладные Vue-компоненты модулей
app/@core/components/      переиспользуемые CS UI-компоненты
app/composables/           клиентская бизнес-логика и состояние
app/layouts/               каркас страниц
server/api/                HTTP endpoints
server/services/           общая серверная бизнес-логика
server/utils/              Prisma, auth и серверные helpers
prisma/                    схема и миграции базы данных
content/                   документация и контент Nuxt Content

Страница отвечает за композицию экрана. Повторяемый UI размещается в CS UI или прикладном компоненте, а общий поток данных и обработчики выносятся в composable или service.

Поток защищённого запроса

браузер
  -> Nuxt page/composable
  -> server/api endpoint
  -> requireUserSession(event)
  -> getCurrentUserId(event)
  -> Zod validation
  -> permission/resource check
  -> Prisma
  -> typed response

Сервер является границей доверия. Проверки в интерфейсе нужны для удобства пользователя, но не заменяют проверки endpoint.

UI-слой

Новые страницы используют Nuxt UI и существующие CS*-обёртки. Перед созданием компонента проверь локальную библиотеку app/@core/components/CS-UI/ и публичные exports @cs-platform/ui-kit. Не копируй компоненты из внешнего пакета и не импортируй его внутренние файлы по абсолютному пути.

Для формы или drawer обязательны состояния загрузки, валидации, ошибки сервера и сохранения. Успешное сохранение должно завершаться обновлением зависимого списка; ошибка не должна закрывать форму.

Модульность

CRM, задачи, календарь и организационные разделы развиваются как отдельные прикладные области, но используют общие auth, Prisma, уведомления и UI-слои. При добавлении функции сначала найди существующий endpoint, composable или компонент в соответствующей области и сохрани его публичный контракт.

Deployment-модель

Один клиент = один экземпляр приложения и отдельная PostgreSQL-база. Домен маршрутизируется на нужный экземпляр, а DATABASE_URL задаётся только серверным окружением. Приложение и PostgreSQL являются отдельными сервисами; база не публикуется в Интернет.

Локально Nuxt запускается напрямую на Windows, а PostgreSQL может работать отдельным инфраструктурным контейнером. Production собирается на Linux и запускается из .output/server/index.mjs за HTTPS reverse proxy.

Правила изменений

  • Сначала проверь существующий компонент, composable, endpoint и Prisma relation.
  • Не дублируй CS UI или package exports в прикладном модуле.
  • Не смешивай UI, авторизацию и Prisma-запросы в одном переиспользуемом компоненте.
  • Для критичных операций сохраняй actor/source и изменения в audit trail.

Built with Nuxt UI • © 2026