Установка CRM-агента

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

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

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

«CRM-агент» — это CRM на вашем сервере, в которой данные ведёт ИИ-агент, а вы наблюдаете и командуете. Разворачивается он одним контейнером Docker, а отдельная база данных не обязательна: по умолчанию внутри уже есть встроенная. Рядом по желанию ставится ваш Pastukhov Agent — тогда CRM можно управлять словами в чате, а без него всё, кроме чата с агентом, работает как обычно.

Что понадобится

  • Сервер или компьютер с Docker — подойдёт Windows, Linux или macOS, а для постоянной работы достаточно недорогого сервера.
  • Один свободный порт для интерфейса (в примерах ниже — 3991). Отдельная база данных не нужна: если не указывать строку подключения, продукт заведёт встроенную базу сам.
  • Логин и пароль первого входа. Их можно задать заранее переменными CRMAGENT_LOGIN и CRMAGENT_PASSWORD; если не задавать, администратором станет первый зарегистрировавшийся в интерфейсе.
  • Ключ управления для агента (CRMAGENT_MANAGEMENT_KEY) — если вы хотите, чтобы ваш ИИ-агент менял данные сам, а не вы вручную. Пока ключ не задан, изменения запрещены, а просмотр в интерфейсе работает.
  • По желанию — адрес и ключ вашего Pastukhov Agent. Без них работает всё, кроме чата с ИИ-агентом внутри продукта.

Установка через Docker Compose

Создайте файл compose.yml с таким содержимым. Здесь одна служба: база данных ей не нужна, поэтому весь продукт умещается в один контейнер.

services:
  crmagent-ru:
    image: maxpastukhov/crm-agent:min-latest
    container_name: crmagent-ru
    ports:
      - "3991:80"
    volumes:
      - crmagent-data-ru:/data
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80
      - CRMAGENT_BRAND=pastukhov
      - CRMAGENT_DATA=/data
      # CRMAGENT_BASE_PATH=/crm  # 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:
  crmagent-data-ru:

Разберём построчно, что здесь написано и зачем:

  • image — русская сборка продукта с русским интерфейсом и названием «CRM-агент».
  • ports — адрес, по которому откроется интерфейс: 3991 снаружи, 80 внутри контейнера. Число снаружи можно взять любое свободное.
  • volumes — постоянная папка /data. В ней живут база и все данные, поэтому без неё всё исчезнет при пересоздании контейнера.
  • CRMAGENT_BRAND — выбор бренда: pastukhov включает русское название и русский язык по умолчанию.
  • CRMAGENT_DATA — та самая постоянная папка внутри контейнера, куда продукт складывает всё своё: она же подключена томом выше.
  • CRMAGENT_BASE_PATH — закомментированная строка для размещения в подпапке сайта: раскомментируйте, если хотите открывать CRM по адресу вида ваш-сайт/crm.
  • restart — перезапуск после перезагрузки сервера, чтобы CRM снова поднялась сама.
  • sysctls — две настройки ядра Linux, увеличивающие лимит наблюдения за файлами: без них продукт хуже замечает изменения в своих папках на больших объёмах.

Затем запустите:

docker compose up -d

Интерфейс появится на порту 3991: http://<адрес-сервера>:3991.

Запуск одной командой

Если файл с настройками заводить не хочется, всё то же самое делается одной командой docker run:

docker run -d \
  --name crmagent-ru \
  -p 3991:80 \
  -v crmagent-data-ru:/data \
  -e ASPNETCORE_ENVIRONMENT=Production \
  -e ASPNETCORE_URLS=http://+:80 \
  -e CRMAGENT_BRAND=pastukhov \
  -e CRMAGENT_DATA=/data \
  --sysctl fs.inotify.max_user_watches=524288 \
  --sysctl fs.inotify.max_user_instances=512 \
  --restart unless-stopped \
  maxpastukhov/crm-agent:min-latest

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

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

Настройки задаются переменными окружения — их прописывают один раз в compose.yml и меняют без правки кода. Почти все имена начинаются с CRMAGENT_; для чата с агентом имена, наоборот, привычные — без приставки.

ПеременнаяЧто делает
CRMAGENT_DBвыбор базы данных. Не указана — продукт работает на встроенной базе в файле /data/data.db; указана строка подключения — работает на PostgreSQL
CRMAGENT_DATAпапка постоянных данных: база, ключи входа, настройки бренда. По умолчанию /data
CRMAGENT_BRANDpastukhov — русское название продукта и русский язык интерфейса по умолчанию
CRMAGENT_BASE_PATHразмещение в подпапке сайта, например /crm; не задано — работа в корне домена
CRMAGENT_MANAGEMENT_KEYхеш ключа, которым ваш ИИ-агент управляет данными по API (это адреса управления, к которым обращается агент). Хранится в виде необратимой суммы SHA-256; без него изменения запрещены, а просмотр работает
CRMAGENT_LOGIN, CRMAGENT_PASSWORDучётная запись администратора, создаваемая при запуске. Если их не задавать, администратором становится первый зарегистрировавшийся в интерфейсе
CRMAGENT_INTAKE_ALLOW_ORIGINсписок сайтов, с которых принимаются заявки. Не указан — заявки принимаются с любых сайтов; указан — только перечисленные
CRMAGENT_COMPRESSIONсжатие ответов сервера. Включено по умолчанию, =0 выключает
CRMAGENT_JOB_KEEP_DAYSсколько дней хранить завершённые фоновые задачи. По умолчанию 30
CRMAGENT_BOOT_FULL=1 — полная проверка устройства базы при запуске. Нужна для диагностики, обычно не требуется
CRMAGENT_SSLвыпуск сертификата HTTPS для прямого адреса вида crm.ваш-домен. Если перед продуктом стоит ваш прокси, эту переменную включать не нужно
AGENT_API_URL, AGENT_API_KEYадрес и ключ вашего Pastukhov Agent: с ними внутри CRM появляется чат с ИИ-агентом. Не заданы — чат скрыт, всё остальное работает

Размещение в подпапке сайта

Продукт можно повесить не на корень домена, а на подпапку — например, https://ваш-сайт/crm. Есть два способа, и они не смешиваются.

  • Просто указать папку. Задайте CRMAGENT_BASE_PATH=/crm — продукт сам отрежет приставку и перенаправит старые адреса в новый вид. Служебные адреса проверки домена (/.well-known/) при этом остаются в корне.
  • Отдать папку вашему прокси. В этом случае в контейнере ничего менять не нужно: прокси сообщает продукту приставку заголовком X-Forwarded-Prefix. Так удобнее, когда у вас уже настроен nginx или похожий сервер.

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

# переход на WebSocket (в общем разделе http {})
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl;
    server_name host.tld;

    client_max_body_size 100m;                       # загрузка файлов и вставленных картинок

    location /crm/ {
        proxy_pass http://crmagent:80/;              # слэш на конце отрезает приставку подпапки
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Prefix /crm;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;      # живые обновления: /appHub и /agentChatHub
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 3600s;                    # длинные ответы чата
        proxy_send_timeout 3600s;
        proxy_buffering off;                         # потоковая передача ответов
    }
}

Оба способа и проверка изоляции между папками описаны в файле install/subfolder-hosting.md рядом с продуктом.

Первый вход

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

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

Если у вас несколько серверов, удобнее ставить продукт из Pastukhov MultiAgent: он сам поднимает контейнер, выдаёт постоянный адрес и HTTPS, подключает базу. «CRM-агент» есть в каталоге продуктов (порт 6080), используются переменные CRMAGENT_SSL, CRMAGENT_DB, CRMAGENT_BASE_URL и CRMAGENT_API_KEY, а связанный Pastukhov Agent подключается к чату. Подробнее о самом MultiAgent — на странице MultiAgent.

Лицензия и обновления

Пробный период — 30 дней бесплатно, без ограничений внутри. Цены те же, что у соседних продуктов: персональная — 19 700 ₽, корпоративная — 49 700 ₽, сервисная — 97 000 ₽, все пожизненные, с 12 месяцами бесплатных обновлений. Скажем честно: лицензия ограничивает ровно одно действие — отправку сообщения в чат с ИИ-агентом. Клиентская база, хронология, качество данных, импорт и выгрузки, свои поля, лиды, сделки, деньги, маркетинг, коммуникации, сервис, экраны и управление по API работают без неё. Подробнее — на странице Лицензирование.

Дальше стоит заглянуть в Начало работы — там коротко о том, как продукт устроен и с чего начать.

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