Skip to main content
Проект: Интеллектуальная система мониторинга цен конкурентов
Модуль: 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 из ChromePython (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Предотвращение коллизий IPRedis
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.ruUSB-модемПарсинг WB
*.ozon.ruUSB-модемПарсинг Ozon
*.yandex.ruUSB-модемПарсинг YM
market.yandex.ruUSB-модемПарсинг YM
VPS IP/32EthernetAPI сервера
0.0.0.0/0EthernetDefault route

1.4.3 IP Semaphore

Логика:
  1. Агент запрашивает задачу
  2. Task Dispatcher проверяет: свободен ли IP агента для целевого домена?
  3. Если да — выдаёт задачу и блокирует ip:{agent_ip}:domain:{domain}
  4. Если нет — возвращает 204 No Content
  5. После завершения задачи — снимает блокировку
TTL блокировки: 5 минут (защита от зависших агентов)

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_tasksdefault20:30 ежедневно
watcher.check_alertsdefault*/15 минут
watcher.cleanup_old_tasksdefault03:00 ежедневно
watcher.sync_agent_statuscritical*/1 минута
watcher.calculate_prioritiesheavy04: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_sessionWebSocket session ID
watcher:stats:dailyДневная статистика24 ч

1.5.5 Notifications

СобытиеУровеньПолучатели
Демпинг-алертwarningManager (по бренду), Senior, Director
Агент offlinewarningAdministrator
CAPTCHA/блокировкаwarningAdministrator
Cookies истеклиwarningAdministrator
Критическая ошибкаcriticalAdministrator

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Извлечение текста документов
Отличия:
ПараметрWatcherLex
ЦелиWB, Ozon, YMКонсультантПлюс, Гарант
РасписаниеЕжедневно 21:00–07:00Выходные + вечера
OutputJSON → PostgreSQLMarkdown → Knowledge Base
CookiesМенеджераНе требуются

1.7 Безопасность

1.7.1 Аутентификация

КомпонентМетодОписание
Open WebUI → MiddlewareJWTСессия пользователя
Agent → APIAPI KeyУникальный ключ агента
WebSocketAPI KeyВ query string при подключении

1.7.2 Авторизация

ДействиеПроверка
Просмотр ценrole ∈ {manager, senior, director, admin}
Добавление SKUrole ∈ {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 onlyWebSocket соединения
IP whitelistОпционально для агентов
Rate limiting100 req/min на агента

1.8 Отказоустойчивость

1.8.1 Сбой агента

1.8.2 Потеря связи агента с сервером

1.8.3 CAPTCHA / Блокировка

1.8.4 Невалидные cookies


1.9 Мониторинг

1.9.1 Метрики агентов

МетрикаОписаниеХранение
agent_statusonline/offline/errorRedis
agent_tasks_completedВыполнено задач за ночьPostgreSQL
agent_tasks_failedОшибки за ночьPostgreSQL
agent_speedURL/минутаRedis
agent_last_activityTimestampRedis
agent_current_taskID текущей задачи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 heartbeat30 секСтатус = offline через 2 мин
API availability1 минАлерт администратору
Redis connection30 секАлерт, fallback
PostgreSQL connection30 секАлерт, retry
AI Parser availability5 минАлерт, очередь накапливается

1.10 Конфигурация

1.10.1 Серверная конфигурация (Environment)

# Database
DATABASE_URL=postgresql://adolf:password@postgres:5432/adolf

# Redis
REDIS_URL=redis://redis:6379/0

# AI
TIMEWEB_AI_URL=https://api.timeweb.cloud/ai/v1
TIMEWEB_AI_KEY=xxx

# Watcher settings
WATCHER_TASK_BATCH_SIZE=100
WATCHER_IP_SEMAPHORE_TTL=300
WATCHER_AGENT_HEARTBEAT_TIMEOUT=120
WATCHER_PANIC_COOLDOWN=3600

# Alerts
WATCHER_ALERT_CHECK_INTERVAL=900

1.10.2 Конфигурация агента (config.yaml)

# Идентификация
agent_id: "AGENT-PC1"
api_key: "watcher_agent_key_xxx"

# Сервер
server:
  api_url: "https://adolf.su/api/v1/watcher"
  ws_url: "wss://adolf.su/ws/watcher"
  timeout: 30
  retry_attempts: 3
  retry_delay: 5

# Сеть
network:
  modem_interface: "Mobile Broadband"
  office_interface: "Ethernet"
  modem_com_port: "COM3"
  modem_baud_rate: 115200

# Расписание
schedule:
  cookies_copy_time: "20:00"
  work_start_time: "21:00"
  work_end_time: "07:00"

# Браузер
browser:
  chrome_profile_path: "C:\\Users\\Manager\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
  headless: true
  user_agent: "Mozilla/5.0 ..."

# Эмуляция (локальные переопределения)
emulation:
  # null = использовать серверные настройки
  min_delay: null
  max_delay: null
  scroll_enabled: null
  mouse_movement: null

# Локальный кэш
cache:
  enabled: true
  max_tasks: 500
  db_path: "./cache.db"

# Логирование
logging:
  level: "INFO"
  file: "./logs/agent.log"
  max_size_mb: 50
  backup_count: 5

1.10.3 Глобальные настройки эмуляции (PostgreSQL)

-- watcher_settings
INSERT INTO watcher_settings (key, value, description) VALUES
('emulation.min_delay_ms', '2000', 'Минимальная задержка между действиями'),
('emulation.max_delay_ms', '5000', 'Максимальная задержка между действиями'),
('emulation.scroll_enabled', 'true', 'Включить эмуляцию скролла'),
('emulation.scroll_steps', '3', 'Количество шагов скролла'),
('emulation.mouse_movement', 'true', 'Включить движения мыши'),
('emulation.mouse_curve', 'bezier', 'Тип кривой движения мыши'),
('emulation.page_view_min_ms', '3000', 'Минимальное время просмотра страницы'),
('emulation.page_view_max_ms', '8000', 'Максимальное время просмотра страницы'),
('emulation.random_order', 'true', 'Случайный порядок обхода URL');

1.11 Масштабирование

1.11.1 Горизонтальное (агенты)

ПараметрМинРекомендуемоМакс
Агентов31015
URL/ночь33 00033 00033 000
URL/агент11 0003 3002 200
URL/мин185.53.7

1.11.2 Вертикальное (сервер)

НагрузкаCPURAMОписание
3-5 агентов24 GBМинимальная
6-10 агентов48 GBРекомендуемая
11-15 агентов416 GBМаксимальная

1.11.3 Ограничения

РесурсЛимитПричина
Агентов15Количество офисных ПК
URL/ночь~50 00010-часовое окно × производительность
AI Parser60 req/minRate limit Timeweb AI

1.12 Диаграмма развёртывания


Приложение А: Контрольные точки архитектуры

КритерийПроверка
Агенты подключаютсяWebSocket сессии активны
Task Dispatcher работаетЗадачи распределяются равномерно
IP Semaphore работаетНет коллизий IP в логах
AI Parser отвечаетВремя ответа < 5 сек
Алерты генерируютсяУведомления приходят в Open WebUI
Данные сохраняютсяЗаписи в price_history появляются
Интеграции работаютMarketing, Scout получают данные

Документ подготовлен: Январь 2026
Версия: 2.0
Статус: Черновик