Установка Портал агента

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

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

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

Портал агент — программа, в которой живёт корпоративный портал: страницы, блоки, живые цифры из ваших систем и публичный сайт. Всё это разворачивается на вашем сервере одним Docker-контейнером, а постоянные данные лежат в томе /data. Отдельная база данных не нужна: встроенная SQLite работает из коробки, PostgreSQL подключается по желанию. Python тоже ставить не нужно — он уже внутри образа, поэтому динамические блоки работают сразу.

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

Достаточно любого Linux-сервера с Docker и Docker Compose (подойдёт недорогой VPS). Если удобнее работать на Windows, установите Docker Desktop — порядок действий описан на странице Windows Setup. Отдельно нужно позаботиться только о постоянном томе под данные: без него всё пропадёт при первом же пересоздании контейнера.

Что уже встроено в образ и не требует установки:

  • веб-сервер приложения (ASP.NET Core 9);
  • база данных SQLite — работает без настройки;
  • окружение Python для динамических блоков и скриптов — создаётся само при первом запуске;
  • для чата с ИИ-агентом понадобится адрес и ключ вашего Pastukhov Agent — но это необязательно: без них всё работает, кроме самого чата.

Docker Compose

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

services:
  portalagent-ru:
    image: maxpastukhov/portal-agent:latest
    container_name: portalagent-ru
    ports:
      - "3993:80"
    volumes:
      - portalagent-data-ru:/data
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80
      - PORTALAGENT_BRAND=pastukhov
      - PORTALAGENT_DATA=/data
      # PORTALAGENT_BASE_PATH=/portal  # serve from a first-level subfolder (see ../subfolder-hosting.md)
    restart: unless-stopped
    sysctls:
      fs.inotify.max_user_watches: "524288"
      fs.inotify.max_user_instances: "512"

volumes:
  portalagent-data-ru:

После запуска интерфейс будет доступен на порту 3993: http://<адрес-сервера>:3993.

Две строки sysctls повышают системные лимиты отслеживания изменений файлов — они нужны, чтобы правки страниц, сделанные агентом, появлялись на открытой странице сразу, без перезагрузки. Без них на большом портале часть изменений может не дойти до читателя.

Если портал должен жить не в корне домена, а в подпапке (например, /portal), раскомментируйте строку PORTALAGENT_BASE_PATH=/portal — приложение само приведёт все адреса к нужному виду.

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

Настройки приложения задаются переменными окружения — так их удобно прописать один раз в compose.yml и менять без правки кода. Все переменные, кроме AGENT_*, начинаются с PORTALAGENT_.

ПеременнаяЧто задаётПо умолчанию
PORTALAGENT_BRANDбренд и язык интерфейса: pastukhov (русский) или xedant (английский)xedant
PORTALAGENT_DATAпапка постоянных данных (в контейнере — /data)/data
PORTALAGENT_DBбаза данных: строка подключения PostgreSQL; пустое значение — встроенная SQLiteSQLite (/data/data.db)
PORTALAGENT_PORTAL_PATHпапка с контентом портала, если нужно вынести её из тома данных<данные>/portal
PORTALAGENT_MANAGEMENT_KEYSHA-256-хеш ключа, которым ИИ-агент управляет порталом (заголовок X-API-Key); без него управление выключено и отвечает 503— (управление выключено)
PORTALAGENT_LOGINлогин готового администратора; вместе с паролем создаёт пользователя при старте— (саморегистрация)
PORTALAGENT_PASSWORDстрочная SHA-256-сумма пароля, не сам пароль
PORTALAGENT_BASE_PATHразмещение в подпапке первого уровня (например, /portal)— (работа в корне домена)
PORTALAGENT_SSLсвой самоподписанный HTTPS: auto — включить; рядом _SSL_PORT— (только HTTP)
PORTALAGENT_ERROR_REPORTING0 — выключить отправку сведений об ошибках— (адрес приёма не задан, поэтому ничего не отправляется)
AGENT_API_URLадрес Pastukhov Agent, который ведёт портал: через него работает чат и правки словами— (чат с агентом скрыт)
AGENT_API_KEYключ доступа к вашему Pastukhov Agent
AGENT_LICENSEлицензионный ключ, чтобы не вводить его руками в интерфейсе— (берётся файл лицензии из тома)

Обратите внимание: PORTALAGENT_MANAGEMENT_KEY содержит не сам ключ, а его сумму — «отпечаток», по которому ключ восстановить нельзя. Получить её можно командой printf '%s' 'ваш-ключ' | sha256sum и вставить в переменную. Так же устроен и пароль: в PORTALAGENT_PASSWORD попадает его строчная SHA-256-сумма (echo -n вашпароль | sha256sum), а при входе приложение считает сумму от введённого пароля и сравнивает с заданной.

Где хранятся данные

Все постоянные данные живут в томе /data и переживают пересоздание контейнера:

  • /data/data.db — база данных SQLite (когда не используется PostgreSQL);
  • /data/auth/ — ключи защиты данных, которыми подписываются сессии входа;
  • /data/.pastukhov/ — лицензия (у бренда xedant папка называется .xedant);
  • /data/portal/ — сам контент портала: папка на каждую страницу, тексты, файлы картинок;
  • /data/portal-data/ — рабочая папка скриптов (временные файлы, результаты расчётов);
  • /data/.venv — окружение Python, в котором выполняются динамические блоки;
  • /data/portal-unread.txt — пометки «не прочитано» для страниц портала.

Том обязателен: без него при первом же docker compose down вы потеряете базу, лицензию и весь контент портала. И важное преимущество: контент — это обычные файлы. Папку портала можно целиком положить в git (хранилище версий файлов), видеть историю правок и перенести на другой сервер простым копированием.

Первый вход

Откройте интерфейс в браузере. Пока в базе нет ни одного пользователя, форма регистрации открыта сама — первый зарегистрировавшийся становится администратором. Если логин и пароль заданы переменными PORTALAGENT_LOGIN и PORTALAGENT_PASSWORD, входите под ними (в переменной хранится сумма, при входе вводите сам пароль). Сессия входа живёт 90 дней. Если приложение развёрнуто вместе с другими продуктами, вход может идти через общий вход сервера — он настраивается переменной SSO_PROXY_TOKEN.

Что сделать после запуска

Когда интерфейс открылся, остаётся подключить управляющего агента и завести первые страницы:

  1. Подключите Pastukhov Agent — укажите AGENT_API_URL и AGENT_API_KEY. После этого в интерфейсе появляется чат с ИИ-агентом и кнопки «Изменить эту страницу с помощью агента…».
  2. Задайте ключ управления порталом — переменную PORTALAGENT_MANAGEMENT_KEY с хешем ключа. По этому адресу агент создаёт и правит страницы, файлы и скрипты.
  3. Попросите агента создать первые страницы — просто опишите словами, что нужно: «сделай раздел Новости с лентой и страницу Контакты».
  4. Назначьте страницам доступ: у новой страницы по умолчанию «черновик», его видит только администратор.
  5. Отметьте страницы с доступом «публичная» — они появятся на внешнем сайте по адресу /p/.

Подробнее о первых шагах — в разделе Начало работы.

Запуск без Compose

Можно запустить приложение и одной командой docker run:

docker run -d \
  --name portalagent-ru \
  -p 3993:80 \
  -v portalagent-data-ru:/data \
  -e PORTALAGENT_BRAND=pastukhov \
  -e PORTALAGENT_DATA=/data \
  --sysctl fs.inotify.max_user_watches=524288 \
  --sysctl fs.inotify.max_user_instances=512 \
  --restart unless-stopped \
  maxpastukhov/portal-agent:latest

Остальные переменные окружения можно передать файлом через флаг --env-file .env — так удобнее, когда настроек много.

Установка через Pastukhov MultiAgent

Если у вас несколько серверов и приложений, удобнее ставить продукты из Pastukhov MultiAgent: он сам поднимает контейнер, выдаёт постоянный адрес и HTTPS, подключает базу и общий том документов. Для Портал агента готового шаблона в каталоге MultiAgent пока нет — он появится позже, и тогда установка тоже сведётся к одному нажатию. Следить за новостями можно на странице MultiAgent.

Лицензия

Лицензионный ключ активируется в диалоге лицензии в интерфейсе или передаётся переменной AGENT_LICENSE при запуске. Готовой лицензии в образе нет: свежий контейнер стартует без неё. Без лицензии работает всё — дерево и страницы портала, блоки, динамические блоки на Python, формы, публичный сайт и правки контента агентом. Лицензия нужна только для отправки сообщений в чат с ИИ-агентом. Подробнее — на странице Лицензирование.

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