Платформа городских квестов с геолокацией. Игроки проходят чекпоинты по карте соло или командой, набирают очки в общем рейтинге и создают свои маршруты. Модераторы проверяют контент через отдельную панель.
Монорепозиторий из трёх независимых частей: REST-бэкенд, две Next.js-панели (web для игроков, admin для модераторов) и Flutter-приложение для мобильных платформ.
Исходники частей проекта и история коммитов на GitHub:
| Часть | Репозиторий | Коммиты |
|---|---|---|
| Frontend | github.com/34elo/Techarrow | история коммитов |
| Backend | github.com/mathusha2023/StrelkaBack | история коммитов |
| Мобильное | github.com/Street02krutoy/techarrow_2026_app | история коммитов |
| Площадка | Ссылка |
|---|---|
| Пользовательская панель (web) | https://tarr.ssrit.xyz |
| Панель модерации (admin) | https://admin.tarr.ssrit.xyz |
| Backend API + Swagger UI | https://api.tarr.ssrit.xyz/docs |
| Мобильное приложение (APK) | https://disk.yandex.ru/d/hGIOuA_1WCC8Zg |
Готовая учётка модератора для проверки админ-панели (https://admin.tarr.ssrit.xyz):
| Роль | Пароль | |
|---|---|---|
| Модератор | moder@moder.ru |
11111111 |
| Каталог | Что это | Стек |
|---|---|---|
[backend/](./backend) |
REST API, БД, файловое хранилище | FastAPI · PostgreSQL+PostGIS · Redis · MinIO |
[frontend/web/](./frontend/web) |
Пользовательская панель в браузере (:3000) |
Next.js 16 · React 19 · TanStack Query · MapLibre GL |
[frontend/admin/](./frontend/admin) |
Панель модерации (:3001) |
Next.js 16 · React 19 · TanStack Query |
[mobile/](./mobile) |
Мобильное приложение для игроков | Flutter · Chopper · flutter_map · pedometer |
Каждая часть — самостоятельный проект со своим репозиторием в .git, своим Dockerfile (где применимо) и своим README. Все клиенты ходят в один backend.
- Каталог квестов с фильтрами по городу, сложности, длительности, поиском и геопоиском «рядом со мной».
- Прохождение соло и в команде до 6 человек: чекпоинты на карте с кодовым словом или вариантами ответа, подсказки, таймер старта команды (5 с после готовности всех).
- Создание квестов с маркерами на карте, обложкой в S3 и валидацией (≥3 чекпоинта). Каждый квест проходит модерацию.
- Команды с 12-символьным инвайт-кодом и QR, кик участников, командный рейтинг.
- Рейтинги и достижения в профиле, история прохождений, экспорт квеста в PDF.
- Изоляция ролей:
userходит воfrontend/webиmobile,moderator— только вfrontend/admin. Авторитетный контроль ролей — на backend.
# 1. Backend (API + Postgres + Redis + MinIO)
cd backend
cp .env .env.local # либо отредактируйте существующий
docker compose up -d --build
# API → http://localhost:8000, Swagger → /docs, Adminer → :8081, MinIO → :9001
# 2. Frontend (web + admin одной командой)
cd ../frontend
cp .env.example .env
docker compose up -d --build
# Web → http://localhost:3000, Admin → http://localhost:3001
# 3. Mobile
cd ../mobile
cp .env.example .env
flutter pub get
make gen-swag
flutter runДемо-данными можно наполнить БД скриптом python backend/create_mock_data.py.
JWT с access (15 мин) и refresh (7 дней) токенами. Refresh-токены хранятся в Redis и могут быть отозваны (logout). У пользователя ровно одна роль: user или moderator.
- Регистрация обычного пользователя — через
/api/auth/register(web и mobile). - Модераторов заводит backend (
/api/auth/register/moderator) — фронтенд админки регистрацию не показывает. - Каждый клиент имеет собственное хранилище токенов с уникальными ключами, чтобы сессии web/admin/mobile не пересекались.
| Раздел | Файл |
|---|---|
| Backend — README, архитектура, окружение и API | [backend/README.md](./backend/README.md), [backend/docs/](./backend/docs) |
| Frontend (общий) — обзор, запуск, контракт API | [frontend/README.md](./frontend/README.md) |
| Frontend web — пользовательская панель | [frontend/web/README.md](./frontend/web/README.md), [frontend/web/docs/](./frontend/web/docs) |
| Frontend admin — панель модерации | [frontend/admin/README.md](./frontend/admin/README.md), [frontend/admin/docs/](./frontend/admin/docs) |
| Mobile — Flutter-приложение | [mobile/README.md](./mobile/README.md), [mobile/docs/](./mobile/docs) |
| Командные квесты — backend-флоу | [mobile/team-quests.md](./mobile/team-quests.md) |
| Контракт REST | Swagger UI, [frontend/openapi.json](./frontend/openapi.json), [mobile/openapi/swagger.json](./mobile/openapi/swagger.json) |
┌──────────────────────────────┐
│ backend (API) │
│ FastAPI + Postgres + Redis │
│ + MinIO │
└──────────────┬───────────────┘
│ REST (JWT)
┌──────────────────────┼──────────────────────┐
│ │ │
┌───────┴────────┐ ┌─────────┴─────────┐ ┌────────┴────────┐
│ frontend/web │ │ frontend/admin │ │ mobile │
│ role=user │ │ role=moderator │ │ role=user │
│ Next.js 16 │ │ Next.js 16 │ │ Flutter │
└────────────────┘ └───────────────────┘ └─────────────────┘
Контракт API един для всех клиентов: один и тот же openapi.json лежит во frontend/ (общий для web и admin) и в mobile/openapi/swagger.json. При изменении API:
- Перегенерируйте
openapi.jsonиз FastAPI. - Обновите файл во
frontend/иmobile/openapi/. - В
mobile/запуститеmake gen-swag— пересоберётся типизированный Chopper-клиент.