Runbook — мобильный тест на 3 Android через USB¶
Цель: live-reload разработка одновременно на 3 физических Android-устройствах, прогон сценариев на ролях tourist, hotelier, provider, admin.
Архитектура связи: adb reverse tcp:9013 tcp:9013 — каждое устройство по USB пробрасывает свой localhost:9013 → PC localhost:9013, где работает Vite. Никакого Wi-Fi, никаких firewall проблем.
┌──────────────────┐ ┌───── adb reverse ──────┐
│ PC: vite :9013 │ ◄─ USB cable ─►│ Device 1: tourist │ → http://localhost:9013
│ (tourist-app) │ ◄─ USB cable ─►│ Device 2: hotelier │ → http://localhost:9013
│ │ ◄─ USB cable ─►│ Device 3: provider │ → http://localhost:9013
└──────────────────┘ └────────────────────────┘
capacitor.config.ts уже настроен: server.url = http://localhost:9013 — менять ничего не надо.
0. Предусловия (один раз)¶
0.1 ADB в PATH (PowerShell)¶
$env:Path += ";$env:LOCALAPPDATA\Android\Sdk\platform-tools"
# чтобы навсегда:
[Environment]::SetEnvironmentVariable("Path", $env:Path, "User")
Проверка: adb version.
0.2 USB-debugging на устройствах¶
На каждом из 3 устройств: 1. Настройки → О телефоне → 7 раз тапнуть «Номер сборки» → режим разработчика. 2. Настройки → Для разработчиков → включить «Отладка по USB». 3. Подключить к ПК. При первом подключении устройство спросит «Разрешить отладку с этого ПК» → ✅ + сохранить ключ.
Проверка:
adb devices
# должно показать 3 устройства со статусом "device" (не unauthorized)
0.3 Бэкенд¶
Используем prod: https://arkhyz-club.ru/api/v1 (см. infra/routes.config.mjs:406). Менять не надо — tourist-app сам берёт правильный URL для production-build.
Для live-reload mode используется vite на ПК (это HTML/CSS/JS), а API-запросы из webview всё равно идут на prod (внутри кода Capacitor HTTP plugin переписан, см. capacitor.config.ts:34).
1. Сборка debug-APK (один раз)¶
cd tourist-app
npm ci # если ноду меняли — 5–10 мин
npm run build # vite build → dist/
npx cap sync android # копирует dist → android/app/src/main/assets/
cd android
.\gradlew assembleDebug # сборка → app/build/outputs/apk/debug/app-debug.apk
Готовый APK: tourist-app/android/app/build/outputs/apk/debug/app-debug.apk.
Альтернатива через Android Studio:
npx cap open android→ Build → Build Bundle(s) / APK(s) → Build APK(s).
2. Деплой на 3 устройства (скрипт)¶
Файл scripts/deploy-3-devices.ps1:
param([string]$Apk = "tourist-app/android/app/build/outputs/apk/debug/app-debug.apk")
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
$devices = & $adb devices | Select-String "device$" | ForEach-Object {
($_ -split "\s+")[0]
}
if ($devices.Count -lt 1) { Write-Error "Нет подключённых устройств"; exit 1 }
Write-Host "Найдено устройств: $($devices.Count)" -ForegroundColor Cyan
foreach ($d in $devices) {
Write-Host "→ $d" -ForegroundColor Yellow
& $adb -s $d uninstall ru.arkhyzclub.app 2>$null | Out-Null
& $adb -s $d install -r $Apk
& $adb -s $d reverse tcp:9013 tcp:9013
Write-Host " ✓ установлен, reverse 9013→9013 готов" -ForegroundColor Green
}
Write-Host ""
Write-Host "Теперь запусти dev-server: cd tourist-app; npm run dev" -ForegroundColor Cyan
Write-Host "Открывай приложение Архыз.CLUB на каждом устройстве." -ForegroundColor Cyan
Запуск: pwsh scripts/deploy-3-devices.ps1.
3. Запуск live-reload¶
В отдельном терминале (НЕ закрывать пока тестим):
cd tourist-app
npm run dev
# Vite up at http://0.0.0.0:9013
На каждом устройстве: открыть приложение «Архыз.CLUB» — оно загрузится с PC. Любое изменение в tourist-app/src/** → HMR обновит экран на ВСЕХ 3 устройствах одновременно.
4. Логи с устройств¶
Открываем 3 терминала параллельно:
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
# Получить serial-ы:
& $adb devices
# Затем для каждого устройства:
& $adb -s <serial> logcat --pid=$(& $adb -s <serial> shell pidof ru.arkhyzclub.app) -v color
Или Chrome DevTools (рекомендую — webview-консоль красивее):
1. Открыть Chrome на ПК → chrome://inspect/#devices.
2. Увидеть 3 webview’а «Архыз.CLUB» — inspect на каждом → отдельная вкладка с DevTools, console.log/network/elements/sources.
5. Логин по ролям¶
Универсальный SMS-код: 1111 (бэкдор, см. services/auth-svc/app/routers/sms.py:8).
| Устройство | Роль | Телефон | Email (для admin web) |
|---|---|---|---|
| 1 | tourist |
+79990000001 |
tourist@arkhyz-club.ru |
| 2 | hotelier |
+79990000003 |
hotelier@arkhyz-club.ru |
| 3 | instructor (provider) |
+79990000007 |
instructor@arkhyz-club.ru |
Пароль для admin-web: 123123 (применяется через workflow seed-demo-users, если нужно ресетнуть).
Полный список ролей (можно ротировать на устройствах между раундами):
| Роль | Телефон | |
|---|---|---|
| tourist | +79990000001 | tourist@arkhyz-club.ru |
| admin | +79990000002 | admin@arkhyz-club.ru |
| hotelier | +79990000003 | hotelier@arkhyz-club.ru |
| tour_operator | +79990000004 | comgruztaxi@gmail.com |
| transfer_provider | +79990000005 | transfer-provider@arkhyz-club.ru |
| restaurateur | +79990000006 | restaurateur_fixed@arkhyz-club.ru |
| instructor | +79990000007 | instructor@arkhyz-club.ru |
6. Чек-лист по ролям¶
Device 1 — tourist (главный сценарий мобилки)¶
- [ ] Логин по телефону → код 1111 → вход.
- [ ] Главная: погода (resort-svc), webcams (resort-svc), recommendations (catalog-svc), GamificationWidget (
/progress/me— PR #84 закрепляет). - [ ] Карта: подъёмники с актуальным статусом, friends locations (если есть друзья).
- [ ] Каталог: hotels / tours / restaurants / instructors — открыть деталку каждого типа.
- [ ] Бронь: создать тестовую бронь отеля → перейти к оплате (можно не довести).
- [ ] Чат: открыть список чатов, написать в support.
- [ ] Профиль: история броней, любимое (
/favorites), бейджи (/badges/me). - [ ] Tracking: запустить GPS-сессию (gpx-симулятор или просто походить) → проверить
/tracking/sessions/me(после PR #84 должен отдавать список). - [ ] Push: разрешить уведомления → проверить, что
POST /api/v1/push/registerотстрелил FCM-токен (логи platform-svc). - [ ] SOS-кнопка: должна показать экран, без отправки реальной тревоги.
Device 2 — hotelier (дашборд отельера)¶
- [ ] Логин → вход. Внимание: hotelier на мобилке UI ограниченный — основной интерфейс на admin.arkhyz-club.ru.
- [ ] Открыть «Мои отели» → должны грузиться через
/dashboard/hotelier/hotels(200). - [ ] Мои брони (входящие): проверить отображение.
- [ ] Если есть страница «Календарь» —
/bookings/statistics,/dashboard/hotelier/calendar. - [ ] (Параллельно) открыть в браузере на ПК
https://admin.arkhyz-club.ruпод hotelier — дашборд работает полностью.
Device 3 — instructor / provider¶
- [ ] Логин → вход.
- [ ] Расписание занятий (если реализовано).
- [ ] Мои клиенты / брони.
- [ ] Финансовая выписка.
- [ ] Чат с туристами.
admin (на 1-м устройстве после смены логина, или в браузере)¶
Admin-роль в мобилке имеет смысл только для view. Полный admin-flow — на admin.arkhyz-club.ru:
- [ ] /admin/dashboard — общий обзор.
- [ ] /admin/users, /admin/sessions/active.
- [ ] /admin/ski/lifts — управление подъёмниками (PR #84 чинит).
- [ ] /admin/ski/slopes, /admin/ski/tracking, /admin/ski/recommendations — после мержа PR #84 должны открываться без 404.
- [ ] /admin/module-access — конфиг модулей.
- [ ] /admin/monitoring — Grafana iframe.
7. Что собирать как «отчёт»¶
После прогона каждой роли: - Скриншот главной + 2–3 проблемных экранов. - Console errors из Chrome DevTools (chrome://inspect). - Network failures (с кодом и URL). - Любые краши/freeze + repro.
Кидай в чат — разберём.
8. Известные ограничения dev-mode¶
- При деплое APK с
server.url = http://localhost:9013: после удаленияadb reverseприложение перестанет открываться (показывает белый экран). Это норма для dev-сборки — для prod-сборки делайnpm run build+ комментируйserverблок вcapacitor.config.ts. - HMR работает только пока подключён USB-кабель.
- FCM-push токены: в dev-сборке Capacitor получает FCM-токен и регистрирует его в
/api/v1/push/register(платформа платит реальные FCM-сообщения). Если шлёшь тест-push черезPOST /api/v1/push/test— придёт. - Capacitor HTTP plugin переписывает fetch/XHR → запросы идут через нативный OkHttp. CORS, preflýght и SSL-проблемы webview обойдены.
9. Финальный чек: PR #84 готов к мержу?¶
Текущее состояние:
- ✅ /progress/me — 200 (gamification-svc, рефакторинг prefix).
- ✅ /push/devices — 200 (миграция накатана).
- 🔴 /recommendations/slopes, /recommendations/plan-day — 404 (нужен мерж + ребилд resort-svc).
- 🔴 /tracking/sessions/me (с auth) — 404 (нужен мерж + ребилд resort-svc).
После мержа PR #84 → auto-deploy backend → перепроверить эти 4 эндпоинта → отметить тест-кейсы 1.7 (tracking) и 1.2 (recommendations) как ✅.