Архыз.CLUB — ski features (P0-P6)¶
Фичи мобильного приложения и веба для горнолыжного курорта.
Схема¶
┌──────────────────────────┐ WS realtime ┌────────────────┐
│ tourist-app (Capacitor) │ ◄──────────────────────► │ rtc-svc │
│ + admin/web SPA │ │ /ws/realtime │
└──────────┬───────────────┘ └────────┬───────┘
│ │
│ REST /api/v1/... │ Redis pub/sub
▼ ▼
┌──────────────────────────────────────────────────────────────────────┐
│ resort-svc (FastAPI) │
│ ───────────────────────────────────────────────────────────────── │
│ P0 /resort/lifts live-очереди подъёмников │
│ P1 /tracking/sessions/* GPS-сессии + классификация (lift/run) │
│ P2 /skipass/* виртуальный пасс + scan-лог │
│ P3 /leaderboard/{period} топ юзеров │
│ /badges/me бейджи │
│ P3.5 /me/location публикация позиции + push «друг рядом» │
│ /friends/locations live-локации друзей │
│ P4 /rentals/* аренда снаряжения │
│ /slope/* еда на склон │
│ P5 /notifications/* push (OneSignal + inbox в Redis) │
│ P6 /recommendations/* AI-подбор трасс │
└──────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────┐
│ Redis (state) │
│ Postgres (БД) │
│ OneSignal (push) │
└─────────────────────┘
Mobile экраны¶
| Маршрут | Экран | Что делает |
|---|---|---|
/snow (таб «Гора») |
SnowScreen |
Хаб: погода, трассы + виджеты live-очередей и AI-реко |
/lifts |
LiftsScreen |
Heatmap-карточки очередей у подъёмников |
/lifts/:id |
LiftsScreen |
Детали подъёмника |
/map3d (таб «Карта») |
Ski3DMapScreen |
Mapbox 3D-карта с террейном, слои live-данных |
/tracking |
TrackingScreen |
Старт/стоп GPS-сессии, live-метрики |
/tracking/history |
TrackingHistoryScreen |
Сессии за 30 дней + сводка |
/tracking/sessions/:id |
TrackingDetailScreen |
Таймлайн дня + сегменты |
/leaderboard |
LeaderboardScreen |
Топ-50 за день/неделю/месяц |
/badges |
BadgesScreen |
10 бейджей с прогресс-барами |
/friends-live |
FriendsLiveScreen |
Друзья на склоне + toggle шаринга |
/virtual-pass |
VirtualPassScreen |
QR-пасс + статистика проходов |
/rentals |
RentalsScreen |
Каталог снаряжения, корзина |
/slope-food |
SlopeFoodScreen |
Меню кафе с доставкой |
/inbox |
InboxScreen |
Входящие push-уведомления |
/recommendations |
RecommendationsScreen |
Куда поехать сейчас + план дня |
Подключение CV-pipeline для live-очередей¶
CV-сервис каждые 5-10 секунд отправляет:
POST /api/v1/resort/lifts/{lift_id}/queue?queue=N
resort-svc:
1. Сохраняет counter:lift:{id}:queue в Redis (TTL 5 мин)
2. Публикует в realtime:lift_queues → все подписчики WS видят обновление
3. Триггерит push «🟢 Очередь упала» если было busy/crowded, стало free/low
Push-триггеры¶
booking— после успешной аренды или заказа едыqueue— очередь упала на ранее загруженном подъёмникеfriend— друг в радиусе 300м (debounce 30 мин)achievement— открыт новый бейдж (TODO)info— служебные
Деплой¶
# Backend сервис
cd /root/arkhyz-admin-main
./scripts/deploy/services.sh --rebuild resort-svc
# Mobile + tourist web
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
up -d --build --force-recreate tourist_app
# Admin SPA
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
up -d --build --force-recreate admin_web_v4
# Caddy reload (после изменений Caddyfile)
docker exec arkhyz-caddy caddy reload --config /etc/caddy/Caddyfile
Env-переменные¶
| Variable | Где | Назначение |
|---|---|---|
HOTEL_API_JWT_SECRET |
resort-svc | Декод JWT (общий с auth-svc) |
REDIS_URL |
resort-svc, rtc-svc | redis://arkhyz-redis:6379/N |
SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY |
resort-svc | PostgREST доступ к users/friends |
ONESIGNAL_APP_ID, ONESIGNAL_API_KEY |
resort-svc | Отправка push (опционально) |
VITE_MAPBOX_TOKEN |
tourist-app | 3D-карта |
VITE_API_BASE |
tourist-app | https://stage.arkhyz-club.ru |