Backend для TYAGA — одиночной игры с соревновательным аспектом в виде глобального leaderboard.
Этот репозиторий содержит серверную часть проекта: авторизацию, игроков, прогрессию, скины, достижения, сессии и данные для будущего leaderboard.
Сама игра находится за пределами этого репозитория.
TYAGA SERVER
│
├── 🗄️ База данных
│ ├── ✅ Игроки
│ ├── ✅ Авторизации
│ ├── ✅ Очки
│ ├── ✅ Скины
│ ├── ✅ Достижения
│ └── ✅ Сессии
│
├── 🔐 Авторизация
│ ├── ✅ Telegram WebApp
│ ├── ✅ Web Auth Flow
│ ├── 🟡 Telegram Bot Auth
│ ├── ⬜ Telegram Login Widget
│ └── ⬜ Twitch
│
├── 🌐 API
│ ├── ✅ Players API
│ ├── ✅ Skins API
│ ├── ✅ Achievements API
│ ├── ✅ Sessions API
│ ├── ✅ Authentication API
│ └── ⬜ Leaderboard API
│
├── 🏆 Прогрессия
│ ├── ✅ Очки
│ ├── ✅ Скины игроков
│ ├── ✅ Достижения
│ └── ⬜ Leaderboard
│
└── 🚀 Инфраструктура
├── ✅ Собственный сервер
├── ✅ Reverse tunnel
├── ✅ VPS
├── ✅ Nginx
├── ✅ HTTPS
├── ⬜ Rate limiting
├── ⬜ Мониторинг
├── ⬜ Автоматические бэкапы
└── ⬜ Production hardening
У каждого игрока есть собственная постоянная запись в базе данных.
Player
├── ID
├── Очки
├── Дата создания
└── Профиль
├── Никнейм
└── Аватар
Данные авторизации хранятся отдельно от самого игрока, поэтому аккаунт не привязан к одному конкретному способу входа.
Система авторизации строится вокруг единого аккаунта игрока и нескольких возможных способов входа.
На данный момент полностью работает Telegram WebApp и браузерный Web Auth flow. Архитектура авторизации подготовлена для дальнейшего подключения Telegram Login Widget и Twitch.
TYAGA AUTH
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
📱 Telegram 🌐 Web 🎮 Game
WebApp Auth Client
│ │ │
└────────────┼────────────┘
▼
👤 Player
│
▼
🔐 Session
Telegram Mini App использует серверную проверку initData.
Telegram WebApp
│
│ initData
▼
┌─────────────────┐
│ TYAGA API │
│ │
│ HMAC validation │
│ auth_date │
│ Telegram user │
└────────┬────────┘
│
▼
Игрок
│
▼
Сессия
После успешной авторизации сервер:
- проверяет Telegram
initData; - находит или создаёт игрока;
- связывает Telegram identity с игроком;
- создаёт серверную сессию;
- возвращает данные игрока и токен сессии.
Для браузерной авторизации реализован отдельный flow.
/auth
│
├── Telegram
│ │
│ ▼
│ /telegram
│ │
│ ├── 📱 Telegram Bot
│ │
│ └── 🌐 Login Widget
│
└── Twitch
│
└── 🚧 В разработке
Публичные страницы:
https://auth.tyaga-game.ru/
https://auth.tyaga-game.ru/telegram
Telegram Web Auth flow уже доступен через публичный HTTPS-домен и протестирован на нескольких устройствах.
Страница /telegram предоставляет выбор способа входа через Telegram. Telegram Bot flow уже подключён к публичной странице, а Telegram Login Widget подготовлен для дальнейшей реализации.
У каждого игрока есть постоянный баланс очков.
Очки являются основой будущей системы прогрессии и соревновательного leaderboard.
На сервере реализована отдельная система каталога скинов и владения ими игроками.
Skins
├── ID
├── Название
├── Цена
└── Secret flag
│
▼
Player skins
└── Игрок → Скин
Каталог скинов отделён от данных конкретных игроков.
Для достижений существует отдельная структура в базе данных и система условий.
Achievement
├── ID
├── Название
├── Описание
└── Условия
Это позволяет развивать систему достижений без необходимости превращать клиент игры в источник истины.
Авторизованные игроки работают через серверные сессии.
Для одного игрока одновременно может существовать только одна активная сессия.
Игрок
│
└── Активная сессия
│
└── Token
Токены сессий не хранятся в базе данных в открытом виде — сервер работает с их SHA-256 хешами.
Срок действия сессии настраивается через AUTH_SESSION_DAYS.
Публичная инфраструктура построена вокруг отдельного VPS и собственного сервера Theseus.
Интернет
│
▼
┌───────────────┐
│ VPS │
│ │
│ Nginx │
│ HTTPS / TLS │
└───────┬───────┘
│
Reverse Tunnel
│
▼
┌───────────────┐
│ Theseus │
│ │
│ Fastify │
│ Node.js │
└───────┬───────┘
│
▼
┌───────────────┐
│ PostgreSQL │
└───────────────┘
Theseus используется как основной сервер приложения и базы данных.
VPS используется как публичная точка входа. Nginx принимает HTTPS-запросы и передаёт их через reverse tunnel на Theseus.
Это позволяет не выставлять сам сервер Theseus напрямую в интернет и при этом использовать собственные домены:
https://api.tyaga-game.ru
https://auth.tyaga-game.ru
https://www.tyaga-game.ru
Основной API доступен через:
https://api.tyaga-game.ru
Например:
GET /health
возвращает состояние сервера и базы данных.
| Компонент | Технология |
|---|---|
| Runtime | Node.js |
| API | Fastify |
| База данных | PostgreSQL |
| Авторизация | Telegram WebApp |
| Reverse proxy | Nginx |
| HTTPS | Let's Encrypt |
| Туннель | Reverse tunnel |
| Frontend | HTML / CSS / JavaScript |
| ОС сервера | Linux |
tyaga-server/
│
├── public/
│ ├── auth/
│ │ └── index.html
│ │
│ └── telegram/
│ ├── index.html
│ └── app.html
│
├── src/
│ ├── middleware/
│ │ └── auth.js
│ │
│ ├── routes/
│ │ ├── achievements.js
│ │ ├── auth.js
│ │ ├── players.js
│ │ ├── sessions.js
│ │ └── skins.js
│ │
│ ├── services/
│ │ ├── achievements.js
│ │ ├── auth.js
│ │ └── telegram.js
│ │
│ ├── db.js
│ └── server.js
│
├── migrations/
│
├── .env.example
├── .gitignore
├── package.json
├── package-lock.json
├── README.md
└── schema.sql
Backend является источником истины для данных игрока.
TYAGA
│
▼
┌───────────┐
│ Игрок │
└─────┬─────┘
│
┌──────────────┼──────────────┐
│ │ │
▼ ▼ ▼
⭐ Очки 🎨 Скины 🏆 Достижения
│ │ │
└──────────────┼──────────────┘
│
▼
🏆 Leaderboard
Игра отвечает за игровой процесс.
Сервер отвечает за то, что происходит с данными игрока после игры и между сессиями.
Клиент не должен самостоятельно определять или хранить авторитетные значения прогресса.
- Схема базы данных
- Система игроков
- Telegram WebApp авторизация
- Сессии
- Очки
- Скины
- Достижения
- Публичный HTTPS-доступ
- Web Auth страницы
- Telegram Login Widget
- Twitch авторизация
- Единый auth flow для всех провайдеров
- Leaderboard
- Rate limiting
- Production hardening
- Мониторинг
- Автоматические бэкапы
- Подключение игры к API
- Авторизация игрока из игры
- Восстановление сохранённой сессии
- Синхронизация прогресса
- Синхронизация скинов
- Отправка результатов
- Получение leaderboard
| Система | Статус |
|---|---|
| База данных | 🟢 |
| Игроки | 🟢 |
| Telegram WebApp | 🟢 |
| Web Auth | 🟢 |
| Telegram Bot Auth | 🟡 |
| Telegram Login Widget | 🟡 |
| Сессии | 🟢 |
| Очки | 🟢 |
| Скины | 🟢 |
| Достижения | 🟢 |
| Публичный HTTPS | 🟢 |
| Reverse tunnel | 🟢 |
| Nginx | 🟢 |
| Twitch | ⚪ |
| Leaderboard | ⚪ |
| Интеграция с игрой | ⚪ |
| Production hardening | ⚪ |