680 lines
18 KiB
Markdown
680 lines
18 KiB
Markdown
# 🪟 Инструкция по развертыванию Nakama на Windows
|
||
|
||
## 📋 Содержание
|
||
|
||
1. [Предварительные требования](#предварительные-требования)
|
||
2. [Установка зависимостей](#установка-зависимостей)
|
||
3. [Настройка окружения](#настройка-окружения)
|
||
4. [Запуск MongoDB](#запуск-mongodb)
|
||
5. [Запуск приложения](#запуск-приложения)
|
||
6. [Отключение проверки initData для разработки](#отключение-проверки-initdata-для-разработки)
|
||
7. [Тестирование без Telegram](#тестирование-без-telegram)
|
||
8. [Полезные команды](#полезные-команды)
|
||
9. [Устранение проблем](#устранение-проблем)
|
||
|
||
---
|
||
|
||
## 🔧 Предварительные требования
|
||
|
||
### 1. Node.js
|
||
Установите Node.js версии 18 или выше:
|
||
- Скачайте с [nodejs.org](https://nodejs.org/)
|
||
- Проверьте установку:
|
||
```cmd
|
||
node --version
|
||
npm --version
|
||
```
|
||
|
||
### 2. MongoDB
|
||
Установите MongoDB Community Edition:
|
||
- Скачайте с [mongodb.com/try/download/community](https://www.mongodb.com/try/download/community)
|
||
- Или используйте MongoDB в Docker (см. ниже)
|
||
|
||
### 3. Git (опционально)
|
||
Для работы с репозиторием:
|
||
- Скачайте с [git-scm.com](https://git-scm.com/)
|
||
|
||
---
|
||
|
||
## 📦 Установка зависимостей
|
||
|
||
### 1. Клонируйте репозиторий (если еще не клонирован)
|
||
```cmd
|
||
git clone <repository-url>
|
||
cd nakama
|
||
```
|
||
|
||
### 2. Установите зависимости для backend
|
||
```cmd
|
||
npm install
|
||
```
|
||
|
||
### 3. Установите дополнительные пакеты для музыкального модуля
|
||
```cmd
|
||
npm install adm-zip
|
||
```
|
||
|
||
### 4. Установите зависимости для frontend
|
||
```cmd
|
||
cd frontend
|
||
npm install
|
||
cd ..
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ Настройка окружения
|
||
|
||
### 1. Создайте файл `.env` в корне проекта
|
||
|
||
```cmd
|
||
REM Скопируйте пример
|
||
copy ENV_EXAMPLE.txt .env
|
||
```
|
||
|
||
**Для PowerShell:**
|
||
```powershell
|
||
# Скопируйте пример
|
||
Copy-Item ENV_EXAMPLE.txt .env
|
||
```
|
||
|
||
### 2. Минимальная конфигурация для локальной разработки
|
||
|
||
Откройте `.env` в текстовом редакторе и настройте:
|
||
|
||
```env
|
||
# Режим разработки
|
||
NODE_ENV=development
|
||
PORT=3000
|
||
|
||
# MongoDB (локальная база)
|
||
MONGODB_URI=mongodb://localhost:27017/nakama-dev
|
||
|
||
# JWT Secrets (можно использовать любые строки для разработки)
|
||
JWT_SECRET=dev_jwt_secret_change_me_in_production_32chars
|
||
JWT_ACCESS_SECRET=dev_access_secret_32chars_minimum_length
|
||
JWT_REFRESH_SECRET=dev_refresh_secret_32chars_minimum_length
|
||
|
||
# Telegram Bot Configuration
|
||
# ⚠️ Для разработки без Telegram оставьте пустыми или используйте тестовый токен
|
||
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
|
||
MODERATION_BOT_TOKEN=
|
||
|
||
# API ключи для поиска (опционально)
|
||
GELBOORU_API_KEY=
|
||
GELBOORU_USER_ID=
|
||
E621_USERNAME=
|
||
E621_API_KEY=
|
||
|
||
# Frontend URL
|
||
FRONTEND_URL=http://localhost:5173
|
||
VITE_API_URL=http://localhost:3000/api
|
||
|
||
# CORS (разрешить все для разработки)
|
||
CORS_ORIGIN=*
|
||
|
||
# Redis (опционально, можно оставить пустым)
|
||
REDIS_URL=
|
||
|
||
# MinIO (отключить для локальной разработки)
|
||
MINIO_ENABLED=false
|
||
|
||
# Rate Limiting (мягкие лимиты для разработки)
|
||
RATE_LIMIT_GENERAL=1000
|
||
RATE_LIMIT_POSTS=100
|
||
RATE_LIMIT_INTERACTIONS=200
|
||
|
||
# Email (отключить для локальной разработки)
|
||
EMAIL_PROVIDER=
|
||
```
|
||
|
||
### 3. Создайте `.env` для frontend
|
||
|
||
```cmd
|
||
cd frontend
|
||
echo VITE_API_URL=http://localhost:3000/api > .env
|
||
cd ..
|
||
```
|
||
|
||
**Для PowerShell:**
|
||
```powershell
|
||
cd frontend
|
||
"VITE_API_URL=http://localhost:3000/api" | Out-File -Encoding UTF8 .env
|
||
cd ..
|
||
```
|
||
|
||
---
|
||
|
||
## 🗄️ Запуск MongoDB
|
||
|
||
### Вариант 1: MongoDB как сервис Windows
|
||
|
||
1. Запустите MongoDB из меню Пуск или через службы:
|
||
```cmd
|
||
net start MongoDB
|
||
```
|
||
|
||
2. Проверьте подключение:
|
||
```cmd
|
||
mongosh
|
||
REM Должно подключиться к mongodb://localhost:27017
|
||
```
|
||
|
||
### Вариант 2: MongoDB в Docker
|
||
|
||
```cmd
|
||
docker run -d -p 27017:27017 --name mongodb-nakama mongo:latest
|
||
```
|
||
|
||
### Вариант 3: MongoDB вручную
|
||
|
||
Если MongoDB не установлен как сервис:
|
||
|
||
```cmd
|
||
REM Перейдите в папку MongoDB
|
||
cd "C:\Program Files\MongoDB\Server\7.0\bin"
|
||
|
||
REM Создайте папку для данных (если не существует)
|
||
if not exist C:\data\db mkdir C:\data\db
|
||
|
||
REM Запустите MongoDB
|
||
mongod --dbpath C:\data\db
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 Запуск приложения
|
||
|
||
### 1. Запуск Backend
|
||
|
||
В корневой папке проекта:
|
||
|
||
```cmd
|
||
npm run server
|
||
```
|
||
|
||
Или для автоматической перезагрузки при изменениях:
|
||
|
||
```cmd
|
||
npm run dev
|
||
```
|
||
|
||
Backend будет доступен на `http://localhost:3000`
|
||
|
||
### 2. Запуск Frontend
|
||
|
||
Откройте **новое окно Command Prompt** (Win+R → `cmd`):
|
||
|
||
```cmd
|
||
cd C:\путь\к\проекту\nakama\frontend
|
||
npm run dev
|
||
```
|
||
|
||
Frontend будет доступен на `http://localhost:5173`
|
||
|
||
### 3. Запуск обоих одновременно
|
||
|
||
Из корневой папки:
|
||
|
||
```cmd
|
||
npm run dev
|
||
```
|
||
|
||
Эта команда запустит и backend, и frontend одновременно.
|
||
|
||
---
|
||
|
||
## 🔓 Отключение проверки initData для разработки
|
||
|
||
Для тестирования без Telegram Mini App нужно временно отключить проверку initData.
|
||
|
||
### Метод 1: Переменная окружения (Рекомендуется)
|
||
|
||
1. Добавьте в `.env`:
|
||
```env
|
||
DISABLE_TELEGRAM_AUTH=true
|
||
DEV_USER_ID=123456789
|
||
```
|
||
|
||
2. Создайте файл `backend/middleware/devAuth.js`:
|
||
|
||
```javascript
|
||
// Middleware для разработки без Telegram
|
||
const User = require('../models/User');
|
||
|
||
const devAuthenticate = async (req, res, next) => {
|
||
// Включено только если DISABLE_TELEGRAM_AUTH=true
|
||
if (process.env.DISABLE_TELEGRAM_AUTH !== 'true') {
|
||
return require('./auth').authenticate(req, res, next);
|
||
}
|
||
|
||
console.log('⚠️ DEV MODE: Telegram auth disabled');
|
||
|
||
try {
|
||
const devUserId = process.env.DEV_USER_ID || '123456789';
|
||
|
||
// Найти или создать тестового пользователя
|
||
let user = await User.findOne({ telegramId: devUserId });
|
||
|
||
if (!user) {
|
||
user = new User({
|
||
telegramId: devUserId,
|
||
username: 'DevUser',
|
||
firstName: 'Dev',
|
||
lastName: 'User',
|
||
photoUrl: null
|
||
});
|
||
await user.save();
|
||
console.log('✅ Created dev user:', user.username);
|
||
}
|
||
|
||
// Инициализировать настройки
|
||
if (!user.settings) {
|
||
user.settings = {
|
||
searchPreference: 'furry',
|
||
whitelist: { noNSFW: false, noHomo: false }
|
||
};
|
||
await user.save();
|
||
}
|
||
|
||
req.user = user;
|
||
req.telegramUser = {
|
||
id: user.telegramId,
|
||
username: user.username,
|
||
firstName: user.firstName,
|
||
lastName: user.lastName
|
||
};
|
||
|
||
next();
|
||
} catch (error) {
|
||
console.error('❌ Dev auth error:', error);
|
||
res.status(500).json({ error: 'Dev auth error' });
|
||
}
|
||
};
|
||
|
||
module.exports = { devAuthenticate };
|
||
```
|
||
|
||
3. Обновите `backend/routes/*.js` (все роуты с авторизацией):
|
||
|
||
```javascript
|
||
// Было:
|
||
const { authenticate } = require('../middleware/auth');
|
||
|
||
// Стало:
|
||
const { authenticate } = require('../middleware/auth');
|
||
const { devAuthenticate } = require('../middleware/devAuth');
|
||
|
||
// Используйте devAuthenticate вместо authenticate:
|
||
const authMiddleware = process.env.DISABLE_TELEGRAM_AUTH === 'true'
|
||
? devAuthenticate
|
||
: authenticate;
|
||
|
||
router.get('/', authMiddleware, async (req, res) => {
|
||
// ...
|
||
});
|
||
```
|
||
|
||
### Метод 2: Модификация auth.js (Быстрый способ)
|
||
|
||
Отредактируйте `backend/middleware/auth.js`:
|
||
|
||
```javascript
|
||
const authenticate = async (req, res, next) => {
|
||
// 🔥 DEV MODE: Skip Telegram validation
|
||
if (process.env.DISABLE_TELEGRAM_AUTH === 'true') {
|
||
console.log('⚠️ DEV MODE: Skipping Telegram auth');
|
||
|
||
const devUserId = process.env.DEV_USER_ID || '123456789';
|
||
let user = await User.findOne({ telegramId: devUserId });
|
||
|
||
if (!user) {
|
||
user = new User({
|
||
telegramId: devUserId,
|
||
username: 'DevUser',
|
||
firstName: 'Dev',
|
||
lastName: 'User'
|
||
});
|
||
await user.save();
|
||
}
|
||
|
||
req.user = user;
|
||
req.telegramUser = {
|
||
id: user.telegramId,
|
||
username: user.username,
|
||
firstName: user.firstName,
|
||
lastName: user.lastName
|
||
};
|
||
|
||
return next();
|
||
}
|
||
|
||
// Остальной код без изменений...
|
||
try {
|
||
const authHeader = req.headers.authorization || '';
|
||
// ... существующий код ...
|
||
```
|
||
|
||
### Метод 3: Mock Telegram WebApp
|
||
|
||
Для фронтенда создайте файл `frontend\src\utils\mockTelegram.js`:
|
||
|
||
```javascript
|
||
// Mock Telegram WebApp для разработки
|
||
export const mockTelegram = () => {
|
||
if (window.Telegram?.WebApp) return; // Уже есть
|
||
|
||
const mockInitData = 'query_id=mock&user=%7B%22id%22%3A123456789%2C%22first_name%22%3A%22Dev%22%2C%22last_name%22%3A%22User%22%2C%22username%22%3A%22devuser%22%7D&auth_date=1234567890&hash=mockhash';
|
||
|
||
window.Telegram = {
|
||
WebApp: {
|
||
initData: mockInitData,
|
||
initDataUnsafe: {
|
||
query_id: 'mock',
|
||
user: {
|
||
id: 123456789,
|
||
first_name: 'Dev',
|
||
last_name: 'User',
|
||
username: 'devuser'
|
||
},
|
||
auth_date: 1234567890,
|
||
hash: 'mockhash'
|
||
},
|
||
version: '6.0',
|
||
platform: 'web',
|
||
colorScheme: 'light',
|
||
themeParams: {},
|
||
isExpanded: true,
|
||
viewportHeight: 600,
|
||
viewportStableHeight: 600,
|
||
isClosingConfirmationEnabled: false,
|
||
headerColor: '#ffffff',
|
||
backgroundColor: '#ffffff',
|
||
BackButton: { isVisible: false },
|
||
MainButton: { isVisible: false },
|
||
ready: () => console.log('Mock Telegram ready'),
|
||
expand: () => console.log('Mock Telegram expand'),
|
||
close: () => console.log('Mock Telegram close'),
|
||
disableVerticalSwipes: () => {},
|
||
enableClosingConfirmation: () => {},
|
||
disableClosingConfirmation: () => {}
|
||
}
|
||
};
|
||
|
||
console.log('✅ Mock Telegram WebApp initialized');
|
||
};
|
||
```
|
||
|
||
Импортируйте и используйте в `frontend/src/App.jsx`:
|
||
|
||
```javascript
|
||
// В начале файла
|
||
import { mockTelegram } from './utils/mockTelegram'
|
||
|
||
// В useEffect перед initTelegramApp()
|
||
useEffect(() => {
|
||
// Mock Telegram для разработки
|
||
if (import.meta.env.DEV && !window.Telegram?.WebApp) {
|
||
mockTelegram()
|
||
}
|
||
|
||
initTheme()
|
||
// ...
|
||
}, [])
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 Тестирование без Telegram
|
||
|
||
### 1. Настройте среду разработки
|
||
|
||
В `.env`:
|
||
```env
|
||
DISABLE_TELEGRAM_AUTH=true
|
||
DEV_USER_ID=123456789
|
||
NODE_ENV=development
|
||
```
|
||
|
||
### 2. Запустите приложение
|
||
|
||
**Окно CMD 1 - Backend:**
|
||
```cmd
|
||
npm run server
|
||
```
|
||
|
||
**Окно CMD 2 - Frontend:**
|
||
```cmd
|
||
cd frontend
|
||
npm run dev
|
||
```
|
||
|
||
### 3. Откройте браузер
|
||
|
||
Перейдите на `http://localhost:5173`
|
||
|
||
Приложение должно работать без Telegram Mini App!
|
||
|
||
### 4. Тестирование API напрямую
|
||
|
||
Используйте **Postman**, **Thunder Client** или **curl** (если установлен):
|
||
|
||
```cmd
|
||
REM Получить посты
|
||
curl http://localhost:3000/api/posts
|
||
|
||
REM Создать пост (с mock auth) - для PowerShell
|
||
```
|
||
|
||
**Для PowerShell:**
|
||
```powershell
|
||
# Получить посты
|
||
Invoke-RestMethod -Uri http://localhost:3000/api/posts -Method Get
|
||
|
||
# Создать пост
|
||
$body = @{
|
||
content = "Test post"
|
||
tags = @("furry", "art")
|
||
} | ConvertTo-Json
|
||
|
||
Invoke-RestMethod -Uri http://localhost:3000/api/posts -Method Post -Body $body -ContentType "application/json"
|
||
```
|
||
|
||
**Рекомендуется использовать Postman или Thunder Client для удобства.**
|
||
|
||
---
|
||
|
||
## 📝 Полезные команды
|
||
|
||
### npm скрипты
|
||
|
||
```cmd
|
||
REM Backend
|
||
npm run server & REM Запустить backend
|
||
npm run dev & REM Backend + Frontend одновременно
|
||
|
||
REM Frontend
|
||
cd frontend
|
||
npm run dev & REM Запустить frontend dev server
|
||
npm run build & REM Собрать production build
|
||
npm run preview & REM Preview production build
|
||
```
|
||
|
||
### MongoDB
|
||
|
||
```cmd
|
||
REM Подключиться к базе
|
||
mongosh mongodb://localhost:27017/nakama-dev
|
||
```
|
||
|
||
Внутри mongosh:
|
||
```javascript
|
||
// Показать базы
|
||
show dbs
|
||
|
||
// Использовать базу
|
||
use nakama-dev
|
||
|
||
// Показать коллекции
|
||
show collections
|
||
|
||
// Найти пользователей
|
||
db.users.find().pretty()
|
||
|
||
// Очистить посты
|
||
db.posts.deleteMany({})
|
||
```
|
||
|
||
### Остановка процессов
|
||
|
||
```cmd
|
||
REM Найти процесс на порту
|
||
netstat -ano | findstr :3000
|
||
netstat -ano | findstr :5173
|
||
|
||
REM Убить процесс по PID (замените <PID> на номер процесса)
|
||
taskkill /PID <PID> /F
|
||
|
||
REM Пример:
|
||
taskkill /PID 12345 /F
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Устранение проблем
|
||
|
||
### Ошибка: "MongoDB connection failed"
|
||
|
||
**Решение:**
|
||
1. Проверьте, что MongoDB запущен:
|
||
```cmd
|
||
net start MongoDB
|
||
```
|
||
или
|
||
```cmd
|
||
mongosh
|
||
```
|
||
|
||
2. Проверьте `MONGODB_URI` в `.env`:
|
||
```env
|
||
MONGODB_URI=mongodb://localhost:27017/nakama-dev
|
||
```
|
||
|
||
### Ошибка: "Port 3000 already in use"
|
||
|
||
**Решение:**
|
||
```cmd
|
||
REM Найти процесс
|
||
netstat -ano | findstr :3000
|
||
|
||
REM Убить процесс (замените <PID> на номер из вывода выше)
|
||
taskkill /PID <PID> /F
|
||
|
||
REM Или измените порт в .env
|
||
REM PORT=3001
|
||
```
|
||
|
||
### Ошибка: "Cannot find module 'adm-zip'"
|
||
|
||
**Решение:**
|
||
```cmd
|
||
npm install adm-zip
|
||
```
|
||
|
||
### Frontend не подключается к Backend
|
||
|
||
**Решение:**
|
||
1. Проверьте `VITE_API_URL` в `frontend\.env`:
|
||
```env
|
||
VITE_API_URL=http://localhost:3000/api
|
||
```
|
||
|
||
2. Проверьте CORS в backend `.env`:
|
||
```env
|
||
CORS_ORIGIN=*
|
||
```
|
||
|
||
3. Перезапустите frontend:
|
||
```cmd
|
||
cd frontend
|
||
npm run dev
|
||
```
|
||
|
||
### Ошибка: "Требуется авторизация"
|
||
|
||
**Решение:**
|
||
1. Убедитесь, что `DISABLE_TELEGRAM_AUTH=true` в `.env`
|
||
2. Реализуйте devAuth middleware (см. выше)
|
||
3. Перезапустите backend
|
||
|
||
### Медленная работа на Windows
|
||
|
||
**Решение:**
|
||
1. Добавьте папки в исключения антивируса:
|
||
- `node_modules`
|
||
- Папка проекта целиком
|
||
|
||
2. Используйте WSL2 (Windows Subsystem for Linux) для лучшей производительности:
|
||
```cmd
|
||
wsl --install
|
||
```
|
||
Перезагрузите компьютер после установки, затем установите проект в WSL.
|
||
|
||
3. Очистите кеш npm:
|
||
```cmd
|
||
npm cache clean --force
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Чек-лист запуска
|
||
|
||
- [ ] Node.js установлен (v18+)
|
||
- [ ] MongoDB запущен
|
||
- [ ] `.env` создан и настроен
|
||
- [ ] `npm install` выполнен в корне проекта
|
||
- [ ] `npm install` выполнен в `frontend\`
|
||
- [ ] `npm install adm-zip` выполнен
|
||
- [ ] `DISABLE_TELEGRAM_AUTH=true` в `.env` (для разработки)
|
||
- [ ] Backend запущен (`npm run server`)
|
||
- [ ] Frontend запущен (`cd frontend && npm run dev`)
|
||
- [ ] Браузер открыт на `http://localhost:5173`
|
||
- [ ] Приложение работает!
|
||
|
||
---
|
||
|
||
## 📚 Дополнительные ресурсы
|
||
|
||
- [Node.js документация](https://nodejs.org/docs/)
|
||
- [MongoDB документация](https://www.mongodb.com/docs/)
|
||
- [Vite документация](https://vitejs.dev/)
|
||
- [React документация](https://react.dev/)
|
||
- [Express.js документация](https://expressjs.com/)
|
||
|
||
---
|
||
|
||
## 🆘 Поддержка
|
||
|
||
Если возникли проблемы:
|
||
|
||
1. Проверьте логи в консоли backend и frontend
|
||
2. Проверьте `.env` файлы
|
||
3. Очистите `node_modules` и переустановите:
|
||
```cmd
|
||
REM Удалить node_modules
|
||
rmdir /s /q node_modules
|
||
rmdir /s /q frontend\node_modules
|
||
|
||
REM Переустановить зависимости
|
||
npm install
|
||
cd frontend
|
||
npm install
|
||
cd ..
|
||
```
|
||
4. Создайте issue в репозитории
|
||
|
||
---
|
||
|
||
**Удачной разработки! 🚀**
|
||
|