Browse Source

Initial commit: Requirements document and design assets

Added:
- BACKEND.md: Client requirements document in plain language
- map_colors.jpg: Floor plan color scheme reference
- logo.svg: Receiver icon design

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
root 1 month ago
commit
9e08d4ee60
3 changed files with 462 additions and 0 deletions
  1. 437 0
      BACKEND.md
  2. 25 0
      logo.svg
  3. BIN
      map_colors.jpg

+ 437 - 0
BACKEND.md

@@ -0,0 +1,437 @@
+# 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? Сколько железок планируется?

+ 25 - 0
logo.svg

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="400" height="400" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
+  <!-- White background -->
+  <rect width="400" height="400" fill="#FFFFFF"/>
+
+  <!-- Center point (filled circle) at 200,200 -->
+  <circle cx="200" cy="200" r="19" fill="#1CB5D5"/>
+
+  <!-- Circle 1: center (200,200), radius 52, gap at bottom -->
+  <!-- Arc from left gap point to right gap point, going through the top -->
+  <path d="M 185,249.8 A 52,52 0 1,1 215,249.8"
+        fill="none" stroke="#1CB5D5" stroke-width="8" stroke-linecap="round"/>
+
+  <!-- Circle 2: center (200,200), radius 89, gap at bottom -->
+  <path d="M 185,287.7 A 89,89 0 1,1 215,287.7"
+        fill="none" stroke="#1CB5D5" stroke-width="8" stroke-linecap="round"/>
+
+  <!-- Circle 3: center (200,200), radius 126, gap at bottom -->
+  <path d="M 185,325.1 A 126,126 0 1,1 215,325.1"
+        fill="none" stroke="#1CB5D5" stroke-width="8" stroke-linecap="round"/>
+
+  <!-- Circle 4: center (200,200), radius 163, gap at bottom -->
+  <path d="M 185,362.3 A 163,163 0 1,1 215,362.3"
+        fill="none" stroke="#1CB5D5" stroke-width="8" stroke-linecap="round"/>
+</svg>

BIN
map_colors.jpg