Полноценная игра "Морской бой" как Telegram Mini App с real-time геймплеем.
- Frontend: React + TypeScript + Vite + Tailwind CSS
- Backend: Node.js + NestJS + Fastify
- Bot: Node.js + grammY
- Database: PostgreSQL + Prisma
- Cache/Queue: Redis
- Real-time: Server-Sent Events (SSE)
battleship/
├── apps/
│ ├── webapp/ # Telegram Mini App (React)
│ ├── api/ # Backend API (NestJS)
│ └── bot/ # Telegram Bot (grammY)
├── packages/
│ ├── game-logic/ # Общая игровая логика
│ ├── shared-types/ # Общие TypeScript типы
│ └── ui/ # Общие UI компоненты
└── docs/ # Документация
- Node.js 20+
- Docker (для PostgreSQL и Redis)
- Telegram Bot Token
# Клонирование и установка зависимостей
git clone <repository>
cd battleship
npm install
# Настройка переменных окружения
cp .env.example .env
# Отредактируйте .env файл
# Запуск базы данных
docker-compose up -d
# Генерация Prisma клиента
npm run db:generate
# Запуск миграций
npm run db:migrate
# Запуск в режиме разработки
npm run devСоздайте .env файл в корне проекта:
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/battleship"
REDIS_URL="redis://localhost:6379"
# Telegram
TELEGRAM_BOT_TOKEN="your_bot_token"
TELEGRAM_BOT_USERNAME="your_bot_username"
# JWT
JWT_SECRET="your_jwt_secret"
# App URLs
FRONTEND_URL="http://localhost:5173"
API_URL="http://localhost:3000"
BOT_WEBHOOK_URL="https://your-domain.com/bot/webhook"- Регистрация: Пользователь открывает Mini App через бота
- Матчмейкинг: Поиск соперника через Redis очередь
- Расстановка: Игроки расставляют корабли на своих полях
- Битва: Поочередные ходы с real-time обновлениями
- Победа: Определение победителя и статистика
- Верификация Telegram
initDataдля аутентификации - Сервер-авторитарная игровая логика
- Rate limiting и анти-чит
- Валидация всех игровых действий на сервере
- Sentry для отслеживания ошибок
- Pino для логирования
- Метрики производительности
В репозитории есть railway.json, который объявляет два сервиса:
- API:
apps/api/Dockerfile(порт 3000) - Webapp:
apps/webapp/Dockerfile+apps/webapp/nginx.conf(порт 80)
Шаги:
- Импортируйте репозиторий в Railway
- Railway предложит поднять оба сервиса из monorepo
- В переменных окружения:
- Webapp:
VITE_API_URL=https://<api-domain>/api - API:
FRONTEND_URL=https://<webapp-domain>иTELEGRAM_BOT_TOKEN,JWT_SECRETи т.д.
- Webapp:
- Деплой
- Frontend (Vercel)
- Backend/Bot (Fly.io / Railway)
MIT