Установка Data Agent

Не хотите читать всё это?

Просто скиньте в любой ИИ-чат (Claude, ChatGPT и т.д.) ссылку на https://pastukhov.com/agents/data/install.md или на https://pastukhov.com/llms.txt и попросите сгенерировать конфигурационные файлы и команды. Он прочитает документацию, задаст несколько вопросов о вашей настройке и выдаст готовую конфигурацию. Экономьте время — пусть модель читает за вас.

Вы также можете связаться со мной через Telegram — я всегда рад помочь. И это не просто вежливость — мне действительно нравится общаться с единомышленниками, особенно если вы так же увлечены программированием, как и я.

Data Agent — веб-приложение для сбора и подготовки данных, которое разворачивается на вашем сервере одним Docker-контейнером. В образ уже встроено окружение Python, в котором выполняются скрипты агента. Каталог с содержимым агента (скрипты и настройки источников) монтируется отдельно — это тот же каталог, на котором работает Pastukhov Agent, поэтому оба продукта видят одни и те же файлы.

Минимальные требования

Достаточно любого Linux-хоста с Docker. Всё остальное уже в образе:

  • веб-сервер приложения (ASP.NET Core 9);
  • окружение Python со всеми зависимостями для работы с данными (pandas, pyarrow, SQLAlchemy);
  • инструменты для файловых операций с данными.

СУБД не нужна: по умолчанию данные приложения хранятся во встроенной SQLite в volume /apps/data. PostgreSQL подключается одной переменной окружения, если она у вас уже есть.

Приложение экономно расходует ресурсы сервера. В простое процессор не нагружается: планировщик и сборщики не опрашивают базу по таймеру, а просыпаются, когда появляется работа. Через 15 минут без активности освобождается занятая память — поисковый индекс и служебные данные; при новой задаче всё поднимается само. Поэтому Data Agent спокойно соседствует с другими сервисами на одном сервере.

Docker Compose

Создайте файл compose.yml и запустите docker compose up -d:

services:
  dataagent-ru:
    image: maxpastukhov/data-agent:min-latest
    container_name: dataagent-ru
    ports:
      - "8081:8080"
    volumes:
      # Постоянные данные приложения: база, ключи, лицензия, браузеры
      - ./data-ru:/apps/data
      # Версионируемый каталог: скрипты агента (scripts/) и настройки источников (sources/)
      - ../../apps/data:/project/apps/data
      # Корень Lakehouse — данные организованы по проектам и источникам
      - /data:/data
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:8080
      # Пусто = SQLite /apps/data/data.db; строка подключения — PostgreSQL
      - DATA_APP_DB=
      - DATA_APP_BRAND=pastukhov
      # Связь с Pastukhov Agent для чата
      - AGENT_API_URL=
      - AGENT_API_KEY=
      # SHA-256-хэш ключа для агентских API /api/agent/*
      - DATA_APP_HASH=
      # встроенное окружение Python в образе
      - DATA_APP_PYTHON=/app/venv/bin/python
    restart: unless-stopped
    sysctls:
      fs.inotify.max_user_watches: "524288"
      fs.inotify.max_user_instances: "512"

После запуска интерфейс будет доступен на порту 8081: http://localhost:8081.

В compose три монтирования:

  • ./data-ru:/apps/data — постоянные данные приложения: база, ключи, лицензия, браузеры;
  • ../../apps/data:/project/apps/data — версионируемый каталог: скрипты агента (scripts/) и настройки источников (sources/). Это тот же каталог на хосте, с которым работает Pastukhov Agent, — агент и приложение видят одни файлы;
  • /data:/data — корень Lakehouse: собранные данные, организованные по проектам и источникам.

Sysctls повышают лимиты отслеживания файлов (inotify) — они нужны, чтобы изменения, которые агент вносит в скрипты, подхватывались мгновенно, без перезагрузки. Без этих лимитов на большом объёме файлов часть изменений может быть не замечена.

Окружение Python встроено прямо в образ: при старте контейнер сверяет список библиотек из requirements.txt и доустанавливает недостающие, а при работе приложение проверяет этот файл перед каждым запуском скрипта и ставит то, что изменилось, — без перезапуска и пересборки. Агенту достаточно дописать библиотеку в файл, всё остальное произойдёт само.

Переменные окружения

  • DATA_APP_BRAND — бренд и язык интерфейса: pastukhov (русский) или xedant (английский, по умолчанию).
  • DATA_APP_DB — путь к базе SQLite или строка подключения PostgreSQL. Пусто = SQLite /apps/data/data.db.
  • AGENT_API_URL и AGENT_API_KEY — адрес и API-ключ Pastukhov Agent для чата. Без них раздел «Чаты» скрыт, всё остальное работает.
  • DATA_APP_HASH — SHA-256-хэш ключа, которым агент ходит в агентские API /api/agent/*. Без него эти API закрыты.
  • DATA_APP_PYTHON — интерпретатор Python для запусков скриптов (по умолчанию /app/venv/bin/python — встроенный в образ).
  • DATA_APP_DATA — папка постоянных данных приложения: база, ключи, лицензия, браузеры (по умолчанию /apps/data);
  • DATA_APP_CONFIG_PATH — каталог с версионируемым содержимым: скрипты и настройки источников (по умолчанию /project/apps/data);
  • DATA_APP_LAKEHOUSE_PATH — корень Lakehouse, где лежат собранные данные (по умолчанию /data);
  • DATA_APP_SCRIPTS_PATH — папка скриптов агента (по умолчанию /project/apps/data/scripts);
  • DATA_APP_TMP_FOLDER — временные файлы: рабочие папки запусков и служебные данные (по умолчанию /tmp/agent, очищаются сами);
  • DATA_APP_ENV_FILE — путь к файлу с переменными окружения (по умолчанию /project/.env, о нём ниже);
  • DATA_APP_HARVEST_FOLDER — папка для скачанных сборщиками файлов (по умолчанию /tmp/agent/harvest).
  • DATA_APP_HARVEST_RETENTION_HOURS — сколько часов хранить скачанные файлы до автоматической уборки (по умолчанию 48).
  • DATA_APP_PLAYWRIGHT_BROWSERS — папка, куда ставятся браузеры для загрузки страниц (по умолчанию /apps/data/ms-playwright).
  • DATA_APP_SEARCH_INDEX_FOLDER — папка поискового индекса по скриптам (по умолчанию /apps/data/search-index);
  • DATA_APP_CLICKHOUSE_URL — строка подключения ClickHouse: опциональный сбор статистики запусков. Пусто = выключено.
  • DATA_APP_INSTANCE — имя экземпляра для статистики (по умолчанию — имя машины);
  • DATA_APP_BASE_PATH — размещение в подпапке вашего домена (например, /dataagent); пусто = приложение на корне домена;
  • DATA_APP_SSL и связанные — включение HTTPS собственным сертификатом; пусто = только HTTP;
  • DATA_APP_ERROR_REPORTING — 0 отключает автоматические отчёты об ошибках (по умолчанию включены);
  • AGENT_LICENSE — лицензионный ключ продукта (или активация в интерфейсе).

Важно: DATA_APP_HASH — это SHA-256-хэш ключа, а не сам ключ. Хэш вычисляется командой echo -n "ключ" | sha256sum, и именно это значение Pastukhov Agent передаёт в заголовке X-API-Key. Ключ в открытом виде в переменной не хранится.

Файл .env

Переменные окружения не обязательно задавать только в compose. В корне проекта может лежать файл .env — обычные строки вида КЛЮЧ=ЗНАЧЕНИЕ. Приложение читает его при старте и перечитывает на лету: изменили строку — новое значение применилось без перезапуска. В этом же файле держат пароли и ключи к внешним сервисам: скрипты получают их при запуске и потому не нуждаются в них в коде. Один файл — и настройки приложения, и секреты источников.

Два правила: значение, уже заданное в окружении контейнера, всегда важнее файла (переменные из compose файл не перезапишет), а сам файл с паролями в Git не хранят. Путь к файлу меняется переменной DATA_APP_ENV_FILE.

По умолчанию логин и пароль не задаются заранее. При первом запуске приложение открыто для регистрации: первый созданный аккаунт становится администратором. После этого регистрация закрывается. Если удобнее подготовить доступ заранее (например, для развёртывания без ручного шага), задайте пару DATA_APP_LOGIN и DATA_APP_PASSWORD: логин обычным текстом, а пароль — его SHA-256-хэшем (генератор есть на странице входа). Задавать нужно обе переменные; если они не заданы, действует саморегистрация. Пароли хранятся в виде SHA-256-хэшей, сессия работает через JWT-токены (90 дней), настройки интерфейса — тёмная тема, язык, размер шрифта — задаются каждым пользователем отдельно.

Настройка после запуска

  • Чат с агентом: задайте AGENT_API_URL и AGENT_API_KEY — появятся раздел «Чаты» и боковая панель с агентом на всех страницах. Список моделей и навыков агент отдаёт сам.
  • Агентские API (/api/agent/*): задайте DATA_APP_HASH — агент сможет управлять скриптами, запусками, расписанием и запросами к данным из своего чата. Для этого Pastukhov Agent должен работать на том же каталоге, где лежат скрипты (apps/data/scripts), — обе стороны видят одни файлы.
  • Лицензия: активируется ключом в интерфейсе (диалог лицензии) или переменной AGENT_LICENSE. Без действующей лицензии не работают отправка сообщений агенту и управление очередью промптов; запуски, планировщик, Lakehouse и просмотр данных работают.

Массовый сбор: браузеры и пакеты

Сборщики (харвестеры) умеют забирать страницы даже с сайтов, которые защищаются от ботов. Всё нужное для этого доустанавливается само при первом использовании: пакеты Python — trafilatura (преобразование страниц в текст) и nodriver (недетектируемый браузер) — в окружение Python, а сами браузеры — в папку /apps/data/ms-playwright (меняется переменной DATA_APP_PLAYWRIGHT_BROWSERS). Ставить что-либо вручную не нужно.

Первый такой сбор после свежей установки идёт дольше — он ждёт установки. Дальше всё работает мгновенно. Скачанные файлы лежат в папке /tmp/agent/harvest (меняется переменной DATA_APP_HARVEST_FOLDER), а уборщик удаляет их через двое суток (срок — переменная DATA_APP_HARVEST_RETENTION_HOURS). Папка лежит во временном хранилище контейнера, поэтому пересоздание контейнера её очищает — скачанные файлы и задуманы как временный материал.

Хранение данных

Данные разложены по четырём местам — по сроку их жизни:

  • /apps/data (volume) — постоянные данные приложения: база, ключи, лицензия, браузеры, поисковый индекс по скриптам. Переживают пересоздание контейнера. Индекс — не данные, а ускоритель поиска: папку можно удалить, она соберётся заново (меняется переменной DATA_APP_SEARCH_INDEX_FOLDER);
  • /data — корень Lakehouse: собранные данные по проектам и источникам (Parquet, SQLite, README, логи). Это обычная папка на вашем диске, переносится копированием;
  • /project/apps/data — каталог с версионируемым содержимым: скрипты агента (scripts/) и настройки источников (sources/). Его можно копировать, версионировать в Git, отдать агенту отдельным репозиторием;
  • /tmp/agent — временные файлы: рабочие папки запусков и скачанные сборщиками страницы. Пересоздание контейнера их очищает — так и задумано.

Обновление

Обновление — две команды: git pull, затем docker compose pull && docker compose up -d. Volume /apps/data переживает обновление, миграции схемы выполняются автоматически при старте. Откат — указанием предыдущего тега образа и восстановлением резервной копии /apps/data.

← Вернуться на главную раздела Data Agent