# MyBeacon - Техническое задание ## О проекте MyBeacon - это платформа для работы с BLE и WiFi сканерами. Платформа **модульная** - можно подключать разные продукты независимо друг от друга. Сейчас планируются два продукта: 1. **WiFi Analytics** - сбор данных о WiFi устройствах для рекламной аналитики 2. **BLE Tracking** - отслеживание BLE меток для контроля персонала и активов В будущем могут появиться другие продукты (например, мониторинг температуры, счетчики посетителей и т.д.). Вся админка и демон железки должны легко расширяться под новые продукты. ## Кто пользуется системой ### 1. Супер-админ - Полный доступ ко всему - Управляет клиентами (организациями) - Управляет железками (может отвязать от клиента, поменять настройки) - Видит все данные ### 2. Клиент (организация) - Это компания, которая покупает услугу - У клиента может быть **несколько пользователей** (сотрудников) - Видит только свои железки и свои данные - Доступ к продуктам включает админ (WiFi, BLE или оба) ### 3. Пользователь клиента - Сотрудник компании-клиента - Имеет **права доступа** (может быть read-only или полный доступ) - Права настраиваются **для каждого объекта** (например: может смотреть данные, но не менять настройки) - Все действия **логируются** (кто, когда, что делал) ## Многопользовательский доступ в организации У одного клиента может работать много людей: - Директор (полный доступ) - Менеджеры (read-only по аналитике) - Техники (доступ к настройкам железок) - Охранники (только просмотр BLE меток на картах) **Требования:** - Владелец организации может добавлять пользователей - Каждому пользователю назначаются роли/права - Права на уровне объектов (может смотреть эту локацию, но не ту) - Логи всех действий: кто куда ходил, что смотрел, что нажимал - Возможность ограничить только чтением (read-only mode) **Роли пользователей в организации:** - **Владелец** (Owner) - полный доступ, управление пользователями - **Администратор** (Admin) - полный доступ к функционалу, но не может управлять пользователями - **Менеджер** (Manager) - доступ к аналитике и отчетам (read-only) - **Оператор** (Operator) - доступ к конкретным локациям/объектам - **Наблюдатель** (Viewer) - только просмотр, ничего не может менять ## Регистрация и управление клиентами ### Вариант 1: Самостоятельная регистрация 1. Клиент заходит на сайт, жмет "Зарегистрироваться" 2. Заполняет форму: email, пароль, название компании, телефон 3. Ему приходит письмо с подтверждением email 4. Кликает по ссылке - email подтвержден 5. Логинится в личный кабинет - видит сообщение "Ожидается активация администратором" 6. **По умолчанию доступа к продуктам НЕТ** (wifi_enabled=false, ble_enabled=false) 7. Админ видит нового клиента в списке "Ожидают активации" 8. Админ включает нужные продукты (WiFi, BLE или оба) - клиенту приходит уведомление 9. Клиент заходит - видит активированные продукты ### Вариант 2: Создание админом 1. Админ создает клиента: email, название, телефон 2. Выбирает какие продукты доступны (WiFi, BLE) 3. Система генерирует пароль, отправляет на email клиента 4. Клиент получает письмо с логином и паролем 5. Логинится - сразу видит активные продукты ## Железки (устройства) ### Простой ID для общения с клиентами Железки имеют MAC адрес (например `38:54:39:4b:1b:ac`), но клиентам так общаться неудобно. **Решение:** Каждой железке присваивается **простой ID** начиная с 1: - Приемник #1 - Приемник #2 - Приемник #3 - ... Когда клиент звонит в поддержку: "У нас проблема с приемником номер 5" - админ по фильтру легко находит его в базе. **Как работает:** - ID назначается автоматически при регистрации железки - ID уникальный в рамках всей системы (не сбрасывается) - В админке можно искать как по MAC, так и по простому ID - Клиенту показывается "Приемник #5", но можно раскрыть и увидеть MAC ### Управление железками **Админ может:** - Видеть все железки (все клиенты) - Фильтровать: по клиенту, по статусу (онлайн/офлайн), по MAC, по простому ID - Привязывать/отвязывать железку к клиенту - Менять настройки любой железки - Открыть SSH терминал (через туннель) - Открыть dashboard железки (через туннель) **Клиент может:** - Видеть только свои железки - Менять настройки (если есть права) - Видеть статус (онлайн/офлайн) - Видеть последнюю активность - Назначать железку на конкретную локацию (для BLE) ## Продукт 1: WiFi Analytics **Для кого:** рекламные агентства, торговые центры, аэропорты - всем кто хочет знать сколько людей проходит мимо. **Что делает:** - Собирает данные о WiFi устройствах (MAC адреса) - Фильтрует фейковые (рандомизированные) MAC адреса - Показывает статистику: уникальные посетители, повторные визиты, время нахождения - Экспортирует данные для рекламщиков **Личный кабинет клиента:** 1. **Dashboard** - Общая статистика за период (сегодня/неделя/месяц) - Уникальные MAC адреса - Фейковые vs настоящие - График по дням/часам - Топ производителей устройств (Apple, Samsung и т.д.) 2. **Мои железки** - Список своих сканеров - Статус (онлайн/офлайн) - Сколько событий собрали за период - Простой ID + MAC адрес 3. **Экспорт данных** - Выбрать период - Выбрать формат (CSV, JSON) - Опции: исключить фейковые MAC - Скачать файл - История экспортов (когда, кто скачал) ## Продукт 2: BLE Tracking **Для кого:** магазины, склады, больницы, офисы - где нужно отслеживать людей или объекты. **Что делает:** - Отслеживает BLE метки (iBeacon) - Показывает на карте где находятся метки - Привязывает метки к людям/объектам ("Марья Ивановна", "Велосипед №5") - История перемещений **Личный кабинет клиента:** ### 1. Локации (объекты) Клиент может иметь несколько объектов: - Магазин на Ленина - Магазин на Пушкина - Склад №3 Для каждой локации: - Название - Адрес - Свои приемники - Свои планы помещений ### 2. Планы помещений **Загрузка плана:** 1. Клиент загружает картинку (JPG/PNG) - растровый план 2. Система автоматически конвертирует в вектор (SVG) 3. Клиент в редакторе может: - Подправить контуры стен - Выделить зоны/комнаты - Добавить подписи - Указать масштаб (сколько метров в одном пикселе) **Цветовая схема (светлая тема):** - Фон: светло-зеленый `#E5F2E5` - Стены/контуры: серо-бежевый `#D4CFC4` - Комнаты: пастельные тона - Бежевый `#F5EFE0` - Персиковый `#FFE8D6` - Голубой `#E0F7FA` - Выделенные зоны: оранжевый контур `#FF9800` - Подписи: черный текст `#000000` *(Для темной темы - потом придумаем)* ### 3. Размещение приемников на плане **Как работает:** 1. Клиент открывает план помещения 2. Видит список своих приемников (по простым ID: Приемник #1, #2, #3...) 3. Перетаскивает иконку приемника на нужное место на карте 4. Приемник показывается как **прямоугольная иконка с логотипом** (logo.svg) 5. Можно повернуть иконку (если направление важно) 6. Сохраняет расположение **Логотип приемника:** - Использовать `logo.svg` (beacon с концентрическими кругами) - Размер: ~32x32px на карте - Цвет: голубой `#1CB5D5` - При наведении - показывает: "Приемник #5 (онлайн)" ### 4. Зоны на плане **Зачем нужны зоны:** С таким железом точная навигация не получится - только определение зоны нахождения. Этого достаточно в большинстве случаев: понять что человек в столовой, на складе или в туалете. **Как рисовать зоны:** 1. Клиент открывает редактор плана 2. Выбирает инструмент "Нарисовать зону" 3. Рисует полигон (многоугольник) поверх плана 4. Зона показывается **полупрозрачной** (например, синий с прозрачностью 30%) 5. Зоне автоматически присваивается номер: Зона #1, Зона #2, Зона #3... 6. Клиент может дать зоне название: "Столовая", "Зал", "Склад", "Туалет", "Задний вход" 7. Сохраняет **Свойства зоны:** - Номер (автоматический, уникальный на плане) - Название (задает клиент) - Цвет (можно выбрать из палитры) - Полигон (координаты вершин) **Примеры зон:** - Зона #1: "Столовая" (голубой) - Зона #2: "Торговый зал" (зеленый) - Зона #3: "Склад" (желтый) - Зона #4: "Туалет" (розовый) - Зона #5: "Задний вход" (оранжевый) **Определение принадлежности метки к зоне:** - Бэк по координатам метки определяет в какой зоне она находится (point-in-polygon) - Если метка видна несколькими приемниками - берется среднее положение - Если не попала ни в одну зону - показывается "Вне зон" **Аналитика по зонам:** - Сколько времени метка провела в каждой зоне - Сколько меток сейчас в каждой зоне - Тепловая карта по зонам (какие зоны самые посещаемые) - Маршруты: Зона #1 → Зона #3 → Зона #2 ### 5. Управление метками (Beacons) **Добавление метки:** - UUID, Major, Minor (технические идентификаторы iBeacon) - Привязать к объекту: - Тип: Человек / Актив / Транспорт - Имя: "Марья Ивановна", "Велосипед №5", "Погрузчик ПГ-12" - Фото (опционально) - Описание **Список меток:** - Поиск по имени - Фильтр по типу - Статус: активна / не видна >10 минут - Последнее местоположение ### 5. Real-time карта **Что видит клиент:** - План помещения - Иконки приемников (с логотипами) на своих местах - **Метки на карте:** - Показываются иконкой (точка или аватарка) - Рядом с меткой: "Марья Ивановна, -65dB" - RSSI показывает силу сигнала (близость к приемнику) - Если метка видна несколькими приемниками - показывается примерная позиция **Обновление:** - Каждые 5-10 секунд карта обновляется - Можно включить автообновление (polling) или WebSocket **История:** - Можно включить "воспроизведение" - как двигалась метка за последний час/день - Тепловая карта (где метка проводила больше времени) ## Туннели (удаленный доступ) ### SSH туннель **Зачем:** админ может подключиться к терминалу железки удаленно (даже если она за NAT). **Как работает:** 1. Админ в списке железок жмет кнопку **[Открыть SSH]** 2. Открывается новая страница с сообщением "Подключение к устройству..." 3. Система: - Включает SSH туннель на железке - Ждет пока железка подключится (до 60 секунд) - Запускает ttyd (веб-терминал) 4. В браузере открывается терминал - админ работает как в SSH 5. При закрытии вкладки - терминал убивается (через 60 секунд grace period) 6. Туннель остается активным (можно переоткрыть терминал) ### Dashboard туннель **Зачем:** админ или клиент может открыть веб-интерфейс железки. **Как работает:** 1. Жмет кнопку **[Открыть Dashboard]** 2. Ожидание подключения... 3. Открывается iframe с dashboard железки 4. Можно смотреть статус, логи, менять настройки прямо на железке ## Права доступа и логирование ### Система прав **На уровне организации:** - Владелец может добавлять/удалять пользователей - Владелец назначает роли - Администратор не может управлять пользователями, но может все остальное **На уровне объектов (для BLE):** - Пользователь может иметь доступ только к определенным локациям - Пример: охранник видит только "Магазин на Ленина", но не видит "Склад №3" - Права: read-only (только смотреть) или read-write (менять настройки) **Матрица прав:** ``` Действие | Owner | Admin | Manager | Operator | Viewer -------------------------|-------|-------|---------|----------|------- Просмотр аналитики | ✓ | ✓ | ✓ | ✓ | ✓ Экспорт данных | ✓ | ✓ | ✓ | ✗ | ✗ Настройки железок | ✓ | ✓ | ✗ | ✓ | ✗ Управление метками | ✓ | ✓ | ✗ | ✓ | ✗ Управление пользователями| ✓ | ✗ | ✗ | ✗ | ✗ Изменение планов | ✓ | ✓ | ✗ | ✓ | ✗ ``` ### Детальное логирование **Что логируется:** - Вход/выход пользователя (timestamp, IP адрес) - Переходы по страницам ("открыл страницу локации X") - Просмотр данных ("посмотрел аналитику за период Y") - Изменения ("изменил настройки железки #5", "привязал метку к человеку") - Экспорты ("скачал CSV с данными за месяц") - Действия с пользователями ("добавил пользователя", "изменил права") **Формат лога:** ``` 2024-01-15 10:30:45 | user@example.com | Просмотр | Локация "Магазин на Ленина" | IP: 192.168.1.100 2024-01-15 10:31:12 | user@example.com | Изменение | Метка #42: "Велосипед №5" → "Велосипед №6" | IP: 192.168.1.100 2024-01-15 10:35:00 | user@example.com | Экспорт | WiFi Analytics, 2024-01-01 - 2024-01-15, CSV | IP: 192.168.1.100 ``` **Где смотреть логи:** - Владелец и Админ видят все логи своей организации - Фильтры: по пользователю, по действию, по дате - Экспорт логов в CSV ## Модульность системы Система должна легко расширяться новыми продуктами. **Принципы:** - Каждый продукт - независимый модуль - Админка - общая (управление клиентами, железками, пользователями) - Демон железки универсальный (можно включать/выключать модули в конфиге) - API универсальное (endpoints группируются по продуктам) **Пример добавления нового продукта "Temperature Monitoring":** 1. В клиентах добавляется флаг `temperature_enabled` 2. В API добавляется группа `/api/v1/client/temperature/*` 3. В демоне железки добавляется модуль сбора температуры 4. Во frontend добавляется раздел "Температура" 5. Админ включает продукт клиенту - тот видит новый раздел **Переиспользование в других проектах:** - Можно взять только админку и использовать для управления любыми IoT устройствами - Можно взять демон железки и адаптировать под другое железо (Raspberry Pi, ESP32) - API спроектировано универсально ## Технический стек ### Backend - **Python + FastAPI** - **PostgreSQL** - клиенты, пользователи, железки, права - **ClickHouse** - события (BLE/WiFi), аналитика - **Redis** - очереди, кеш ### Frontend - **Vue 3 + Vite** - **Vue Router** + **Pinia** - **TailwindCSS** (или Vuetify) ### Деплой - **БЕЗ Docker** (обычный Linux + systemd) - Скрипт установки всех зависимостей - PostgreSQL, ClickHouse, Redis, Nginx - Автоматические миграции БД ## План разработки ### Этап 1: Фундамент (2-3 недели) - Auth (многопользовательский, роли) - Админка: клиенты + пользователи в организациях - Device API (регистрация, конфиг) - Управление железками (с простыми ID) - Background worker: буфер → ClickHouse ### Этап 2: WiFi Analytics (1-2 недели) - WiFi события в ClickHouse - Аналитика (уникальные MAC, фейковые) - Клиентский кабинет WiFi - Экспорт данных ### Этап 3: Tunnels (1 неделя) - SSH + Dashboard туннели - ttyd для веб-терминала - UI: кнопки + ожидание подключения ### Этап 4: BLE Tracking (2-3 недели) - Локации, планы, метки - Загрузка и редактирование планов - Размещение приемников на карте - Real-time отображение меток ### Этап 5: Права и логи (1 неделя) - Детальная система прав - Логирование всех действий - UI для просмотра логов ## Открытые вопросы 1. **Домен**: какой? mybeacon.ru? 2. **Email**: SMTP настройки? Свой сервер или SendGrid? 3. **File storage**: где хранить планы и фото? `/uploads` на сервере? 4. **Real-time BLE**: polling каждые 5 сек или WebSocket? 5. **Экспорт WiFi**: какой формат CSV нужен? Какие поля? 6. **Хранение событий**: сколько хранить в ClickHouse? Год? 7. **Ресурсы сервера**: сколько RAM/CPU? Сколько железок планируется?