# ТЕХНОЛОГИЧЕСКИЙ СТЕК SFERA ## 🎯 ОБЗОР АРХИТЕКТУРЫ SFERA - это современное B2B веб-приложение, построенное на основе full-stack TypeScript стека с акцентом на производительность, типобезопасность и масштабируемость. Система использует Next.js 15 для серверного рендеринга, GraphQL для API, PostgreSQL для данных и современные UI-библиотеки для интерфейса. ## 🏗️ ОСНОВНОЙ СТЕК ### Frontend ```json { "framework": "Next.js 15.4.1", "runtime": "React 19.1.0", "language": "TypeScript 5", "styling": "Tailwind CSS 4", "ui_library": "Radix UI", "state_management": "Apollo Client + React Hooks", "bundler": "Next.js (Turbopack в dev)", "icons": "Lucide React" } ``` ### Backend ```json { "framework": "Next.js API Routes", "api_layer": "GraphQL (Apollo Server 4.12.2)", "database_client": "Prisma ORM 6.12.0", "database": "PostgreSQL", "authentication": "JWT (jsonwebtoken)", "file_upload": "AWS S3 SDK", "sms_service": "SMS Aero API", "data_validation": "DaData API" } ``` ### DevOps & Deployment ```json { "containerization": "Docker", "orchestration": "Docker Compose", "code_quality": "ESLint 9 + Prettier", "git_hooks": "Husky + lint-staged", "build_optimization": "Next.js Standalone Output" } ``` ## 📦 ДЕТАЛЬНЫЙ АНАЛИЗ ЗАВИСИМОСТЕЙ ### Core Framework (Next.js 15 + React 19) ```typescript // next.config.ts - Production-ready конфигурация const nextConfig: NextConfig = { output: 'standalone', // Оптимизированная сборка для Docker eslint: { ignoreDuringBuilds: false, // Строгая проверка в production dirs: ['src'], }, typescript: { ignoreBuildErrors: false, // Полная проверка типов }, images: { remotePatterns: [ { protocol: 'https', hostname: 's3.twcstorage.ru', // S3-совместимое хранилище pathname: '/**', }, ], }, experimental: { optimizePackageImports: ['lucide-react'], // Tree-shaking оптимизация }, } ``` **Преимущества выбора:** - **App Router**: Современная архитектура маршрутизации Next.js 15 - **Server Components**: Серверный рендеринг для улучшения производительности - **Turbopack**: Ускоренная сборка в dev-режиме - **React 19**: Новейшие возможности Concurrent Features ### GraphQL API Stack ```typescript // Apollo Server конфигурация const server = new ApolloServer({ typeDefs, // GraphQL схемы resolvers, // Резолверы запросов plugins: [ { requestDidStart() { return { didResolveOperation(requestContext) { // Логирование всех GraphQL запросов console.warn('🌐 GraphQL REQUEST:', { operationType: operation.operation, operationName: requestContext.request.operationName, timestamp: new Date().toISOString(), }) }, } }, }, ], }) // Apollo Client конфигурация с кэшированием export const apolloClient = new ApolloClient({ link: from([authLink, httpLink]), cache: new InMemoryCache({ typePolicies: { User: { fields: { organization: { merge: true }, // Умное слияние данных }, }, Organization: { fields: { apiKeys: { merge: false }, // Замена массива целиком }, }, }, }), defaultOptions: { watchQuery: { errorPolicy: 'all' }, // Показ частичных данных при ошибках query: { errorPolicy: 'all' }, }, }) ``` **Архитектурные решения:** - **Type-First подход**: GraphQL схемы как источник истины - **Context-based аутентификация**: JWT токены в заголовках - **Intelligent Caching**: Настроенные политики кэширования - **Error Handling**: Graceful degradation при частичных ошибках ### Database Layer (Prisma + PostgreSQL) ```typescript // prisma/schema.prisma - Основные модели generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // Пример сложной модели с индексами model Organization { id String @id @default(cuid()) inn String @unique type OrganizationType // FULFILLMENT | SELLER | LOGIST | WHOLESALE // Связи с другими сущностями users User[] products Product[] messages Message[] @relation("SentMessages") supplyOrders SupplyOrder[] // Индексы для производительности @@index([referralCode]) @@index([referredById]) } // Prisma Client инициализация export const prisma = globalThis.prisma || new PrismaClient() if (process.env.NODE_ENV !== 'production') { globalThis.prisma = prisma // Повторное использование в dev } ``` **База данных и ORM:** - **PostgreSQL**: Надежная реляционная СУБД - **Prisma ORM**: Type-safe доступ к данным - **CUID**: Collision-resistant уникальные идентификаторы - **Составные индексы**: Оптимизация сложных запросов - **Connection Pooling**: Эффективное управление соединениями ### UI/UX Stack ```typescript // Radix UI + Tailwind CSS компоненты export const Button = React.forwardRef( ({ className, variant, size, asChild = false, ...props }, ref) => { const Comp = asChild ? Slot : "button" return ( ) } ) // Class Variance Authority для типизированных вариантов const buttonVariants = cva( "inline-flex items-center justify-center rounded-md text-sm font-medium", { variants: { variant: { default: "bg-primary text-primary-foreground hover:bg-primary/90", destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", outline: "border border-input bg-background hover:bg-accent" }, size: { default: "h-10 px-4 py-2", sm: "h-9 rounded-md px-3", lg: "h-11 rounded-md px-8", icon: "h-10 w-10" } }, defaultVariants: { variant: "default", size: "default" } } ) ``` **UI Библиотеки:** - **Radix UI**: Headless компоненты с accessibility - **Tailwind CSS 4**: Utility-first стилизация - **Class Variance Authority**: Типизированные варианты компонентов - **Lucide React**: 1000+ SVG иконок с tree-shaking - **React Resizable Panels**: Панели с изменяемыми размерами - **Sonner**: Современные toast уведомления ### TypeScript Configuration ```json // tsconfig.json - Строгая типизация { "compilerOptions": { "target": "ES2017", "lib": ["dom", "dom.iterable", "esnext"], "strict": true, // Включаем все строгие проверки "noEmit": true, // Только проверка типов, сборка через Next.js "module": "esnext", "moduleResolution": "bundler", // Новая стратегия разрешения модулей "paths": { "@/*": ["./src/*"] // Absolute imports } } } ``` **TypeScript Features:** - **Strict Mode**: Максимальная типобезопасность - **Path Mapping**: Absolute imports для чистоты кода - **Bundler Resolution**: Совместимость с современными bundler'ами - **GraphQL Codegen**: Автогенерация типов из схем (планируется) ## 🔧 ИНТЕГРАЦИИ И СЕРВИСЫ ### External APIs ```typescript // SMS Service Integration const SMS_CONFIG = { provider: 'SMS Aero', api_url: 'https://gate.smsaero.ru/v2', features: ['send', 'status', 'balance'], dev_mode: process.env.SMS_DEV_MODE === 'true', // Mock в разработке } // Data Validation Service const DADATA_CONFIG = { provider: 'DaData', api_url: 'https://suggestions.dadata.ru/suggestions/api/4_1/rs', features: ['inn_validation', 'address_suggestions', 'company_info'], } // Marketplace APIs const MARKETPLACE_APIS = { wildberries: { api_url: process.env.WILDBERRIES_API_URL, features: ['products', 'orders', 'analytics', 'returns'], }, ozon: { api_url: process.env.OZON_API_URL, features: ['products', 'orders', 'analytics'], }, } ``` ### File Storage (S3-Compatible) ```typescript // AWS S3 SDK конфигурация import { S3Client } from '@aws-sdk/client-s3' const s3Client = new S3Client({ region: 'ru-central1', endpoint: 'https://s3.twcstorage.ru', credentials: { accessKeyId: process.env.S3_ACCESS_KEY, secretAccessKey: process.env.S3_SECRET_KEY, }, }) // Типизированная загрузка файлов interface FileUploadOptions { bucket: string key: string file: File | Buffer contentType?: string metadata?: Record } ``` ## 🐳 DEPLOYMENT & CONTAINERIZATION ### Docker Multi-Stage Build ```dockerfile # Оптимизированный Dockerfile FROM node:18-alpine AS base # Зависимости FROM base AS deps WORKDIR /app COPY package.json package-lock.json* ./ RUN npm ci # Сборка FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . # Build-time переменные окружения ARG DATABASE_URL ARG JWT_SECRET ENV DATABASE_URL=$DATABASE_URL ENV JWT_SECRET=$JWT_SECRET ENV NODE_ENV=production # Генерация Prisma Client и сборка RUN npx prisma generate RUN npm run build RUN npm prune --production # Production образ FROM base AS runner WORKDIR /app ENV NODE_ENV=production # Standalone output для минимального размера COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma EXPOSE 3000 CMD ["node", "server.js"] ``` **Containerization преимущества:** - **Multi-stage build**: Минимальный размер production образа - **Standalone output**: Next.js оптимизация для контейнеров - **Alpine Linux**: Безопасный и легкий базовый образ - **Non-root user**: Повышенная безопасность контейнера - **Health checks**: Мониторинг состояния приложения ### Environment Management ```bash # .env - Production переменные DATABASE_URL="postgresql://user:pass@host:5432/db" # SMS сервис SMS_AERO_EMAIL="company@domain.ru" SMS_AERO_API_KEY="secret_key" SMS_DEV_MODE="false" # Внешние API DADATA_API_KEY="secret_key" WILDBERRIES_API_KEY="secret_key" # Security JWT_SECRET="complex_jwt_secret_key" # Storage S3_ACCESS_KEY="access_key" S3_SECRET_KEY="secret_key" ``` ## ⚡ ПРОИЗВОДИТЕЛЬНОСТЬ И ОПТИМИЗАЦИИ ### Build Optimizations ```json // package.json - Scripts для production { "scripts": { "dev": "next dev --turbopack", // Turbopack в разработке "build": "next build", // Optimized production build "start": "next start", // Production server "lint": "next lint", // ESLint проверка "lint:fix": "next lint --fix", // Автоисправление "db:reset": "npx prisma db push --force-reset && npm run db:seed" } } ``` ### Code Quality Tools ```json // ESLint + Prettier конфигурация { "lint-staged": { "src/**/*.{js,jsx,ts,tsx,json,css,md}": ["prettier --write", "eslint --fix"] }, "husky": { "hooks": { "pre-commit": "lint-staged", "pre-push": "npm run typecheck" } } } ``` **Performance Features:** - **Tree Shaking**: Исключение неиспользуемого кода - **Code Splitting**: Автоматическое разделение бандлов - **Image Optimization**: Next.js Image компонент - **Bundle Analysis**: webpack-bundle-analyzer интеграция - **Caching Strategy**: Многоуровневое кэширование (Browser, CDN, Database) ## 📊 МОНИТОРИНГ И АНАЛИТИКА ### Logging & Debugging ```typescript // Структурированное логирование GraphQL plugins: [ { requestDidStart() { return { didResolveOperation(requestContext) { console.warn('🌐 GraphQL REQUEST:', { operationType: operation.operation, operationName: requestContext.request.operationName, timestamp: new Date().toISOString(), variables: requestContext.request.variables, }) }, didEncounterErrors(requestContext) { console.error('❌ GraphQL ERROR:', { errors: requestContext.errors?.map((e) => e.message), operationName: requestContext.request.operationName, }) }, } }, }, ] ``` ### Error Handling Strategy ```typescript // Apollo Client error handling defaultOptions: { watchQuery: { errorPolicy: 'all' // Показ частичных данных при ошибках }, query: { errorPolicy: 'all' // Graceful degradation } } // Global error boundary в React class ErrorBoundary extends React.Component { componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { // Логирование в внешний сервис (Sentry, LogRocket) console.error('React Error Boundary:', error, errorInfo) } } ``` ## 🔒 БЕЗОПАСНОСТЬ ### Authentication & Authorization ```typescript // JWT-based authentication const authLink = setContext((operation, { headers }) => { const adminToken = localStorage.getItem('adminAuthToken') const userToken = localStorage.getItem('authToken') const token = adminToken || userToken // Приоритет админскому токену return { headers: { ...headers, authorization: token ? `Bearer ${token}` : '', }, } }) // Context-based authorization в GraphQL const resolvers = { Query: { protectedData: async (parent, args, context) => { if (!context.user) { throw new GraphQLError('Unauthorized') } // Логика авторизации... }, }, } ``` **Security Measures:** - **JWT Authentication**: Stateless токены с истечением - **Role-based Access Control**: Разграничение прав доступа - **Input Validation**: Валидация на уровне GraphQL и Prisma - **HTTPS Only**: Принудительное использование зашифрованного соединения - **CORS Configuration**: Настроенная политика cross-origin запросов ## 🚀 МАСШТАБИРУЕМОСТЬ ### Database Optimizations ```prisma // Индексы для производительности model Message { // Композитные индексы для сложных запросов @@index([senderOrganizationId, receiverOrganizationId, createdAt]) @@index([receiverOrganizationId, isRead]) } model Organization { // Индексы для реферальной системы @@index([referralCode]) @@index([referredById]) } ``` ### Caching Strategy ```typescript // Apollo Client кэширование cache: new InMemoryCache({ typePolicies: { Organization: { fields: { apiKeys: { merge: false }, // Полная замена при обновлении }, }, User: { fields: { organization: { merge: true }, // Умное слияние объектов }, }, }, }) ``` **Scalability Features:** - **Connection Pooling**: Эффективное использование БД соединений - **Query Optimization**: Составные индексы для частых запросов - **Selective Data Fetching**: GraphQL field selection - **Lazy Loading**: Загрузка компонентов по требованию - **Horizontal Scaling**: Готовность к микросервисной архитектуре ## 📱 PROGRESSIVE WEB APP ### PWA Features (Planned) ```json // Будущие возможности PWA { "service_worker": "Кэширование ресурсов офлайн", "web_manifest": "Установка как native app", "push_notifications": "Уведомления о новых заказах", "background_sync": "Синхронизация при восстановлении связи" } ``` ## 🎯 MIGRATION STRATEGY ### Technology Evolution Path ```typescript // Планируемые улучшения const TECH_ROADMAP = { Q2_2024: [ 'GraphQL Codegen для автогенерации типов', 'React Query для server state управления', 'Storybook для документации компонентов', ], Q3_2024: ['Micro-frontends архитектура', 'Server-Sent Events для real-time', 'Advanced caching с Redis'], Q4_2024: ['Kubernetes deployment', 'Advanced monitoring с Prometheus', 'A/B testing framework'], } ``` --- _Технологический стек обновлен на основе анализа package.json, конфигурационных файлов и архитектуры_ _Версия документа: 2025-08-21_ _Next.js 15.4.1 • React 19.1.0 • TypeScript 5 • Prisma 6.12.0 • Apollo Server 4.12.2_