Полноценный production-ready проект для трекинга тренировок. Реализован в виде Telegram-бота со встроенным WebApp для удобного управления своим тренировочным прогрессом.
- Telegram-Native Authorization: Бесшовная авторизация пользователей через криптографическую проверку
Telegram initData. Не требуются пароли или логины. - Production-Ready Архитектура: Backend спроектирован по паттернам Clean Architecture (разделение Domain, Application, Infrastructure и Presentation слоев).
- Продвинутая БД: Реляционная структура на PostgreSQL с каскадным удалением, оптимизированными отношениями и асинхронным доступом через
sqlalchemy 2.0. - Modern Frontend: Легкий и быстрый SPA WebApp на React + Vite с глобальным стейтом на Zustand и кастомизируемой версткой на TailwindCSS.
- DevOps & Scaling: Portable-инфраструктура на Docker Compose. Использование Traefik в роли API-gateway для возможности разворачивать десятки независимых демонов ботов на одном сервере без конфликта 80/443 портов.
- Language: Python 3.12+
- Framework: FastAPI (REST API для WebApp) + aiogram 3.x (для Telegram бота)
- Database: PostgreSQL 16
- Cache/State: Redis 7
- ORM & Migrations: SQLAlchemy 2.0 + asyncpg + Alembic
- Auth: JWT, HMAC-SHA256 (Telegram initData crypto verification)
- Core: React 19 + TypeScript + Vite
- State Management: Zustand (с persist для будущего Offline-First)
- Styling: TailwindCSS v4 + Lucide React (иконки)
- HTTP Client: Axios с JWT Interceptors
- Integration:
@twa-dev/sdk(Telegram Web App SDK)
- Docker & Docker Compose
- Traefik (Reverse Proxy / Load Balancer / SSL termination)
SantaGymBot/
├── backend/ # Clean Architecture Python Backend
│ ├── app/
│ │ ├── main_bot.py # Точка входа Telegram-бота
│ │ ├── main_api.py # Точка входа FastAPI
│ │ ├── core/ # Конфигурация
│ │ ├── domain/ # Бизнес-модели, Pydantic DTOs
│ │ ├── application/ # Сервисный слой, Use-Cases, Auth
│ │ ├── infrastructure/ # SQLAlchemy конфигурация, миграции, Repository Pattern
│ │ └── presentation/ # FastAPI роутеры (REST API)
├── frontend/ # React Web App
│ ├── src/
│ │ ├── api/ # Настройка Axios клиента
│ │ ├── store/ # Zustand хранилище (авторизация)
│ │ ├── pages/ # Экраны и представления
│ │ └── App.tsx # Роутер
├── docker-compose.yml # Инфраструктурный манифест
└── .env.example # Шаблон переменных окружения
- Docker & Docker Compose
- GNU Make
- Node.js / Python локально не обязательны, если используете только Docker
Клонируйте репозиторий и создайте local env:
git clone <repository_url>
cd SantaGymBot
cp .env.local.example .env.localmake local-init
make local-upЛокальный стенд поднимает:
dbredisbackendfrontend
bot в обычный local workflow не входит.
- API:
http://localhost:8000 - Frontend:
http://localhost:5173
make local-migratemake local-logs
make local-downЛокальная разработка использует controlled fallback auth через test_mode, если в .env.local включен ALLOW_TEST_AUTH=true.
Это подходит для:
- UI разработки
- локальной проверки API
- быстрой отладки в браузере
Это не заменяет реальную проверку Telegram WebApp авторизации.
Детали: local-stand.md
Серверный режим использует отдельный compose override с Traefik, bot и production-oriented frontend runtime.
cp .env.server.example .env.serverЗаполните как минимум:
BOT_TOKENJWT_SECRETWEBAPP_BASE_URLWEBHOOK_URLFRONTEND_HOSTAPI_HOSTTRAEFIK_ACME_EMAIL
make server-configdocker compose --env-file .env.server -f docker-compose.yml -f docker-compose.server.yml up -d --build
docker compose --env-file .env.server -f docker-compose.yml -f docker-compose.server.yml exec backend alembic upgrade headTraefik здесь нужен для host-based routing и размещения нескольких ботов/WebApp на одном сервере без конфликта внешних портов 80/443.
Детали: server-stand.md
Dev-стенд на сервере разворачивается как отдельный stack рядом с prod:
- отдельная директория, например
/opt/santagym-dev - отдельный env-файл
.env.dev - отдельные Postgres/Redis volumes
- отдельные домены, например
dev.gym.santariver.lolиdev-api.gym.santariver.lol - тот же сервер и тот же
Traefik, но другой compose project name
cp .env.dev.example .env.devЗаполните как минимум:
BOT_TOKENJWT_SECRETWEBAPP_BASE_URLWEBHOOK_URLFRONTEND_HOSTAPI_HOSTTRAEFIK_ACME_EMAIL
После push/merge в develop workflow Deploy Dev to VPS:
- копирует код в
/opt/santagym-dev - использует
.env.dev - запускает отдельный compose project
santagym-dev - прогоняет миграции
- проверяет health backend/frontend
Никогда не передавайте tg_id юзера сырым в REST запросах между WebApp и сервером.
- При старте WebApp клиент отправляет на бекэнд payload
window.Telegram.WebApp.initData. - Backend (через
hmac-sha256) верифицирует, что эти данные были сгенерированы Телеграмом именно для вашего бота (сопоставляя с вашимBOT_TOKEN). - Бекэнд выдает стандартизированный
Bearer JWTToken, который используется для аутентификации всех последующих REST-запросов.
- Описать компонент Frontend'а для "Активной сессии тренировки"
- Интегрировать графики прогресса по весам (Recharts)
- Настроить Celery + Redis Task Queue для отправки push-напоминаний, если юзер не закончил тренировку.
- Реализовать Offline-sync (передача сетов батчами, если исчезал интернет).
This project has CI/CD configured using GitHub Actions. The pipeline validates frontend, backend and compose configuration. Deployment uses the server compose topology.
Navigate to Settings > Secrets and variables > Actions in your GitHub repository and add:
HOST: Server IP Address (YOUR_SERVER_IP)USERNAME: Server User (YOUR_SERVER_USER)SSH_KEY: The private Ed25519 or RSA SSH key to access the VPS
Make sure the folder exists and create a .env.server file containing the protected runtime secrets:
# Connect to your server
ssh root@YOUR_SERVER_IP
mkdir -p /opt/santagym
cd /opt/santagym
nano .env.serverFill .env.server with your variables (BOT_TOKEN, POSTGRES_USER, WEBAPP_BASE_URL, etc).