docs: initial Seaca repo — README and mobile roadmap

Kotlin Android client for SAC with FCM push and admin enrollment codes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-10 12:34:00 +10:00
commit 927948d646
3 changed files with 196 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
# Roadmap — Seaca
Мобильный клиент SAC (Kotlin). Серверные задачи (API, настройки в веб-SAC, FCM с бэкенда) — в [security-alert-center](https://git.kalinamall.ru/PapaTramp/security-alert-center), фаза **v0.6 — Mobile**.
---
## Принятые решения
| Тема | Решение |
|------|---------|
| UI | Kotlin + Jetpack Compose (нативно) |
| Push | FCM (бесплатный канал доставки) |
| Привязка | Код регистрации от администратора (+ URL сервера; QR опционально позже) |
| Оповещения | Те же правила SAC: `min_severity`, cooldown, dedup — канал `push_mobile` в policy |
| Админка устройств | Только веб-SAC: список, отзыв, способ логина, выдача кодов |
| Роли | `viewer` — просмотр; `operator` — ack/resolve; admin-функции — не в приложении |
---
## v0.1 — Каркас приложения
- [ ] Gradle-проект: Compose, Navigation, Hilt/Koin, Retrofit, DataStore
- [ ] Экран «Подключение»: URL SAC, код регистрации, логин/пароль
- [ ] `POST /api/v1/auth/login` + обмен кода на `device_id` (когда API готов на SAC)
- [ ] Secure storage: `base_url`, access/refresh token, `device_id`
- [ ] Экран «Ошибка / нет сети» и проверка `GET /health`
- [ ] Базовая навигация: Обзор, События, Проблемы, Хосты, Отчёты
- [ ] CI: сборка debug APK (опционально — позже)
**Зависимость:** SAC v0.6.1 — `mobile_devices_allowed`, enrollment codes, `POST /mobile/enroll`
---
## v0.2 — Паритет с веб-UI (чтение)
- [ ] Списки с пагинацией: events, problems, hosts, reports
- [ ] Карточки: event, problem (+ связанные events), host (+ inventory)
- [ ] Dashboard: виджеты как `GET /api/v1/dashboards/summary`
- [ ] Фильтры events/problems (severity, type, host) — упрощённый набор
- [ ] Pull-to-refresh; polling в foreground (SSE на Android в фоне не используем)
- [ ] Тёмная тема (как веб)
- [ ] Локализация: русский
---
## v0.3 — Действия оператора
- [ ] `POST /api/v1/problems/{id}/ack` и `/resolve`
- [ ] Обновление списков после действия
- [ ] Скрытие admin-only API (403) — без попыток открыть settings/users
- [ ] Биометрический замок при возврате в приложение
- [ ] Certificate pinning / «Доверять сертификату» для внутреннего TLS
---
## v0.4 — Push (FCM)
- [ ] Firebase-проект, `google-services.json` (не в git)
- [ ] Регистрация FCM-токена: `PUT /api/v1/mobile/devices/{id}/fcm`
- [ ] Обработка data message: `kind`, `id`, `severity`, deep link `seaca://…`
- [ ] Notification channels по severity (critical / high / default)
- [ ] Actions в уведомлении: «Подтвердить» / «Закрыть» problem (operator+)
- [ ] Тестовый push из веб-SAC («Проверить push на устройстве»)
**Зависимость:** SAC worker — `use_push_mobile` в notification policy, `push_notify.py`
---
## v0.5 — Полировка
- [ ] Refresh token rotation (`POST /api/v1/auth/refresh`)
- [ ] Виджет: число open problems
- [ ] Offline-кэш последних N событий (Room)
- [ ] Экран «Моё устройство»: имя, сервер, версия, «Выйти»
- [ ] Минимальная версия приложения (проверка с сервера)
---
## Сервер SAC (отдельный репозиторий) — чеклист v0.6
Эти пункты реализуются в **security-alert-center**, не в Seaca:
- [ ] `mobile_settings`: `devices_allowed`, push min severity (по умолчанию = policy)
- [ ] Таблицы `mobile_devices`, `mobile_enrollment_codes`
- [ ] Веб: **Настройки → Мобильные устройства** — вкл/выкл, коды, список, отзыв, способ логина
- [ ] API enrollment: создать код (admin), погасить, список устройств, revoke
- [ ] JWT refresh + привязка к `device_id`
- [ ] FCM HTTP v1 из worker (service account JSON в `/etc/security-alert-center/`)
- [ ] Audit: выдача кода, enroll, revoke, смена FCM
---
## Не в плане (пока)
- iOS
- UnifiedPush без FCM
- Управление пользователями SAC из телефона
- Настройки Telegram/SMTP с телефона
- Несколько SAC-серверов в одном приложении
---
## KPI
- От события на SAC до push на телефон: p95 &lt; 45 с (как Telegram)
- Pairing по коду: &lt; 2 минут для оператора
- Отзыв устройства: push прекращается в течение 1 минуты