From 4790609e92ac56dd98841757d0e0445172ebae3d Mon Sep 17 00:00:00 2001 From: DosAi Date: Sun, 2 Nov 2025 16:37:55 +0300 Subject: [PATCH] Initial commit: Next.js + Node.js template --- .cursorrules | 105 ++++++++++++++ .gitignore | 49 +++++++ README.md | 146 ++++++++++++++++++++ SETUP.md | 72 ++++++++++ backend/package.json | 19 +++ backend/routes/.gitkeep | 6 + backend/server.js | 43 ++++++ docs/CHANGELOG.md | 29 ++++ docs/KNOWLEDGE_BASE.md | 260 +++++++++++++++++++++++++++++++++++ docs/PROJECT_RULES.md | 210 ++++++++++++++++++++++++++++ ecosystem.config.js | 26 ++++ frontend/app/globals.css | 2 + frontend/app/layout.tsx | 35 +++++ frontend/app/page.tsx | 24 ++++ frontend/components/.gitkeep | 4 + frontend/docs/.gitkeep | 4 + frontend/eslint.config.mjs | 17 +++ frontend/lib/api.ts | 50 +++++++ frontend/lib/types.ts | 11 ++ frontend/next.config.ts | 11 ++ frontend/package.json | 28 ++++ frontend/postcss.config.mjs | 9 ++ frontend/tsconfig.json | 28 ++++ structure.txt | Bin 0 -> 1276 bytes 24 files changed, 1188 insertions(+) create mode 100644 .cursorrules create mode 100644 .gitignore create mode 100644 README.md create mode 100644 SETUP.md create mode 100644 backend/package.json create mode 100644 backend/routes/.gitkeep create mode 100644 backend/server.js create mode 100644 docs/CHANGELOG.md create mode 100644 docs/KNOWLEDGE_BASE.md create mode 100644 docs/PROJECT_RULES.md create mode 100644 ecosystem.config.js create mode 100644 frontend/app/globals.css create mode 100644 frontend/app/layout.tsx create mode 100644 frontend/app/page.tsx create mode 100644 frontend/components/.gitkeep create mode 100644 frontend/docs/.gitkeep create mode 100644 frontend/eslint.config.mjs create mode 100644 frontend/lib/api.ts create mode 100644 frontend/lib/types.ts create mode 100644 frontend/next.config.ts create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.mjs create mode 100644 frontend/tsconfig.json create mode 100644 structure.txt diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..71f0a5e --- /dev/null +++ b/.cursorrules @@ -0,0 +1,105 @@ +# Правила разработки проекта + +## Общая информация + +Это шаблон проекта для быстрого старта с Next.js фронтендом и Express.js бэкендом. + +### Архитектура + +Проект состоит из двух частей: +- **Frontend**: Next.js приложение с App Router +- **Backend**: Express.js сервер + +### Ключевые компоненты + +- **Frontend**: Next.js 15 с TypeScript и Tailwind CSS +- **Backend**: Express.js сервер +- **Статический экспорт**: Frontend собирается в статические файлы + +### Технологический стек + +**Frontend:** +- Next.js 15.3.3 (App Router) +- React 19 +- TypeScript 5 +- Tailwind CSS 4 +- ESLint + +**Backend:** +- Express.js 5 +- TypeScript (опционально) + +### Важные правила кодирования + +1. **Всегда используй TypeScript типы** - не используй `any`, используй строгую типизацию +2. **Модульность** - структурируй код по модулям +3. **Обработка ошибок** - все API запросы должны обрабатывать ошибки +4. **ESLint** - код должен проходить линтер без ошибок (особенно важно для production build) + +### Структура проекта + +``` +frontend/ + app/ # Next.js App Router страницы + components/ # React компоненты + lib/ # Утилиты и типы + docs/ # Документация + +backend/ + server.js # Основной файл сервера + routes/ # API маршруты (создавать по мере необходимости) + +docs/ # Документация проекта +``` + +### API Endpoints + +**Backend:** +- Настраиваются в `backend/server.js` +- Рекомендуется создавать отдельные файлы в `backend/routes/` + +**Frontend:** +- API URL определяется автоматически: localhost для разработки, продакшн для деплоя + +### Деплой + +Проект деплоится на сервер через: +1. `git pull` на сервере +2. `npm run build` в папке frontend +3. `pm2 restart` для перезапуска процессов + +### Файлы и пути + +- Документация: `docs/` (корень проекта) +- Компоненты: `frontend/components/` +- Утилиты: `frontend/lib/` +- Бэкенд: `backend/server.js` + +### Git Workflow + +**Стандартный процесс разработки:** +1. Все изменения разрабатываются в ветке `dev` +2. Тестирование на сервере происходит из `dev` +3. После проверки `dev` мержится в `main` +4. Используй `--no-ff` при слиянии для сохранения истории + +**Перед слиянием в main обязательно:** +- Протестировать на сервере +- Проверить линтер и сборку +- Убедиться что всё работает + +Подробнее: `docs/PROJECT_RULES.md` + +### Окружение разработки + +**Платформы:** +- Разработка: Windows + PowerShell +- Хостинг: Ubuntu Linux + +**Важно для разработки:** +- В PowerShell используй `;` вместо `&&` для цепочки команд +- Пути в Git всегда с `/`, даже на Windows +- При работе через SSH используй Linux команды + +Подробнее: `docs/PROJECT_RULES.md` и `docs/KNOWLEDGE_BASE.md` + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c744dc7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# Dependencies +node_modules/ +/.pnp +.pnp.js + +# Testing +/coverage + +# Next.js +/.next/ +/out/ +next-env.d.ts +*.tsbuildinfo + +# Production +/build +/dist + +# Misc +.DS_Store +*.pem + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Local env files +.env*.local +.env + +# Vercel +.vercel + +# TypeScript +*.tsbuildinfo +next-env.d.ts + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +Thumbs.db +.DS_Store + diff --git a/README.md b/README.md new file mode 100644 index 0000000..65dc41d --- /dev/null +++ b/README.md @@ -0,0 +1,146 @@ +# Next.js + Node.js Backend Template + +Готовый шаблон для быстрого старта проектов с Next.js фронтендом и Express.js бэкендом. + +## 🚀 Возможности + +- **Next.js 15** с App Router (статический экспорт) +- **Express.js** бэкенд +- **TypeScript** полная поддержка +- **Tailwind CSS 4** для стилизации +- **ESLint** настроенный +- **Модульная архитектура** готовая к расширению +- **Документация** и правила разработки + +## 📁 Структура проекта + +``` +NextNodeTemplate/ +├── frontend/ # Next.js приложение +│ ├── app/ # App Router страницы +│ ├── components/ # React компоненты +│ ├── lib/ # Утилиты и типы +│ └── docs/ # Документация фронтенда +├── backend/ # Express.js сервер +│ └── server.js # Основной файл сервера +├── docs/ # Документация проекта +│ ├── PROJECT_RULES.md # Правила разработки +│ ├── KNOWLEDGE_BASE.md # База знаний +│ └── CHANGELOG.md # История изменений +├── .cursorrules # Правила для AI-ассистента +└── README.md # Этот файл +``` + +## 🛠️ Технологический стек + +**Frontend:** +- Next.js 15.3.3 (App Router) +- React 19 +- TypeScript 5 +- Tailwind CSS 4 + +**Backend:** +- Express.js 5 +- TypeScript (опционально) + +## 📦 Установка и запуск + +### Локальная разработка (Windows + PowerShell) + +```powershell +# Клонировать репозиторий +git clone my-project +cd my-project + +# Frontend +cd frontend +npm install +npm run dev +# Открыть http://localhost:3000 + +# Backend (в отдельном терминале) +cd backend +npm install +node server.js +# Сервер запустится на http://localhost:3001 +``` + +### Production сборка + +```powershell +cd frontend +npm run build +# Статические файлы в frontend/out/ +``` + +## 🚢 Деплой на сервер (Ubuntu) + +### Настройка сервера + +1. Установить Node.js и PM2: +```bash +curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - +sudo apt-get install -y nodejs +sudo npm install -g pm2 +``` + +2. Клонировать проект: +```bash +cd ~/projects +git clone my-project +cd my-project +``` + +3. Установить зависимости: +```bash +cd frontend && npm install && cd .. +cd backend && npm install && cd .. +``` + +4. Собрать фронтенд: +```bash +cd frontend && npm run build +``` + +5. Настроить PM2: +```bash +pm2 start backend/server.js --name my-project-backend +pm2 start frontend/.next/start.js --name my-project-frontend +# или настроить ecosystem.config.js +``` + +## 🔧 Настройка проекта + +### Переименование проекта + +1. Обновить `package.json` в `frontend/` и `backend/` +2. Обновить название в `README.md` +3. Обновить пути в конфигурации (если нужно) + +### Переменные окружения + +Создайте файлы `.env.local` (frontend) и `.env` (backend) для локальной разработки. + +## 📚 Документация + +- **[Правила проекта](docs/PROJECT_RULES.md)** - Стандарты кодирования и workflow +- **[База знаний](docs/KNOWLEDGE_BASE.md)** - Архитектура и технические детали +- **[История изменений](docs/CHANGELOG.md)** - Changelog + +## 🎯 Стандарты разработки + +- Модульная архитектура +- Строгая типизация TypeScript (без `any`) +- ESLint для проверки кода +- Git workflow: разработка в `dev`, слияние в `main` + +Подробнее: [`docs/PROJECT_RULES.md`](docs/PROJECT_RULES.md) + +## 📝 Лицензия + +ISC + +## 👤 Автор + +Создано на основе стандартов разработки DosAi + diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..0aefe79 --- /dev/null +++ b/SETUP.md @@ -0,0 +1,72 @@ +# Настройка проекта после клонирования + +## Быстрый старт + +1. **Переименуйте проект** + - Обновите `package.json` в `frontend/` и `backend/` + - Обновите название в `README.md` + - Обновите `ecosystem.config.js` (имена процессов PM2) + +2. **Установите зависимости** + +```powershell +# Frontend +cd frontend +npm install + +# Backend +cd ../backend +npm install +``` + +3. **Настройте переменные окружения** + +Создайте файлы: +- `frontend/.env.local` (опционально) +- `backend/.env` (если нужно) + +4. **Запустите проект** + +```powershell +# Терминал 1 - Frontend +cd frontend +npm run dev + +# Терминал 2 - Backend +cd backend +node server.js +``` + +5. **Настройте Git** + +```powershell +git init +git add . +git commit -m "Initial commit" +git remote add origin +git push -u origin main +``` + +6. **Создайте ветку dev** + +```powershell +git checkout -b dev +git push -u origin dev +``` + +## Настройка сервера + +1. Обновите информацию в `docs/PROJECT_RULES.md`: + - IP сервера + - Пользователь + - Путь проекта + - Имена процессов PM2 + +2. Настройте `ecosystem.config.js` под ваши нужды + +3. На сервере установите зависимости и соберите проект + +## Готово! + +Теперь можно начинать разработку. Все правила и стандарты описаны в `docs/PROJECT_RULES.md` + diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..1faa71b --- /dev/null +++ b/backend/package.json @@ -0,0 +1,19 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "Express.js backend server", + "main": "server.js", + "type": "commonjs", + "scripts": { + "start": "node server.js", + "dev": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^5.1.0", + "body-parser": "^2.2.0" + } +} + diff --git a/backend/routes/.gitkeep b/backend/routes/.gitkeep new file mode 100644 index 0000000..3fc476b --- /dev/null +++ b/backend/routes/.gitkeep @@ -0,0 +1,6 @@ +# API Routes + +Создавайте здесь отдельные файлы для API маршрутов. + +Пример: users.js, products.js и т.д. + diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..38db58f --- /dev/null +++ b/backend/server.js @@ -0,0 +1,43 @@ +const express = require('express'); +const bodyParser = require('body-parser'); + +const app = express(); +const PORT = process.env.PORT || 3001; + +// Middleware +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); + +// CORS (настройте под свои нужды) +app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization'); + if (req.method === 'OPTIONS') { + res.sendStatus(200); + } else { + next(); + } +}); + +// Тестовый endpoint +app.get('/api/health', (req, res) => { + res.json({ status: 'ok', message: 'Server is running' }); +}); + +// Пример API endpoint +app.post('/api/example', (req, res) => { + try { + const { data } = req.body; + res.json({ success: true, received: data }); + } catch (err) { + res.status(500).json({ success: false, error: err.message }); + } +}); + +// Запуск сервера +app.listen(PORT, () => { + console.log(`🚀 Server is running on http://localhost:${PORT}`); + console.log(`📡 Health check: http://localhost:${PORT}/api/health`); +}); + diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..d7a56c7 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,29 @@ +# История изменений + +## [0.1.0] - Шаблон проекта + +### Добавлено + +- **Next.js 15** приложение с App Router +- **Express.js** бэкенд сервер +- **TypeScript** полная поддержка +- **Tailwind CSS 4** для стилизации +- **ESLint** настроенный +- **Документация** проекта (правила, база знаний) +- **Git workflow** правила +- **Базовая структура** проекта + +### Технические детали + +- Статический экспорт Next.js (`output: 'export'`) +- CORS настроен для разработки +- Базовая конфигурация для быстрого старта +- Готовые примеры компонентов и API endpoints + +## Начало работы + +1. Склонируйте этот шаблон +2. Переименуйте проект в `package.json` +3. Настройте под свои нужды +4. Начните разработку! + diff --git a/docs/KNOWLEDGE_BASE.md b/docs/KNOWLEDGE_BASE.md new file mode 100644 index 0000000..8a38f91 --- /dev/null +++ b/docs/KNOWLEDGE_BASE.md @@ -0,0 +1,260 @@ +# База знаний проекта + +## Назначение шаблона + +Это шаблон проекта для быстрого старта новых проектов с: +- Next.js фронтендом (App Router) +- Express.js бэкендом +- TypeScript +- Tailwind CSS +- Модульной архитектурой + +## Архитектура системы + +### Frontend (Next.js) + +**Структура:** +``` +frontend/ + app/ # Next.js App Router страницы + page.tsx # Главная страница + layout.tsx # Общий layout + components/ # React компоненты + lib/ # Утилиты и типы + docs/ # Документация фронтенда +``` + +**Технологии:** +- Next.js 15.3.3 с App Router +- React 19 +- TypeScript 5 +- Tailwind CSS 4 +- Статический экспорт (`output: 'export'`) + +### Backend (Express) + +**Структура:** +``` +backend/ + server.js # Основной файл сервера + routes/ # API маршруты (создавать по мере необходимости) +``` + +**Технологии:** +- Express.js 5 +- body-parser для обработки запросов + +## Типы данных + +Все типы должны быть определены явно. Используй интерфейсы для сложных структур: + +```typescript +// Пример: frontend/lib/types.ts +export interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +export interface User { + id: string; + name: string; + email: string; +} +``` + +## API интеграция + +### Определение URL + +Фронтенд автоматически определяет URL API: +```typescript +const isLocalhost = typeof window !== 'undefined' && window.location.hostname === 'localhost'; +const apiUrl = isLocalhost + ? 'http://localhost:3001/api' + : 'https://your-api-domain.com/api'; +``` + +### Пример запроса + +```typescript +async function fetchData() { + try { + const response = await fetch(`${apiUrl}/endpoint`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ data: 'value' }), + }); + + if (!response.ok) { + throw new Error('Server error'); + } + + const result = await response.json(); + return result; + } catch (err) { + console.error('API Error:', err); + throw err; + } +} +``` + +## Добавление новых функций + +### Frontend компонент + +1. Создать компонент в `frontend/components/`: +```typescript +// components/MyComponent.tsx +export default function MyComponent() { + return
Content
; +} +``` + +2. Использовать в странице: +```typescript +// app/page.tsx +import MyComponent from '@/components/MyComponent'; +``` + +### Backend endpoint + +1. Добавить маршрут в `backend/server.js` или создать отдельный файл в `backend/routes/`: + +```javascript +// backend/server.js +app.post('/api/my-endpoint', (req, res) => { + try { + const { data } = req.body; + // Обработка данных + res.json({ success: true, result: data }); + } catch (err) { + res.status(500).json({ success: false, error: err.message }); + } +}); +``` + +## Окружение разработки + +### Платформы +- **Разработка**: Windows с PowerShell +- **Хостинг**: Ubuntu Linux + +### Особенности разработки на Windows +- PowerShell не поддерживает оператор `&&` для цепочки команд +- Используйте `;` или выполняйте команды отдельно +- Пути в Git и конфигах всегда используют `/`, даже на Windows +- При работе через SSH используйте Linux команды + +### Локальная разработка (Windows + PowerShell) +```powershell +# Frontend - один терминал +cd frontend +npm install +npm run dev + +# Backend - отдельный терминал +cd backend +npm install +node server.js +``` + +## Деплой + +### Сервер +- **ОС**: Ubuntu Linux +- **IP**: (настройте под себя) +- **Пользователь**: (настройте под себя) +- **Путь**: ~/projects/ +- **Управление процессами**: PM2 + +### Процессы PM2 +- `-frontend` - Next.js приложение (статические файлы через serve или nginx) +- `-backend` - Express сервер + +### Команды деплоя +**С локального Windows (PowerShell):** +```powershell +# Отправить изменения +git push origin dev + +# Подключиться и обновить сервер (Ubuntu команды через SSH) +ssh user@server-ip "cd ~/projects/ && git pull origin dev && cd frontend && npm run build && pm2 restart -frontend -backend" +``` + +**Или на сервере напрямую (Ubuntu):** +```bash +cd ~/projects/ +git pull origin dev +cd frontend && npm run build +pm2 restart -frontend -backend +``` + +### Настройка PM2 + +Создайте `ecosystem.config.js` в корне проекта: + +```javascript +module.exports = { + apps: [ + { + name: 'my-app-frontend', + script: 'serve', + args: '-s frontend/out -p 3000', + cwd: './', + env: { + NODE_ENV: 'production' + } + }, + { + name: 'my-app-backend', + script: 'server.js', + cwd: './backend', + env: { + NODE_ENV: 'production', + PORT: 3001 + } + } + ] +}; +``` + +Запуск: `pm2 start ecosystem.config.js` + +## Обработка ошибок + +### API запросы +```typescript +try { + const response = await fetch(apiUrl, { method: 'POST', body: formData }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + return data; +} catch (err) { + console.error('API Error:', err); + // Показать сообщение пользователю + throw err; +} +``` + +### Backend +```javascript +app.post('/api/endpoint', (req, res) => { + try { + // Обработка + res.json({ success: true, data: result }); + } catch (err) { + console.error('Error:', err); + res.status(500).json({ success: false, error: err.message }); + } +}); +``` + +## Известные особенности + +1. **Статический экспорт**: Next.js собирается в статические файлы, нет серверного рендеринга +2. **CORS**: Настроен для разработки, адаптируйте под продакшн +3. **Порты**: Frontend 3000, Backend 3001 по умолчанию + diff --git a/docs/PROJECT_RULES.md b/docs/PROJECT_RULES.md new file mode 100644 index 0000000..99d5902 --- /dev/null +++ b/docs/PROJECT_RULES.md @@ -0,0 +1,210 @@ +# Правила проекта + +## Общие принципы + +### 1. Модульность +- Структурируй код по модулям +- Избегай жестких зависимостей между модулями +- Добавление новых функций не должно ломать существующие + +### 2. Типизация +- **Запрещено** использовать `any` в TypeScript +- Все типы должны быть определены явно +- Все функции должны иметь явные типы параметров и возвращаемого значения +- Используй интерфейсы для сложных структур данных + +### 3. Обработка ошибок +- Все API запросы должны обрабатывать ошибки сети +- Проверяй граничные случаи (деление на ноль, пустые значения и т.д.) +- Возвращай понятные сообщения об ошибках + +### 4. Форматирование кода +- Используй ESLint правила проекта +- Код должен проходить `npm run lint` без ошибок +- Production build не должен падать из-за линтера + +## Структура проекта + +### Frontend (Next.js) +``` +frontend/ + app/ # Next.js App Router страницы + components/ # React компоненты + lib/ # Утилиты и типы + docs/ # Документация фронтенда +``` + +### Backend (Express) +``` +backend/ + server.js # Основной файл сервера + routes/ # API маршруты (создавать по мере необходимости) +``` + +## Соглашения об именовании + +### Файлы и папки: +- Компоненты: `PascalCase.tsx` +- Утилиты: `camelCase.ts` +- Константы: `UPPER_SNAKE_CASE.ts` +- Папки: `kebab-case` + +### Переменные и функции: +- Переменные: `camelCase` +- Функции: `camelCase` +- Компоненты: `PascalCase` +- Константы: `UPPER_SNAKE_CASE` + +## Работа с Git + +### Ветки: +- `main` / `master` - продакшн (стабильная версия) +- `dev` - разработка (активная разработка) + +### Стандартный Workflow разработки + +#### 1. Разработка в `dev` +Все новые изменения разрабатываются в ветке `dev`: + +```bash +# Переключиться на dev +git checkout dev + +# Получить последние изменения с сервера +git pull origin dev + +# После внесения изменений +git add . +git commit -m "описание изменений" +git push origin dev +``` + +#### 2. Тестирование на сервере +Перед слиянием в `main` обязательно тестируйте изменения на сервере: +- Залить изменения на сервер (из `dev`) +- Пересобрать фронтенд: `cd frontend && npm run build` +- Перезапустить процессы: `pm2 restart -frontend -backend` +- Проверить работу функционала + +#### 3. Слияние в `main` +После успешного тестирования слить `dev` в `main`: + +```bash +# Переключиться на main +git checkout main + +# Обновить локальную main +git pull origin main + +# Слить dev в main +git merge dev --no-ff -m "Merge dev: краткое описание изменений" + +# Отправить на сервер +git push origin main +``` + +**Важно**: Используйте флаг `--no-ff` для создания merge commit - это сохраняет историю разработки. + +#### 4. Feature-ветки (для больших изменений) +Для крупных изменений создавайте feature-ветки от `dev`: + +```bash +git checkout dev +git checkout -b feature/new-feature +# Работаете в feature ветке +git push origin feature/new-feature +# Когда готово - мержите в dev +git checkout dev +git merge feature/new-feature +git push origin dev +``` + +### Коммиты: +- Используй понятные сообщения коммитов на русском или английском +- Один коммит = одно логическое изменение +- Формат: `тип: краткое описание` + - `feat:` - новая функциональность + - `fix:` - исправление ошибки + - `docs:` - изменения в документации + - `refactor:` - рефакторинг кода + - `style:` - форматирование (без изменения логики) + - `test:` - добавление тестов + - `chore:` - обновление зависимостей, конфигов + +### Перед коммитом: +1. Проверь линтер: `npm run lint` +2. Убедись, что сборка проходит: `npm run build` +3. Проверь типы: TypeScript должен компилироваться без ошибок + +### Перед слиянием в main: +1. ✅ Все изменения протестированы на сервере в `dev` +2. ✅ Линтер не выдает ошибок +3. ✅ Production build собирается успешно +4. ✅ Функционал работает корректно +5. ✅ Нет критических ошибок в консоли браузера + +## Окружение разработки + +### Платформы +- **Разработка**: Windows с PowerShell +- **Хостинг**: Ubuntu Linux сервер + +**Важно учитывать:** +- В PowerShell команды с `&&` не работают, используйте `;` или отдельные команды +- Пути к файлам на Windows используют обратные слеши `\`, но в Git и конфигах используйте `/` +- При работе через SSH с Ubuntu используйте стандартные Linux команды + +### Локальная разработка (Windows) +```powershell +# Frontend +cd frontend +npm install +npm run dev + +# Backend (в отдельном терминале) +cd backend +npm install +node server.js +``` + +## Деплой на сервер + +### Сервер информация: +- **ОС**: Ubuntu Linux +- **Пользователь**: dosai (настройте под себя) +- **Путь проекта**: `~/projects/` (настройте под себя) +- **Управление процессами**: PM2 + +### Порядок действий: +1. Закоммитить изменения в ветку `dev` +2. Отправить на сервер: `git push origin dev` +3. Подключиться к серверу: `ssh user@server-ip` +4. На сервере (Ubuntu): + ```bash + cd ~/projects/ + git pull origin dev + cd frontend && npm run build + pm2 restart -frontend -backend + ``` + +## Тестирование + +### Локальная разработка: +- Frontend: `npm run dev` (порт 3000) +- Backend: `node server.js` (порт 3001) + +### Проверка перед деплоем: +- [ ] Все функции работают корректно +- [ ] Нет ошибок в консоли браузера +- [ ] API запросы работают +- [ ] Production build успешно собирается +- [ ] Линтер не выдает ошибок + +## Запрещенные практики + +1. ❌ Использование `any` в TypeScript +2. ❌ Хардкод значений, которые должны быть в конфигурации +3. ❌ Коммит без проверки линтера и сборки +4. ❌ Прямые зависимости между несвязанными модулями +5. ❌ Игнорирование ошибок ESLint в production коде + diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..f78ac56 --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,26 @@ +// PM2 конфигурация для управления процессами +// Настройте под свой проект + +module.exports = { + apps: [ + { + name: 'template-frontend', + script: 'serve', + args: '-s frontend/out -p 3000', + cwd: './', + env: { + NODE_ENV: 'production', + }, + }, + { + name: 'template-backend', + script: 'server.js', + cwd: './backend', + env: { + NODE_ENV: 'production', + PORT: 3001, + }, + }, + ], +}; + diff --git a/frontend/app/globals.css b/frontend/app/globals.css new file mode 100644 index 0000000..3d552a6 --- /dev/null +++ b/frontend/app/globals.css @@ -0,0 +1,2 @@ +@import "tailwindcss"; + diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx new file mode 100644 index 0000000..c1c1626 --- /dev/null +++ b/frontend/app/layout.tsx @@ -0,0 +1,35 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Next.js Template", + description: "Template for Next.js + Node.js projects", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} + diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx new file mode 100644 index 0000000..4989e01 --- /dev/null +++ b/frontend/app/page.tsx @@ -0,0 +1,24 @@ +export default function Home() { + return ( +
+
+

+ Next.js + Node.js Template +

+

+ Готовый шаблон для быстрого старта проектов +

+
+

Начало работы

+
    +
  • Настройте структуру проекта под ваши нужды
  • +
  • Добавьте необходимые зависимости
  • +
  • Обновите документацию в папке docs/
  • +
  • Начните разработку!
  • +
+
+
+
+ ); +} + diff --git a/frontend/components/.gitkeep b/frontend/components/.gitkeep new file mode 100644 index 0000000..87dad74 --- /dev/null +++ b/frontend/components/.gitkeep @@ -0,0 +1,4 @@ +# Компоненты React + +Создавайте здесь ваши React компоненты. + diff --git a/frontend/docs/.gitkeep b/frontend/docs/.gitkeep new file mode 100644 index 0000000..192e556 --- /dev/null +++ b/frontend/docs/.gitkeep @@ -0,0 +1,4 @@ +# Документация фронтенда + +Размещайте здесь документацию, специфичную для фронтенда. + diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs new file mode 100644 index 0000000..fea3594 --- /dev/null +++ b/frontend/eslint.config.mjs @@ -0,0 +1,17 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; + diff --git a/frontend/lib/api.ts b/frontend/lib/api.ts new file mode 100644 index 0000000..3a0624e --- /dev/null +++ b/frontend/lib/api.ts @@ -0,0 +1,50 @@ +// Утилиты для работы с API + +const getApiUrl = (): string => { + if (typeof window === 'undefined') { + // SSR + return process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001'; + } + + const isLocalhost = window.location.hostname === 'localhost'; + return isLocalhost + ? 'http://localhost:3001' + : process.env.NEXT_PUBLIC_API_URL || 'https://your-api-domain.com'; +}; + +export const apiUrl = getApiUrl(); + +export interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +export async function apiRequest( + endpoint: string, + options: RequestInit = {} +): Promise> { + try { + const response = await fetch(`${apiUrl}/api/${endpoint}`, { + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers, + }, + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + return data; + } catch (err) { + console.error('API Error:', err); + return { + success: false, + error: err instanceof Error ? err.message : 'Unknown error', + }; + } +} + diff --git a/frontend/lib/types.ts b/frontend/lib/types.ts new file mode 100644 index 0000000..dd0e600 --- /dev/null +++ b/frontend/lib/types.ts @@ -0,0 +1,11 @@ +// Общие типы для проекта + +// Примеры типов - адаптируйте под свой проект +export interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +// Добавьте свои типы здесь + diff --git a/frontend/next.config.ts b/frontend/next.config.ts new file mode 100644 index 0000000..99ef169 --- /dev/null +++ b/frontend/next.config.ts @@ -0,0 +1,11 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: 'export', + images: { + unoptimized: true, + }, +}; + +export default nextConfig; + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..6a5ed86 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,28 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "next": "15.3.3" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "eslint": "^9", + "eslint-config-next": "15.3.3", + "@eslint/eslintrc": "^3" + } +} + diff --git a/frontend/postcss.config.mjs b/frontend/postcss.config.mjs new file mode 100644 index 0000000..43811db --- /dev/null +++ b/frontend/postcss.config.mjs @@ -0,0 +1,9 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; + diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..8f37f26 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} + diff --git a/structure.txt b/structure.txt new file mode 100644 index 0000000000000000000000000000000000000000..c14d583bffa3632c029e0f0a14be9fa8a15fd521 GIT binary patch literal 1276 zcmaizTTjA35QPuPKAHFjd}>U1GB%M16L}Jm2nf~y#upRAr4W=`pcqK}?dqAOBW0_Q zrn~L-o0&70et-3{#$-&(RE^=9G1taJz%?)rJo8|<*X(H-Q!EhS7)R)3OJvKYV(RAP zv_h_KIXT_h;8T^#UGn z$6RX&xTiB#_MTjTXL2Q0M=V}(L+j?BbyBNGG-y>NQ$&jv4Ln&7%{`Gs{YzZEKC_it zM2Y&TZ=C^|i4nUgl*~-ByW`*fx>gff zaHB|_^h~F%&1st1$TR#Q8bqgb10O!{&yMx4(zZI-rLqH(pCmr89W`7oP| it38)qc6K7DcHJe*A?xb)O26wKQTL2}mL42pMad6xg`x}q literal 0 HcmV?d00001