---
title: "Установка Research Agent"
id: "1316"
type: "page"
slug: "install"
published_at: "2026-08-15T22:44:36+00:00"
modified_at: "2026-10-04T01:19:14+00:00"
url: "https://pastukhov.com/agents/research/install"
markdown_url: "https://pastukhov.com/agents/research/install.md"
excerpt: "Research Agent — веб-приложение для глубоких онлайн-исследований, планирования и документирования, которое работает на вашем сервере.…"
---

# Установка Research Agent

[https://pastukhov.com/agents/research/install.md](https://pastukhov.com/agents/research/install.md)

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

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

 Research Agent — веб-приложение для глубоких онлайн-исследований, планирования и документирования, которое работает на вашем сервере. Разворачивается одним Docker-контейнером, данные и дерево исследований лежат в двух постоянных томах: `/apps/research` — база, ключи и скачанные страницы, `/project/apps/research` — отчёты, планы и настройки сервисов. Интеграция с Pastukhov Agent опциональна и включается двумя переменными окружения.

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

Достаточно любого Linux-хоста с Docker. База SQLite встроена — PostgreSQL подключается опционально через переменную окружения.

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

Для полной функциональности понадобятся (настраиваются в интерфейсе после запуска, не в переменных окружения):

- API-ключ хотя бы одного поискового провайдера — Serper, Keenable, Brave или Tavily (или собственный SearXNG, или JSON SEO — выдача Яндекса, Google или Bing);
- API-ключ LLM-провайдера для извлечения данных — любой OpenAI-совместимый сервис.

## Docker Compose

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

```
services:
  research-agent:
    image: maxpastukhov/research-agent:min-latest
    container_name: research-agent
    ports:
      - "3978:80"
    volumes:
      - research-agent-data:/apps/research
      - research-agent-docs:/project/apps/research
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80
      - RESEARCH_APP_DATA=/apps/research
      - RESEARCH_APP_DOCS_FOLDER=/project/apps/research
    restart: unless-stopped

volumes:
  research-agent-data:
  research-agent-docs:
```

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

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

Все переменные опциональны — приложение запускается и работает без единой из них:

- **RESEARCH_APP_DATA** — папка постоянных данных: база, ключи, скачанные страницы (по умолчанию `/apps/research`);
- **RESEARCH_APP_DOCS_FOLDER** — папка дерева исследований, которое видно в интерфейсе (по умолчанию `/project/apps/research`). Отдельный том: содержимое документов в образ не вшивается, а папку видно снаружи контейнера — её удобно положить в git или скопировать на другой сервер;
- **RESEARCH_APP_DB** — путь к SQLite-файлу (по умолчанию `/apps/research/data.db`) или строка подключения PostgreSQL вида `Host=...;Port=...;Database=...`.
- **RESEARCH_APP_HASH** — включает agent API (`/api/agent/*`) для вызовов из внешних агентов: они передают ключ в заголовке `X-API-Key`. Без переменной API возвращает 503. Это отдельный механизм — не связан с JWT-аутентификацией веб-интерфейса.
- **RESEARCH_APP_FETCH_FOLDER** — папка для скачанного Markdown (по умолчанию `/apps/research/fetch`). Файлы раскладываются по датам: `{folder}/yyyy-MM-dd/{domain}_{slug}_{hash8}.md`.
- **RESEARCH_APP_SETTINGS_FILE** — путь к файлу настроек сервисов (по умолчанию `{корень документов}/settings.yml`). Подробнее — в разделе [Сервисы и модели](/agents/research/docs/services) .
- **RESEARCH_APP_ENV_FILE** — путь к файлу с переменными окружения (по умолчанию `/project/.env`). Файл читается при запуске и перечитывается на лету — подробнее в разделе «Файл .env в папке проекта» ниже.
- **AGENT_API_URL** и **AGENT_API_KEY** — включают интеграцию с Pastukhov Agent: кнопки «Вызвать агента» и Edit with AI на страницах исследований, чаты агента и общую очередь промптов. Задаются вместе, иначе функции скрыты. Исходящий запрос идёт в `{AGENT_API_URL}/api/remote/chats`.
- **RESEARCH_APP_ERROR_REPORTING** — отправка ошибок в Sentry. Установите `0` для отключения.
- **ASPNETCORE_URLS** — порт внутри контейнера (по умолчанию `http://+:80`).
- **RESEARCH_APP_SSL** — автоматический HTTPS: значение `auto` включает генерацию самоподписанного сертификата и HTTPS-порт (по умолчанию — следующий за HTTP-портом).
- **RESEARCH_APP_BASE_PATH** — подпапка, по которой размещён интерфейс (например, `/research`), если приложение публикуется за прокси по адресу вида `example.com/research`.
- **RESEARCH_APP_CLICKHOUSE_URL** — строка подключения к внешней базе ClickHouse (например, `Host=...;Port=8123;Username=...;Password=...`). Включает фоновую выгрузку статистики исследований в эту базу — если вы хотите вести собственную аналитику за пределами приложения. База и таблица создаются автоматически при первом запуске; пока переменная не задана, выгрузки нет.
- **SSO_PROXY_TOKEN** — общий секрет единого входа (SSO), когда несколько сервисов стоят за одним шлюзом (например, nginx): пользователь, уже вошедший на шлюз, попадает в Research Agent автоматически, без второго логина. Пользователь группы `manager` получает права администратора. Без секрета работает обычный вход с логином и паролем.

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

Постоянные данные живут в двух томах и переживают пересоздание контейнера. Том данных содержит базу, ключи и скачанные страницы, том документов — дерево исследований вместе с настройками сервисов. Тома обязательны: без них вы потеряете базу, скачанные исследования и ключи при первом же `docker compose down`.

- `/apps/research/data.db` — база SQLite (если не используется PostgreSQL);
- `/apps/research/auth/` — ключи ASP.NET Data Protection;
- `/apps/research/keys/` — ключ подписи JWT;
- `/apps/research/fetch/` — скачанный Markdown, разложенный по датам;
- `/apps/research/search-index/` — индекс полнотекстового поиска по документам: лежит на диске и переиспользуется между запусками, поэтому поиск работает сразу после перезапуска;
- `/apps/research/venv/` — окружение Python, общее для скачивания страниц и для ваших скриптов: приложение готовит и обновляет его само;
- `/apps/research/scripts/` — рабочие папки скриптов (там скрипт хранит своё состояние между запусками) и служебные файлы подготовленного кода.
- `/project/apps/research/` — дерево исследований (отчёты, планы, категории), папка скриптов `scripts/` и файл настроек сервисов `settings.yml`. Это отдельный том: его содержимое можно править снаружи, хранить в системе контроля версий и переносить на другой сервер.

Скачанные страницы — временная история: фоновый уборщик удаляет их через двое суток после скачивания (окно задаётся переменной `RESEARCH_APP_FETCH_RETENTION_HOURS`, по умолчанию 48 часов). Хранить стоит готовые отчёты в библиотеке, а не исходные страницы.

Исключение — статистика исследований: при включённой выгрузке (переменная `RESEARCH_APP_CLICKHOUSE_URL`) она пишется в отдельную внешнюю базу ClickHouse, а не в том — сам сервер ClickHouse разворачивается за пределами контейнера.

## Файл .env в папке проекта

Если в папке проекта лежит файл `.env` (по умолчанию `/project/.env`), приложение читает его при запуске и перечитывает на лету. Это удобное место для переменных окружения и секретов, которые не хочется расписывать в `compose.yml`: ссылки `$NAME` в настройках сервисов, пароли, бренд. Формат простой: строка `КЛЮЧ=значение`, комментарии начинаются с `#`, необязательная приставка `export` не мешает, значения берутся буквально. Файл с паролями в системе контроля версий не хранят. Путь к файлу меняется переменной `RESEARCH_APP_ENV_FILE`.

Настройки, прочитанные при старте (строка подключения базы, адрес и ключ Pastukhov Agent, пути к окружению Python), вступают в силу после перезапуска контейнера. Всё остальное — подстановка ссылок в настройках сервисов, ключ лицензии, переменные, которые видят инструменты скачивания страниц и ваши скрипты, — подхватывается на лету, без перезапуска. Переменная, уже заданная в окружении контейнера или через `-e`, остаётся главной: файл её не перекрывает, а только дополняет; значения, убранные из файла, снимаются.

## Первый вход

Первый пользователь регистрируется прямо в веб-форме на странице входа: логин, пароль (от 4 символов), имя и email. Пароль хранится в виде SHA-256-хеша, сессия работает через JWT-токены. Для автоматических развёртываний того же пользователя можно задать заранее переменными `RESEARCH_APP_LOGIN` и `RESEARCH_APP_PASSWORD` — при запуске пользователь создаётся сам, а изменившийся пароль обновляется. Пароль здесь задаётся хешем SHA-256; посчитать его можно прямо на странице входа, в разделе «SHA256-генератор».

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

Поисковые провайдеры и модели настраиваются в разделе Services веб-интерфейса — не через переменные окружения. Там задаются API-ключи Serper, Keenable, Brave, Tavily и JSON SEO, base URL собственного SearXNG, а также сервисы для скачивания страниц: Direct HTTP работает сразу, для Proxied HTTP нужен адрес прокси, для Remote Browser — адрес внешнего сервиса, а локальные браузеры (Browser Emulation и Nodriver) скачивают всё нужное сами. Для извлечения данных настраиваются LLM-сервисы. Каждый сервис можно протестировать прямо из интерфейса. Подробнее — в разделе [Сервисы и модели](/agents/research/docs/services)
.

## Версия и обновление

Актуальная версия Research Agent — 0.1.42. Образы публикуются в docker.io (`maxpastukhov/research-agent:min-latest`), поэтому обновление — это две команды: `docker compose pull` и `docker compose up -d`. Номер версии виден в интерфейсе, и после обновления он обновляется сам: приложение замечает новую версию после переподключения и обновляет интерфейс, ничего вручную делать не нужно.

## Режимы развёртывания

Интерфейс можно установить как приложение: Research Agent отдаёт PWA-манифест, и на телефоне или рабочем столе он открывается в отдельном окне, как обычная программа. Если нужен HTTPS, включите `RESEARCH_APP_SSL=auto` — сервер сам выпустит самоподписанный сертификат и поднимет HTTPS-порт рядом с HTTP. При размещении за прокси по адресу с подпапкой (например, `example.com/research`) укажите её в `RESEARCH_APP_BASE_PATH` — все адреса интерфейса будут строиться с учётом этой подпапки.

## Связь с Pastukhov Agent

Чтобы управлять агентом из интерфейса исследований, задайте переменные `AGENT_API_URL` и `AGENT_API_KEY` — появятся чаты агента с обновлениями в реальном времени и кнопка «Вызвать агента» в документах. Подробнее — в разделе [Интеграция с Pastukhov Agent](/agents/research/docs/agent)
.

## Docker CLI с файлом .env

Можно запустить Research Agent и без compose — командой `docker run`, сохранив переменные окружения в файле `.env`:

```
# .env
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://+:80
# опционально: PostgreSQL вместо встроенного SQLite
# RESEARCH_APP_DB=Host=postgres;Port=5432;User Id=research;Password=secret;Database=research;
# опционально: интеграция с Pastukhov Agent
# AGENT_API_URL=
# AGENT_API_KEY=
```

```
docker run -d \
  --name research-agent \
  --env-file .env \
  -p 3978:80 \
  -v research-agent-data:/apps/research \
  -v research-agent-docs:/project/apps/research \
  --restart unless-stopped \
  maxpastukhov/research-agent:min-latest
```

Флаг `--env-file` считывает все переменные из файла. Отдельные значения можно переопределить дополнительными флагами `-e` после него, например `-e RESEARCH_APP_HASH=your-key`.

[← Вернуться на главную раздела Research Agent](/agents/research)
