Архитектурный обзор
Текущий стек
- 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.