- Регистрация и авторизация пользователя по JWT.
- Обновление access-токена через refresh-токен.
- Получение текущего пользователя (
me) по Bearer-токену. - Профиль пользователя: никнейм + возрастная группа.
- Команды: создание и вступление по коду.
- Квесты: создание (draft), чекпоинты, обложка (upload), модерация, публикация/архив/скрытие.
- Прохождение квеста: соло/команда, строгий порядок чекпоинтов, очки и лидерборд.
- Жалобы: отправка пользователем + просмотр/resolve модератором.
- Web-клиент (React): лента, создание квеста, прохождение, модерация, карта.
- Единая точка входа через Nginx (HTTPS) и проксирование
/api/*на backend.
backend/
app/ FastAPI приложение
alembic/ Миграции Alembic
entrypoint.sh Авто-миграции при старте контейнера
Dockerfile
requirements.txt
requirements-dev.txt
frontend/
src/ React web-клиент
index.html
vite.config.ts
package.json
infra/
nginx/ Nginx + сборка frontend + self-signed TLS
docker-compose.yml
.env.example
- Python
- FastAPI
- SQLAlchemy
- PostgreSQL
- Alembic
- JWT (access/refresh)
- React
- TypeScript
- Vite
- Docker / Docker Compose
- Nginx (HTTPS + reverse proxy)
Приложение поднимается одним docker compose и работает через Nginx:
- Nginx отдает web-клиент (SPA) и проксирует backend под
/api/*. - Backend поднимает REST API.
- Postgres используется как основная БД.
Префикс API: /api/v1
POST /api/v1/auth/registerPOST /api/v1/auth/loginPOST /api/v1/auth/refreshGET /api/v1/user/me/PATCH /api/v1/user/meGET /api/v1/quests/GET /api/v1/quests/{id}POST /api/v1/quests/{id}/checkpoints/{id}/cover/{id}/submit/{id}/archivePOST /api/v1/teams/POST /api/v1/teams/join/GET /api/v1/teams/myPOST /api/v1/runs/start/GET /api/v1/runs/{id}/{id}/submit/{id}/abandonGET /api/v1/leaderboard/teamsPOST /api/v1/complaintsGET /api/v1/moderation/quests/ approve / reject / hideGET /api/v1/moderation/complaints/ resolveGET /health
- Docker и Docker Compose (рекомендуемый способ запуска)
Создай .env в корне проекта на основе .env.example:
cp .env.example .env.env не хранится в git. В проекте используется один .env в корне.
Для HTTPS используется self-signed сертификат, который генерируется при старте nginx.
Если нужно открыть проект по другому хосту/IP, задай:
CERT_HOST(напримерlocalhost,myhost.localили IP машины)CERT_SANS(опционально, дополнительные SAN, напримерDNS:myhost.local,IP:192.168.1.10)
docker compose up --build -dПосле запуска:
- Web (HTTPS):
https://localhost/ - Swagger:
https://localhost/docs - Health:
https://localhost/health - Status page:
https://localhost/status
Примечание: сертификат self-signed, браузер покажет предупреждение при первом открытии.
Остановка:
docker compose downПолная очистка данных Postgres (удалит volume pgdata):
docker compose down -vВ корне есть Makefile:
make up/make downmake logs/make psmake reset-dbmake migratemake seed(заполнить БД демо-данными)make test-backendmake front-typecheck
После первого запуска и миграций можно заполнить БД демо-данными одной командой:
make seedСкрипт очищает БД и создаёт:
- 8 пользователей + 1 модератор (реалистичные профили)
- 4 команды (2–3 участника)
- 8 квестов по реальным локациям Нижнего Новгорода, в каждом минимум 3 чекпоинта
- 10–14 прохождений (started/in_progress/finished/abandoned)
- 2–3 жалобы (для демонстрации модерации)
Демо-аккаунты:
- модератор:
moderator / demo123 - пользователи (пароль
demo123):masha.nn@example.comdima.nn@example.comkatya.nn@example.comartem.nn@example.comlena.nn@example.comnikita.nn@example.comsonya.nn@example.comivan.nn@example.com
Рекомендуемый способ — через Docker (там гарантированно совпадают версии и сеть между сервисами). Если нужно запустить локально:
- Подними Postgres (и при необходимости Redis).
- Создай виртуальное окружение и установи зависимости из
backend/requirements.txt. - Передай переменные окружения как в
.env.example(проще всего — создать.envв корне).
Локальный dev-сервер Vite:
make front-devПо умолчанию frontend ходит на тот же домен, что и UI (через Nginx в Docker). Для чистого локального режима
убедись, что backend доступен и CORS настроен через CORS_ORIGINS.
Файл примера: .env.example. Фактический файл: .env (в git не хранится).
- SECRET_KEY: обязательно поменять для продакшена (в
ENV=prodзапуск сSECRET_KEY=change-meупадет). - MEDIA_DIR: папка для локальных загрузок (обложки и т.п.). Backend публикует это как
/uploads/*. - VITE_YANDEX_SUGGEST_API_KEY: ключ для подсказок города (если пустой — подсказки могут не работать).
- CERT_HOST / CERT_SANS: имя хоста и дополнительные SAN для self-signed сертификата в nginx.
- Единый вход: открывать
https://localhost/(UI) иhttps://localhost/docs(Swagger). - Модератор:
moderator / demo123, кнопка «Окно модератора» появляется после входа. - Seed:
make seedсоздаёт пользователей/команды/квесты/прохождения/жалобы.
- Обложки/медиа сохраняются локально в
MEDIA_DIR(по умолчаниюuploadsвнутри backend контейнера). - Доступ к ним идет через
GET /uploads/*(nginx проксирует на backend).
Проект готов к демонстрации как MVP: поднятие одной командой, есть seed, модератор, основная логика квестов/проходок/рейтинга и карта в UI.
Для полноценного внешнего деплоя (публичный сервер) обычно стоит дополнить:
- TLS: заменить self-signed на нормальный сертификат (Let's Encrypt/Cloudflare).
- Секреты: задать надежный
SECRET_KEY, ограничить/настроитьCORS_ORIGINS. - Персистентность uploads: вынести
MEDIA_DIRв docker volume/host volume (чтобы не терялось при пересборке). - Ресурсы и мониторинг: логи/метрики/healthchecks уже есть, но можно добавить лимиты ресурсов и алерты.