Раздел 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 Pool | cdp-pool.js | 339 | ✅ Реализовано |
| Сканер WB | SKILL/scanner_wb.js | 811 | ✅ Реализовано |
| Сканер Ozon | SKILL/scanner_ozon.js | 487 | ✅ Реализовано |
| Сканер YM | SKILL/scanner_ymarket.js | 485 | ✅ Реализовано |
| Обогатитель WB | SKILL/enricher_wb.js | 336 | ✅ Реализовано |
| Обогатитель Ozon | SKILL/enricher_ozon.js | 309 | ✅ Реализовано |
| Обогатитель YM | SKILL/enricher_ymarket.js | 509 | ✅ Реализовано |
| Эмуляция поведения | SKILL/human.js | 304 | ✅ Реализовано |
| База данных | db.js | 488 | ✅ Реализовано |
| REST API | api.js | 462 | ✅ Реализовано |
| Веб-мониторинг | monitor/server.js | 779 | ✅ Реализовано |
| Конфигурация | config.js | 164 | ✅ Реализовано |
| Утилиты | utils.js | 31 | ✅ Реализовано |
Итого 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.
# Промпт для 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
# Промпт для 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.shCOL-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: завершение текущих задач или пометка как failedmonitor/server.js: закрытие WebSocket-подключенийapi.js: закрытие HTTP-сервера
# Промпт для 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 | /health | pool.size > 0, last poll < 30s ago |
| API :3002 | /health | SQLite readable, last query < 5s |
| Monitor :3001 | /health | WebSocket 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_total | gauge | Всего ПК в пуле |
watcher_pool_online | gauge | Онлайн ПК |
watcher_pool_busy | gauge | Занятых ПК |
watcher_scans_total | counter | Сканов выполнено |
watcher_scans_failed | counter | Сканов провалено |
watcher_products_total | gauge | Товаров в базе |
watcher_scan_duration_seconds | histogram | Время сканирования |
COL-009: Миграция SQLite → PostgreSQL
Для масштабирования (если количество продавцов превысит 50–100) рассмотреть миграцию на PostgreSQL. WAL-режим SQLite имеет ограничение: один писатель одновременно.
COL-010: Уведомления в Telegram при ошибках инфраструктуры
Бот уведомляет о задачах, но не о проблемах инфраструктуры:
- ПК отключился и не вернулся > 1 часа
- REST API недоступен
- Диск заполнен > 90%
- SQLite: ошибки записи
8.3 Задачи: Analyzer
Высокий приоритет
ANA-001: FastAPI-роутер
# Промпт для 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.4ANA-002: Дашборд Open WebUI
# Промпт для Claude Code:
#
# Создай интерфейс дашборда Watcher для Open WebUI.
# Дашборд — баннерный, без строки ввода для ИИ.
#
# Структура:
# Строка 1: 4 числовые карточки (продавцы, товары, алерты, последний скан)
# Строка 2: баннеры (Алерты, Ценовые изменения, Каталоги, Обогащённые данные)
# Строка 3: баннеры (Ценовая аналитика, Бестселлеры, Сравнение, Ассортимент)
# Строка 4: баннеры (Статус Collector, Очередь задач) — только Admin
#
# Каждый баннер → отчёт с фильтрами (маркетплейс, продавец, период)
# При клике на продавца → карточка с табами
#
# Технологии: shadcn/ui, Tailwind CSS, Lucide Icons
# Спецификация: Раздел 6.4ANA-003: AI-чат Tools
# Промпт для 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-задачи предгенерации
# Промпт для 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.6ANA-005: PostgreSQL-миграции
# Промпт для Claude Code:
#
# Создай Alembic-миграции для таблиц Watcher Analyzer:
# - watcher_alerts
# - watcher_alert_settings
# - watcher_subscriptions
# - watcher_analytics_cache
#
# SQL-схема: Раздел 6.8Низкий приоритет
ANA-006: Экспорт в XLSX
# Промпт для 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-002 | FRP 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 API | api.js | Средний |
| TD-006 | scanner_wb.js содержит собственную реализацию human-эмуляции (811 строк), дублируя human.js | SKILL/scanner_wb.js | Низкий |
| TD-007 | Нет автоматической ротации логов | logs/ | Низкий |
| TD-008 | frp-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-уведомление |
| Wildberries | Detail API иногда требует PoW | Часть данных enricher недоступна | Fallback на данные сканера |
| Ozon | PoW / Captcha при входе | Требуется установленная cookie-сессия | Ожидание до 60с, retry |
| Ozon | Entrypoint 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
Статус: Актуальный