Segmenta — это монорепозиторий на базе pnpm workspaces и Turborepo. Весь код разделён на приложения (apps/), общие пакеты (packages/) и модули (modules/).
Корневая структура
segmenta/
├── apps/
│ ├── client/ # Next.js фронтенд
│ └── server/ # NestJS бэкенд
├── packages/
│ ├── database/ # Drizzle ORM, схемы, миграции
│ ├── trpc/ # tRPC роутеры и контекст
│ ├── env/ # Переменные окружения (.env)
│ ├── logger/ # Логгер
│ ├── analytics/ # Аналитика (ClickHouse)
│ └── utils/ # Общие утилиты
├── modules/
│ ├── core/ # Ядро модульной системы
│ ├── forum/ # Модуль форума
│ ├── referrals/ # Модуль рефералов
│ └── scripts/ # Скрипты генерации модулей
├── installer/ # Установщики (bash, PowerShell)
├── docker-compose.yml # ClickHouse для аналитики
├── pnpm-workspace.yaml # Конфигурация воркспейсов
└── turbo.json # Конфигурация Turborepo
Приложения (apps/)
Клиент (apps/client/)
Фронтенд на Next.js 16 с React 19. Использует App Router.
| Папка | Назначение |
|---|
src/app/ | Страницы (App Router): главная, профиль, магазин, админка и др. |
src/app/admin/ | Админ-панель |
src/app/auth/ | Страницы авторизации |
src/app/profile/ | Профиль пользователя |
src/app/shop/ | Магазин |
src/app/servers/ | Серверы |
src/components/ | Переиспользуемые React-компоненты |
src/components/ui/ | UI-компоненты (кнопки, модалки, инпуты и т.д.) |
src/lib/ | Утилиты, хуки, константы |
src/lib/hooks/ | React-хуки |
src/providers/ | Провайдеры (tRPC, Auth, Theme, Modules и др.) |
Клиент использует Zustand для управления состоянием и Framer Motion для анимаций. Стилизация — TailwindCSS с поддержкой тёмной темы.
Сервер (apps/server/)
Бэкенд на NestJS 10, запускается через Bun.
| Папка | Назначение |
|---|
src/main.ts | Точка входа, запуск NestJS + tRPC |
src/app.module.ts | Корневой модуль NestJS |
src/trpc/ | Интеграция tRPC с NestJS |
src/connections/ | OAuth-подключения (Discord, VK, Telegram и др.) |
src/verification/ | Система верификации пользователей |
src/payments/ | Платёжная система |
src/launcher/ | Интеграция с GravitLauncher |
src/storage/ | S3-совместимое хранилище файлов |
src/avatar/ | Генерация и загрузка аватаров |
src/analytics/ | Сервис аналитики |
src/notifications/ | Многоканальные уведомления (WebSocket, Email, Telegram, Discord, Push) |
src/rcon/ | RCON-подключение к Minecraft серверам |
src/server-query/ | Запросы статуса Minecraft серверов |
src/server-bots/ | Discord-боты со статусом серверов |
src/settings/ | Настройки сайта |
src/permissions/ | Синхронизация прав с LuckPerms |
src/punishments/ | Наказания (баны, муты), интеграция с LiteBans |
src/votes/ | Голосования за сервер (mctop, topcraft, minecraftrating) |
src/users-assets/ | Скины, плащи и аватары игроков |
src/maintenance/ | Режим технического обслуживания |
src/security/ | Security-заголовки (middleware) |
Сервер использует NestJS-модули для организации кода. Каждый сервис регистрируется в AppModule и прокидывается в tRPC-контекст через dependency injection.
Общие пакеты (packages/)
@segmenta/trpc
Главный пакет API. Содержит все tRPC-роутеры и контекст.
| Файл | Назначение |
|---|
src/trpc.ts | Инициализация tRPC, определение процедур (publicProcedure, protectedProcedure, moderatorProcedure, adminProcedure) |
src/context.ts | Создание контекста запроса (пользователь, сервисы, БД) |
src/service-middleware.ts | Типизированное внедрение сервисов в контекст (withRconService, withPaymentsService и др.) |
src/routers/index.ts | Корневой роутер — объединяет все подроутеры |
src/routers/auth.ts | Авторизация, регистрация, OAuth |
src/routers/users.ts | Управление пользователями |
src/routers/servers.ts | Серверы Minecraft |
src/routers/shop.ts | Магазин |
src/routers/tickets.ts | Тикеты поддержки |
src/routers/modules.ts | Динамические роутеры модулей |
src/routers/admin/ | Админ-роутеры: stats, players, servers, settings, updates и др. |
@segmenta/database
Работа с базой данных через Drizzle ORM.
| Файл | Назначение |
|---|
src/schema/ | Схемы таблиц (users, sessions, servers, shop и др.) |
src/client.ts | Подключение к БД, функции withDatabase и withTransaction |
src/utils/ | Утилиты: пароли, настройки, права доступа, логи |
src/seed.ts | Сидинг начальных данных |
@segmenta/env
Централизованное управление переменными окружения через @t3-oss/env-nextjs и Zod-валидацию.
Файл .env хранится в packages/env/.env и автоматически подтягивается из любого пакета.
@segmenta/logger
Логгер для серверной части.
@segmenta/analytics
Интеграция с ClickHouse для сбора аналитики (просмотры страниц, сессии, события).
Модули (modules/)
Модульная система позволяет расширять функциональность без изменения ядра. Каждый модуль — отдельная папка с серверной и клиентской частью.
| Папка | Назначение |
|---|
modules/core/ | Ядро: типы, реестр, хуки, клиентский реестр |
modules/forum/ | Модуль форума |
modules/referrals/ | Модуль реферальной системы |
modules/scripts/ | Скрипт generate-imports.ts для автогенерации |
Как всё связано
Клиент (Next.js)
│
│ tRPC-клиент (@trpc/react-query)
▼
Сервер (NestJS)
│
│ tRPC-роутеры (@segmenta/trpc)
│ Контекст: user, services, withDatabase
▼
База данных (Drizzle ORM)
│
│ MySQL / PostgreSQL
▼
Модули (modules/)
│
│ Роутеры, схемы, хуки
▼
Внешние сервисы
├── S3 (хранилище файлов)
├── ClickHouse (аналитика)
├── RCON (Minecraft серверы)
└── OAuth (Discord, VK, Telegram, Google, Yandex)
Клиент общается с сервером исключительно через tRPC. Все вызовы типобезопасны — типы автоматически выводятся из роутеров на сервере и доступны на клиенте без кодогенерации.