Не хотите читать всё это?
Просто скиньте в любой ИИ-чат (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.