Обзор системы
Назначение
TVIP Provisioning Service — это система автоматической конфигурации TVIP-приставок через механизм provisioning. Сервис обрабатывает запросы от приставок, управляет конфигурациями и предоставляет API для администрирования.
Принцип работы
Общая схема работы
TVIP-приставка делает запрос
/prov/tvip_provision.xmlс заголовкомMac-AddressBackend проверяет наличие устройства в базе данных
Если устройство отсутствует — создаётся новая запись и возвращается дефолтная конфигурация
Если устройство существует — возвращается его кастомная конфигурация или дефолтная
Администратор может управлять конфигурациями через API или веб-интерфейс
Диаграмма взаимодействия
Архитектурные принципы
Clean Architecture
Проект построен на основе Clean Architecture с чётким разделением на слои:
Domain Layer — доменные сущности, value objects, интерфейсы репозиториев
Application Layer — use cases с бизнес-логикой
Infrastructure Layer — реализация репозиториев, БД, DI
Presentation Layer — REST API endpoints
Dependency Injection
Используется встроенный механизм FastAPI Depends() для инжекции зависимостей.
Провайдеры зарегистрированы в infrastructure/di/injection.py.
Repository Pattern
Абстракция доступа к данным через интерфейсы репозиториев позволяет легко заменять реализацию хранилища.
Технологический стек
Backend
Python 3.9+ — язык программирования
FastAPI — веб-фреймворк для REST API
SQLAlchemy 2.0 — ORM для работы с PostgreSQL
Pydantic — валидация данных
asyncpg — асинхронный драйвер для PostgreSQL
xmltodict — сериализация конфигураций в XML
pydash — работа с вложенными структурами (dot notation)
Uvicorn — ASGI сервер
Frontend
React 18 — UI библиотека
Vite — сборщик и dev сервер
Axios — HTTP клиент
React Router — маршрутизация
Инфраструктура
PostgreSQL — СУБД
Docker — контейнеризация
Docker Compose — оркестрация контейнеров
Nginx — reverse proxy
Supervisord — управление процессами в контейнере
Форматы данных
XML конфигурация
TVIP-приставки получают конфигурацию в формате XML. Корневой элемент — <provision>.
Пример структуры:
<?xml version="1.0" encoding="UTF-8"?>
<provision reload="86400">
<operator name="MyOperator"/>
<time tz="Europe/Moscow" ntp="pool.ntp.org"/>
<tv_protocols default="stalker">
<protocol type="stalker" server="http://portal.example.com"/>
</tv_protocols>
</provision>
Dot notation
Для API используется формат dot notation — плоское представление XML структуры с точками для навигации по иерархии.
Атрибуты обозначаются префиксом @.
Пример:
{
"provision.@reload": "86400",
"provision.operator.@name": "MyOperator",
"provision.time.@tz": "Europe/Moscow",
"provision.time.@ntp": "pool.ntp.org",
"provision.tv_protocols.@default": "stalker",
"provision.tv_protocols.protocol.@type": "stalker",
"provision.tv_protocols.protocol.@server": "http://portal.example.com"
}
Метаданные устройства
Система хранит следующую информацию об устройствах:
MAC-адрес — уникальный идентификатор (формат
XX:XX:XX:XX:XX:XX)IP-адрес — последний известный IP
Модель приставки — строка из заголовка
tvip-modelВремя последней активности — последний запрос конфигурации
ID кастомной конфигурации — ссылка на индивидуальную конфигурацию (если установлена)
Сценарии использования
Базовое развертывание
Для типичного развертывания требуется:
Настроить DNS или hosts файл для перенаправления
tvipupdate.netна IP сервераЗапустить систему через Docker Compose
Настроить дефолтную конфигурацию через API или веб-интерфейс
TVIP-приставки автоматически получат конфигурацию при подключении
Управление устройствами
Просмотр списка зарегистрированных устройств
Фильтрация по IP, модели, времени активности
Настройка индивидуальной конфигурации для конкретной приставки
Сброс к дефолтной конфигурации
Управление конфигурациями
Получение и изменение дефолтной конфигурации
Частичное обновление параметров (PATCH-like через PUT с dot notation)
Полная замена конфигурации
Экспорт/импорт конфигураций
Мониторинг
Отслеживание активности устройств (Требует реализации)
Проверка времени последнего обращения
Аудит изменений конфигураций (Требует реализации)
Ограничения и требования
Сетевые требования
TVIP-приставки должны иметь доступ к серверу на порту 7373 (или 80/443 при использовании nginx)
Необходима подмена DNS записи
tvipupdate.netили настройка hosts файла на приставках
Производительность
Точное оценивание нагрузки зависит от количества устройств и частоты запросов. Пока что не было возможность провести полноценное тестирование под нагрузкой. (Все тесты упирались в железо. Поэтому количестро rps невозможно указать.)
Но из рекомендаций можно выделить следующее:
PostgreSQL должна быть настроена для работы с большим количеством одновременных подключений
Рекомендуется использовать connection pooling
Для высоконагруженных систем рассмотреть масштабирование backend через Kubernetes
Безопасность
API не имеет встроенной аутентификации (рекомендуется настроить на уровне nginx)
База данных должна быть доступна только внутри Docker сети
Рекомендуется использовать HTTPS для production окружения
Следующие шаги
Быстрый старт — быстрый старт для разработчиков
Развертывание — инструкции по развертыванию
API Reference — полная документация REST API
Архитектура системы — детальное описание архитектуры