Skip to content

Repository files navigation

TYAGA Server

Backend для TYAGA — одиночной игры с соревновательным аспектом в виде глобального leaderboard.

Этот репозиторий содержит серверную часть проекта: авторизацию, игроков, прогрессию, скины, достижения, сессии и данные для будущего leaderboard.

Сама игра находится за пределами этого репозитория.

изображение

🗺️ Roadmap

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 WebApp

Telegram Mini App использует серверную проверку initData.

Telegram WebApp
       │
       │ initData
       ▼
┌─────────────────┐
│    TYAGA API    │
│                 │
│ HMAC validation │
│ auth_date       │
│ Telegram user   │
└────────┬────────┘
         │
         ▼
      Игрок
         │
         ▼
      Сессия

После успешной авторизации сервер:

  1. проверяет Telegram initData;
  2. находит или создаёт игрока;
  3. связывает Telegram identity с игроком;
  4. создаёт серверную сессию;
  5. возвращает данные игрока и токен сессии.

🌐 Web Auth

Для браузерной авторизации реализован отдельный 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

Основной 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

Игра отвечает за игровой процесс.

Сервер отвечает за то, что происходит с данными игрока после игры и между сессиями.

Клиент не должен самостоятельно определять или хранить авторитетные значения прогресса.


🚧 Что осталось

Backend

  • Схема базы данных
  • Система игроков
  • 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 ⚪