Модуль: Watcher / Architecture
Версия: 2.0
Дата: Январь 2026
1.1 Обзор архитектуры
Принципы проектирования
| Принцип | Описание |
|---|---|
| Распределённость | Агенты на офисных ПК, сервер на VPS |
| Отказоустойчивость | Выход агента из строя не останавливает систему |
| Масштабируемость | От 3 до 15 агентов без изменения архитектуры |
| Защита от блокировок | Множество IP, эмуляция поведения, cookies менеджеров |
| AI-first | Извлечение данных через LLM, без CSS-селекторов |
Общая схема
1.2 Компоненты системы
1.2.1 Клиентская часть (Office)
| Компонент | Назначение | Технология |
|---|---|---|
| Watcher Agent | Основное приложение парсинга | Python + Playwright |
| Browser Cloner | Копирование cookies из Chrome | Python (sqlite3, cryptography) |
| Network Switcher | Переключение сетевых интерфейсов | Python (subprocess, netsh) |
| Modem Controller | Управление USB-модемом | Python (pyserial, AT-commands) |
| Local Cache | Кэш задач при потере связи | SQLite |
1.2.2 Серверная часть (VPS)
| Компонент | Назначение | Технология |
|---|---|---|
| REST API | Получение задач, отправка результатов | FastAPI |
| WebSocket Server | Команды управления агентами | FastAPI WebSocket |
| Task Dispatcher | Распределение задач между агентами | Python |
| IP Semaphore | Предотвращение коллизий IP | Redis |
| AI Parser | Извлечение данных из текста | GPT-5 mini |
| Alert Engine | Генерация демпинг-алертов | Python |
| Celery Workers | Фоновые задачи | Celery |
| Celery Beat | Планировщик задач | Celery Beat |
1.2.3 Хранилища данных
| Хранилище | Назначение | Данные |
|---|---|---|
| PostgreSQL | Основное хранилище | Агенты, задачи, история цен, подписки, конкуренты |
| Redis | Оперативные данные | Очередь задач, IP Semaphore, сессии WebSocket |
1.3 Потоки данных
1.3.1 Поток получения задачи
1.3.2 Поток отправки результата
1.3.3 Поток команд управления
1.3.4 Поток копирования cookies
1.4 Сетевая архитектура
1.4.1 Split Tunneling
1.4.2 Таблица маршрутизации агента
| Назначение | Маска | Интерфейс | Примечание |
|---|---|---|---|
*.wildberries.ru | — | USB-модем | Парсинг WB |
*.ozon.ru | — | USB-модем | Парсинг Ozon |
*.yandex.ru | — | USB-модем | Парсинг YM |
market.yandex.ru | — | USB-модем | Парсинг YM |
| VPS IP | /32 | Ethernet | API сервера |
0.0.0.0 | /0 | Ethernet | Default route |
1.4.3 IP Semaphore
Логика:- Агент запрашивает задачу
- Task Dispatcher проверяет: свободен ли IP агента для целевого домена?
- Если да — выдаёт задачу и блокирует
ip:{agent_ip}:domain:{domain} - Если нет — возвращает 204 No Content
- После завершения задачи — снимает блокировку
1.5 Зависимости от ADOLF Core
1.5.1 Middleware
Функции Middleware для Watcher:| Функция | Описание |
|---|---|
| Авторизация пользователей | Проверка роли (Manager+) для Open WebUI |
| Фильтрация по бренду | brand_id injection в запросы |
| Проксирование | Маршрутизация /api/v1/watcher/* |
| Аудит | Логирование действий пользователей |
1.5.2 PostgreSQL
Watcher добавляет следующие таблицы в общую БД:| Таблица | Назначение |
|---|---|
watcher_agents | Реестр агентов |
watcher_tasks | Очередь и история задач |
watcher_competitors | Конкуренты |
watcher_subscriptions | Подписки на мониторинг SKU |
watcher_price_history | История цен |
watcher_alerts | Демпинг-алерты |
watcher_settings | Настройки модуля |
1.5.3 Celery
Watcher использует общую инфраструктуру Celery:| Задача | Очередь | Расписание |
|---|---|---|
watcher.generate_tasks | default | 20:30 ежедневно |
watcher.check_alerts | default | */15 минут |
watcher.cleanup_old_tasks | default | 03:00 ежедневно |
watcher.sync_agent_status | critical | */1 минута |
watcher.calculate_priorities | heavy | 04:00 ежедневно |
1.5.4 Redis
| Ключ | Назначение | TTL |
|---|---|---|
watcher:task_queue:{marketplace} | Очередь задач по маркетплейсам | — |
watcher:ip_semaphore:{ip}:{domain} | Блокировка IP для домена | 5 мин |
watcher:agent:{id}:status | Текущий статус агента | 2 мин |
watcher:agent:{id}:ws_session | WebSocket session ID | — |
watcher:stats:daily | Дневная статистика | 24 ч |
1.5.5 Notifications
| Событие | Уровень | Получатели |
|---|---|---|
| Демпинг-алерт | warning | Manager (по бренду), Senior, Director |
| Агент offline | warning | Administrator |
| CAPTCHA/блокировка | warning | Administrator |
| Cookies истекли | warning | Administrator |
| Критическая ошибка | critical | Administrator |
1.6 Интеграция с модулями-потребителями
1.6.1 Marketing
1.6.2 Scout
1.6.3 Content Factory (v2.0)
1.6.4 Lex
Lex использует инфраструктуру Watcher:| Компонент Watcher | Использование в Lex |
|---|---|
| Agent | Парсинг КонсультантПлюс, Гарант |
| Task Dispatcher | Распределение задач парсинга |
| Browser Cloner | Не используется (публичный доступ) |
| AI Parser | Извлечение текста документов |
| Параметр | Watcher | Lex |
|---|---|---|
| Цели | WB, Ozon, YM | КонсультантПлюс, Гарант |
| Расписание | Ежедневно 21:00–07:00 | Выходные + вечера |
| Output | JSON → PostgreSQL | Markdown → Knowledge Base |
| Cookies | Менеджера | Не требуются |
1.7 Безопасность
1.7.1 Аутентификация
| Компонент | Метод | Описание |
|---|---|---|
| Open WebUI → Middleware | JWT | Сессия пользователя |
| Agent → API | API Key | Уникальный ключ агента |
| WebSocket | API Key | В query string при подключении |
1.7.2 Авторизация
| Действие | Проверка |
|---|---|
| Просмотр цен | role ∈ {manager, senior, director, admin} |
| Добавление SKU | role ∈ {manager, senior, director, admin} |
| Настройка алертов | role = admin |
| Управление агентами | role = admin |
| Выполнение задач | valid api_key |
1.7.3 Защита данных
| Данные | Защита |
|---|---|
| Cookies менеджеров | Локальное хранение, не передаются на сервер |
| API Keys | Хеширование в БД, передача по HTTPS |
| Результаты парсинга | Шифрование в transit (TLS) |
| История цен | Фильтрация по brand_id |
1.7.4 Сетевая безопасность
| Мера | Описание |
|---|---|
| HTTPS only | Все API endpoints |
| WSS only | WebSocket соединения |
| IP whitelist | Опционально для агентов |
| Rate limiting | 100 req/min на агента |
1.8 Отказоустойчивость
1.8.1 Сбой агента
1.8.2 Потеря связи агента с сервером
1.8.3 CAPTCHA / Блокировка
1.8.4 Невалидные cookies
1.9 Мониторинг
1.9.1 Метрики агентов
| Метрика | Описание | Хранение |
|---|---|---|
agent_status | online/offline/error | Redis |
agent_tasks_completed | Выполнено задач за ночь | PostgreSQL |
agent_tasks_failed | Ошибки за ночь | PostgreSQL |
agent_speed | URL/минута | Redis |
agent_last_activity | Timestamp | Redis |
agent_current_task | ID текущей задачи | Redis |
1.9.2 Метрики системы
| Метрика | Описание |
|---|---|
total_tasks_queued | Задач в очереди |
total_tasks_completed | Выполнено за период |
total_tasks_failed | Ошибок за период |
avg_parse_time | Среднее время парсинга |
captcha_rate | % CAPTCHA от общего числа |
alert_count | Сгенерировано алертов |
1.9.3 Health Checks
| Проверка | Интервал | Действие при сбое |
|---|---|---|
| Agent heartbeat | 30 сек | Статус = offline через 2 мин |
| API availability | 1 мин | Алерт администратору |
| Redis connection | 30 сек | Алерт, fallback |
| PostgreSQL connection | 30 сек | Алерт, retry |
| AI Parser availability | 5 мин | Алерт, очередь накапливается |
1.10 Конфигурация
1.10.1 Серверная конфигурация (Environment)
1.10.2 Конфигурация агента (config.yaml)
1.10.3 Глобальные настройки эмуляции (PostgreSQL)
1.11 Масштабирование
1.11.1 Горизонтальное (агенты)
| Параметр | Мин | Рекомендуемо | Макс |
|---|---|---|---|
| Агентов | 3 | 10 | 15 |
| URL/ночь | 33 000 | 33 000 | 33 000 |
| URL/агент | 11 000 | 3 300 | 2 200 |
| URL/мин | 18 | 5.5 | 3.7 |
1.11.2 Вертикальное (сервер)
| Нагрузка | CPU | RAM | Описание |
|---|---|---|---|
| 3-5 агентов | 2 | 4 GB | Минимальная |
| 6-10 агентов | 4 | 8 GB | Рекомендуемая |
| 11-15 агентов | 4 | 16 GB | Максимальная |
1.11.3 Ограничения
| Ресурс | Лимит | Причина |
|---|---|---|
| Агентов | 15 | Количество офисных ПК |
| URL/ночь | ~50 000 | 10-часовое окно × производительность |
| AI Parser | 60 req/min | Rate limit Timeweb AI |
1.12 Диаграмма развёртывания
Приложение А: Контрольные точки архитектуры
| Критерий | Проверка |
|---|---|
| Агенты подключаются | WebSocket сессии активны |
| Task Dispatcher работает | Задачи распределяются равномерно |
| IP Semaphore работает | Нет коллизий IP в логах |
| AI Parser отвечает | Время ответа < 5 сек |
| Алерты генерируются | Уведомления приходят в Open WebUI |
| Данные сохраняются | Записи в price_history появляются |
| Интеграции работают | Marketing, Scout получают данные |
Документ подготовлен: Январь 2026
Версия: 2.0
Статус: Черновик