Skip to content

Раздел 8: Задачи разработки

Проект: ADOLF — AI-Driven Operations Layer Framework
Модуль: Watcher
Версия: 4.0
Дата: Февраль 2026


8.1 Статус реализации

Collector (VPS, Node.js)

КомпонентФайлСтрокСтатус
Telegram-ботbot.js~400✅ Реализовано
Планировщикscheduler.js~350✅ Реализовано
Оркестраторorchestrator.js~200✅ Реализовано
Исполнитель задачrunner.js~300✅ Реализовано
CDP Poolcdp-pool.js339✅ Реализовано
Сканер WBSKILL/scanner_wb.js811✅ Реализовано
Сканер OzonSKILL/scanner_ozon.js487✅ Реализовано
Сканер YMSKILL/scanner_ymarket.js485✅ Реализовано
Обогатитель WBSKILL/enricher_wb.js336✅ Реализовано
Обогатитель OzonSKILL/enricher_ozon.js309✅ Реализовано
Обогатитель YMSKILL/enricher_ymarket.js509✅ Реализовано
Эмуляция поведенияSKILL/human.js304✅ Реализовано
База данныхdb.js488✅ Реализовано
REST APIapi.js462✅ Реализовано
Веб-мониторингmonitor/server.js779✅ Реализовано
Конфигурацияconfig.js164✅ Реализовано
Утилитыutils.js31✅ Реализовано

Итого Collector: ~6 754 строк кода, 17 файлов. Полностью функционален.

Analyzer (основной сервер, Python)

КомпонентСтатус
Knowledge Pipeline (JSON → Markdown)🔲 Спецификация
Markdown-конвертер🔲 Спецификация
Передача файлов (rsync/NFS)🔲 Спецификация
FastAPI-роутер🔲 Спецификация
Дашборд (баннеры Open WebUI)🔲 Спецификация
AI-чат (Tools)🔲 Спецификация
Celery-задачи (предгенерация)🔲 Спецификация
PostgreSQL-схема (алерты, подписки, кэш)🔲 Спецификация

8.2 Задачи: Collector

Высокий приоритет

COL-001: Knowledge Pipeline

Реализовать модуль конвертации данных Collector → Markdown для передачи в модуль Knowledge.

python
# Промпт для Claude Code:
#
# Создай Node.js модуль knowledge-pipeline.js для Watcher Collector.
# Путь: /opt/watcher/knowledge-pipeline.js
#
# Функциональность:
# 1. triggerPipeline(sellerRowId) — вызывается из runner.js после enrich
# 2. Загрузка product_details из SQLite (db.getProductDetailsBySeller)
# 3. Загрузка products из двух последних сканов (db.getLastTwoScansProducts)
# 4. computeDiff() для ценовых изменений
# 5. Генерация 3 Markdown-файлов:
#    - {mp}_seller_{id}_catalog.md (обогащённый каталог)
#    - {mp}_seller_{id}_diff.md (ценовые изменения)
#    - {mp}_seller_{id}_summary.md (сводка)
# 6. YAML-заголовок с метаданными для RAG (см. Раздел 6.2)
# 7. Запись в /opt/watcher/knowledge/
# 8. Вызов rsync для передачи на основной сервер
#
# Формат документов: см. Раздел 6, секция 6.2
# Зависимости: db.js, utils.js (computeDiff)

COL-002: Автоматический backup

bash
# Промпт для Claude Code:
#
# Создай bash-скрипт /opt/watcher/backup.sh:
# 1. sqlite3 watcher.db ".backup /opt/watcher/backups/watcher_$(date +%F).db"
# 2. Копирование config.json, .env
# 3. tar.gz текущих results/*.json
# 4. Ротация: удаление бэкапов старше 30 дней
# 5. Cron: 0 2 * * * /opt/watcher/backup.sh

COL-003: Logrotate для логов задач

# /etc/logrotate.d/watcher
/opt/watcher/logs/*.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

Средний приоритет

COL-004: Улучшение авторизации Monitor

Текущая реализация: захардкоженные admin / admin в server.js. Необходимо:

  • Чтение логина/пароля из .env или config.json
  • Хэширование пароля (bcrypt или crypto.scryptSync)
  • Таймаут сессии (настраиваемый, по умолчанию 7 дней)

COL-005: Graceful shutdown

Текущие процессы не обрабатывают SIGTERM корректно. Необходимо:

  • cdp-pool.js: освобождение всех занятых ПК
  • bot.js / orchestrator.js: завершение текущих задач или пометка как failed
  • monitor/server.js: закрытие WebSocket-подключений
  • api.js: закрытие HTTP-сервера
python
# Промпт для Claude Code:
#
# Добавь graceful shutdown во все Node.js процессы Watcher:
# - process.on('SIGTERM', async () => { ... })
# - process.on('SIGINT', async () => { ... })
# - Для bot.js: пометить running задачи как failed
# - Для cdp-pool.js: release all busy PCs
# - Для api.js и monitor: server.close()
# - Таймаут: 10 секунд, затем process.exit(1)

COL-006: Health check эндпоинт

Добавить /health в каждый HTTP-сервис для мониторинга через systemd или внешние средства:

СервисПутьПроверки
CDP Pool :3000/healthpool.size > 0, last poll < 30s ago
API :3002/healthSQLite readable, last query < 5s
Monitor :3001/healthWebSocket active, CDP Pool reachable

COL-007: Rate limiting REST API

api.js не имеет rate limiting. При открытии порта наружу (через VPN) необходимо ограничение:

  • 100 запросов/минуту на IP (или глобально)
  • 429 Too Many Requests при превышении

Низкий приоритет

COL-008: Метрики и Prometheus

Экспорт метрик в формате Prometheus для мониторинга:

МетрикаТипОписание
watcher_pool_totalgaugeВсего ПК в пуле
watcher_pool_onlinegaugeОнлайн ПК
watcher_pool_busygaugeЗанятых ПК
watcher_scans_totalcounterСканов выполнено
watcher_scans_failedcounterСканов провалено
watcher_products_totalgaugeТоваров в базе
watcher_scan_duration_secondshistogramВремя сканирования

COL-009: Миграция SQLite → PostgreSQL

Для масштабирования (если количество продавцов превысит 50–100) рассмотреть миграцию на PostgreSQL. WAL-режим SQLite имеет ограничение: один писатель одновременно.

COL-010: Уведомления в Telegram при ошибках инфраструктуры

Бот уведомляет о задачах, но не о проблемах инфраструктуры:

  • ПК отключился и не вернулся > 1 часа
  • REST API недоступен
  • Диск заполнен > 90%
  • SQLite: ошибки записи

8.3 Задачи: Analyzer

Высокий приоритет

ANA-001: FastAPI-роутер

python
# Промпт для Claude Code:
#
# Создай FastAPI-роутер для Watcher Analyzer.
# Файл: /opt/adolf/modules/watcher/router.py
# Prefix: /api/v1/watcher
#
# Эндпоинты дашборда:
#   GET /dashboard/alerts — алерты (из watcher_alerts PG)
#   GET /dashboard/sellers — обзор конкурентов (из Qdrant + PG cache)
#   GET /dashboard/seller/{id}/catalog — каталог продавца
#   GET /dashboard/seller/{id}/enriched — обогащённые данные
#   GET /dashboard/seller/{id}/price-history — история цен
#   GET /dashboard/seller/{id}/diff — diff последних сканов
#   GET /dashboard/analytics/pricing — ценовая аналитика
#   GET /dashboard/analytics/assortment — ассортимент
#   GET /dashboard/analytics/bestsellers — бестселлеры
#   GET /dashboard/analytics/compare — сравнение конкурентов
#   GET /dashboard/analytics/stock — остатки и размеры
#   GET /dashboard/system — статус Collector (admin)
#
# Авторизация: depends=[check_role("manager")]
# Источники: Qdrant (RAG), PostgreSQL (кэш), Collector API (fallback)
# Спецификация: Раздел 6.3-6.4

ANA-002: Дашборд Open WebUI

python
# Промпт для Claude Code:
#
# Создай интерфейс дашборда Watcher для Open WebUI.
# Дашборд — баннерный, без строки ввода для ИИ.
#
# Структура:
#   Строка 1: 4 числовые карточки (продавцы, товары, алерты, последний скан)
#   Строка 2: баннеры (Алерты, Ценовые изменения, Каталоги, Обогащённые данные)
#   Строка 3: баннеры (Ценовая аналитика, Бестселлеры, Сравнение, Ассортимент)
#   Строка 4: баннеры (Статус Collector, Очередь задач) — только Admin
#
# Каждый баннер → отчёт с фильтрами (маркетплейс, продавец, период)
# При клике на продавца → карточка с табами
#
# Технологии: shadcn/ui, Tailwind CSS, Lucide Icons
# Спецификация: Раздел 6.4

ANA-003: AI-чат Tools

python
# Промпт для Claude Code:
#
# Создай набор Open WebUI Tools для AI-чата Watcher.
# Директория: /opt/adolf/tools/
#
# Tools:
#   watcher_get_prices.py — цены по SKU
#   watcher_price_history.py — история цен
#   watcher_compare_competitors.py — сравнение конкурентов
#   watcher_get_alerts.py — алерты
#   watcher_add_subscription.py — добавить подписку
#   watcher_list_subscriptions.py — список подписок
#   watcher_mark_alert_read.py — прочитать алерт
#   watcher_agent_status.py — статус Collector (admin)
#   watcher_agent_command.py — команда Collector (admin)
#   watcher_settings.py — настройки алертов (admin)
#
# Каждый Tool: описание для LLM, параметры, HTTP к Analyzer API
# Спецификация: Раздел 6.5

Средний приоритет

ANA-004: Celery-задачи предгенерации

python
# Промпт для Claude Code:
#
# Создай Celery-задачи для предгенерации отчётов дашборда.
# Файл: /opt/adolf/modules/watcher/tasks.py
#
# Периодические:
#   watcher.pregenerate_alerts — каждый час
#   watcher.pregenerate_pricing — каждые 6 часов
#   watcher.pregenerate_bestsellers — каждые 6 часов
#   watcher.pregenerate_comparison — каждые 6 часов
#   watcher.pregenerate_assortment — каждые 6 часов
#   watcher.sync_knowledge — каждые 30 мин
#   watcher.cleanup_alerts — ежедневно 03:00
#   watcher.collector_health — каждые 5 мин
#
# Каждая задача: запрос данных → агрегация → сохранение в watcher_analytics_cache
# Спецификация: Раздел 6.6

ANA-005: PostgreSQL-миграции

python
# Промпт для Claude Code:
#
# Создай Alembic-миграции для таблиц Watcher Analyzer:
# - watcher_alerts
# - watcher_alert_settings
# - watcher_subscriptions
# - watcher_analytics_cache
#
# SQL-схема: Раздел 6.8

Низкий приоритет

ANA-006: Экспорт в XLSX

python
# Промпт для Claude Code:
#
# Создай Celery-задачу watcher.export_data для экспорта в XLSX.
# Триггер: AI-чат Tool watcher_export (Senior+)
# Параметры: seller_id, marketplace, period, type (catalog/diff/history)
# Библиотека: openpyxl
# Результат: файл в /opt/adolf/exports/, ссылка в ответе чата

8.4 Технический долг

Collector

IDОписаниеФайлПриоритет
TD-001Захардкоженные credentials Monitor (admin/admin)monitor/server.js:33-34Высокий
TD-002FRP auth token в открытом видеcdp-pool.js:10, monitor/server.js:14Средний
TD-003Отсутствие graceful shutdownВсе процессыСредний
TD-004Нет health check эндпоинтовcdp-pool.js, api.js, monitor/server.jsСредний
TD-005Нет rate limiting REST APIapi.jsСредний
TD-006scanner_wb.js содержит собственную реализацию human-эмуляции (811 строк), дублируя human.jsSKILL/scanner_wb.jsНизкий
TD-007Нет автоматической ротации логовlogs/Низкий
TD-008frp-port-memory.json может рассинхронизироваться при крашеmonitor/server.jsНизкий

Код scanner_wb.js (TD-006)

scanner_wb.js (811 строк) — единственный сканер с полностью автономной реализацией human-эмуляции. Сканеры Ozon и YM используют общий модуль human.js. Рефакторинг: перенести общий код в human.js, оставить в scanner_wb.js только WB-специфичную логику. Потенциальное сокращение: ~300 строк.


8.5 Известные ограничения

Маркетплейсы

МаркетплейсОграничениеВлияниеОбходной путь
Wildberries«Почти готово» (anti-bot)Задержка 60с, пользователю нужно нажать кнопкуАвтоматическое ожидание + Telegram-уведомление
WildberriesDetail API иногда требует PoWЧасть данных enricher недоступнаFallback на данные сканера
OzonPoW / Captcha при входеТребуется установленная cookie-сессияОжидание до 60с, retry
OzonEntrypoint API может изменитьсяОбогатитель перестанет работатьМониторинг ответов, алерт
Яндекс.МаркетSmartCaptchaРучное решение, задержкаПауза + Telegram-уведомление
Яндекс.МаркетТребуется SELLER_SLUGНельзя сканировать только по IDРучной ввод slug при добавлении

Инфраструктура

ОграничениеОписаниеКогда критично
SQLite: один писательWAL смягчает, но при конкурентных записях возможен SQLITE_BUSY> 5 параллельных задач
FRP: максимум 100 портовДиапазон 9300–9399> 100 ПК
ПК с Chrome: ресурсоёмкостьКаждый скан занимает ~100% CPU на ПКНе более 1 задачи на ПК
VPS: дисковое пространствоJSON-результаты + логи + SQLiteПри > 100 продавцов × ежедневное сканирование

8.6 Roadmap

v4.1 (ближайшее)

  • COL-001: Knowledge Pipeline (связка Collector → Knowledge)
  • COL-002: Автоматический backup
  • COL-003: Logrotate
  • TD-001: Исправить захардкоженные credentials

v4.2 (следующий этап)

  • ANA-001: FastAPI-роутер Analyzer
  • ANA-002: Дашборд Open WebUI (баннеры)
  • ANA-003: AI-чат Tools
  • ANA-005: PostgreSQL-миграции

v4.3 (стабилизация)

  • COL-005: Graceful shutdown
  • COL-006: Health check
  • COL-007: Rate limiting
  • ANA-004: Celery предгенерация
  • TD-006: Рефакторинг scanner_wb.js → human.js

v5.0 (масштабирование)

  • COL-009: Миграция SQLite → PostgreSQL (при необходимости)
  • COL-008: Prometheus-метрики
  • ANA-006: Экспорт XLSX
  • Push-уведомления (Open WebUI v2.0)
  • Голосовой интерфейс (Groq Whisper + OpenAI TTS)

Документ подготовлен: Февраль 2026
Версия: 4.0
Статус: Актуальный

Документация ADOLF Platform