Привет! Меня зовут Игорь Росляков, я технический писатель. По приглашению руководителя направления «Маркет и интеграции» Сергея Вострикова я готовлю цикл статей на тему ИИ-ассистированной разработки решений для Битрикс24

Статьи из цикла можно использовать как туториалы при создании локальных приложений в свой бизнес-портал. Их можно показать своим разработчикам или использовать самому, если работаете один и хотите кастомизировать работу дополнительными удобными функциями.

Сегодня — 3-я статья из цикла. Рассказываем про преимущества разработки, которую можно воспроизвести на любой машине и сервере с сохранением всех зависимостей. Это подход, когда у всех всё работает одинаково: запуск, настройка, обновления, ошибки.

После этого зарегистрируем домен для готового приложения, арендуем сервер и задеплоим, чтобы всё работало 24 часа в сутки без запущенной программы на нашем локальном компьютере.

Основную работу будем делать не сами, а через AI-агентов — Claude Sonnet 4.6 и Codex GPT-5.4.

Ссылка на репозиторий, который сейчас задеплоен:
github.com/igorrosliakov-bitrix24/Bitrix24-Article2-Adding-4-Robots 

Игорь Росляков

Технический писатель

Что будет в статье:

Как работать без воспроизводимой среды разработки

Если разработчик работает соло и запускает приложение только на своей машине, можно просто установить все зависимости и запускать проект локально. 

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

Это выглядит примерно так. Одному разработчику для разработки приложения нужны Python 3.11, PostgreSQL 17 и RabbitMQ 3.13.

Что нужно сделать на Windows:

  1. Открываем python.org → скачиваем installer → проходим путь установки и не забываем галочку "Add to PATH".

  2. Заходим на postgresql.org → скачиваем installer → запоминаем порт → устанавливаем pgAdmin.

  3. Для установки RabbitMQ сначала скачиваем и устанавливаем Erlang → потом RabbitMQ

  4. Настраиваем переменные окружения.

  5. Для сборки psycopg2 нужен Visual C++ Build Tools.

Если передать этот проект коллеге с MacOS, то просто запустить его не получится. Почему:

  1. У коллеги Homebrew, но Python 3.9 из системы.

  2. brew install python@3.11 выдаст конфликт с pyenv.

  3. PostgreSQL стоит не той версии, которую ожидает проект.

  4. Нужный порт уже занят другим проектом.

  5. RabbitMQ через Homebrew устанавливается, но как сервис.

Примерно так же, но с другими конфликтами будет выглядеть установка на Linux. В итоге проект запускается, но только одним конкретным способом.

Что даёт воспроизводимая среда разработки

Чтобы было проще запускать приложение на разных системах, чаще всего его упаковывают в Docker-контейнер. На всех системах этот процесс можно уложить в 3 шага:

  1. Установить Docker (Docker Desktop для локальной разработки или Docker Engine для сервера).

  2. Клонировать репозиторий.

  3. Запустить командой make dev-python.

После этого получаем одинаковую среду на всех машинах. Другие коллеги из команды клонируют репозиторий и благодаря Docker получают точно такой же образ.

Все нюансы командной работы повторяются при деплое на сервере. Без Docker нужно устанавливать и настраивать все зависимости по одной. А если проект уже упакован в контейнер, для сервера нужно будет только скачать сам Docker, клонировать репозиторий, заполнить значения в .env-файле и запустить ./scripts/deploy.sh.

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

Деплоим готовое приложение по шагам

Всю работу можно разделить на 2 большие задачи:

  • Инфраструктурная: сервер, Docker, nginx, SSL, backend, frontend.

  • Интеграционная: правильная установка приложения в Битрикс24, регистрация роботов, корректная работа самих роботов.

Мы пройдём все этапы развёртывания готового приложения из предыдущей статьи.

Наш готовый проект основан на AI-cтартере, готовом шаблоне, который можно подключить к Битрикс-порталу. В стартер уже вшит контейнер, и после первоначальной почти полностью автоматической настройки сервис поднимается одной командой. Скачивать язык программирования, базы данных и брокер очередей не нужно устанавливать вручную — всё уже есть в контейнере.

Функция приложения — создание роботов для автоматизации работы в CRM. Роботы добавляются в процесс ведения сделки. У сделки есть несколько стадий, и на каждую можно добавить несколько роботов:

Это состояние проекта на начальном этапе. Сейчас всё работает, только если запустить приложение на моём локальном компьютере.

Вот как выглядел мой деплой по шагам.

Аренда домена и сервера

Для деплоя нам понадобится домен и арендованный сервер. После небольшого исследования я купил домен и арендовал VPS на месяц у Timeweb Cloud.

Сначала я завёл домен под приложение с роботами:

После этого выбрал сервер с Ubuntu и в Москве.

Почему Ubuntu:

  • Официальный скрипт установки Docker curl -fsSL https://get.docker.com | sh тестируется в первую очередь на Ubuntu.

  • Для этой ОС самая большая база документации и Stack Overflow-ответов.

  • Обновления безопасности LTS (Long Term Support)  до 2029 года.

После этого я взял второй снизу по стоимости сервер:

Если брать 1 Гб RAM, есть риск, что при сборке Docker-образов не хватит памяти. А всё что выше и дороже 2 ГБ, избыточно для тестового проекта.

Публичный IP — это дополнительная опция поверх базовой, то есть один публичный IP вы получаете по умолчанию. Эту возможность и бэкапы я не добавлял, потому что у нас учебный проект. Но доступ по SSH-ключу нужен, чтобы можно было подключиться из терминала командной строки на своём компьютере:

Cloud-init — это скрипт, который запускается один раз при первом старте сервера для автоматической настройки. Может быть удобно, если знаете что делать заранее. Но мы будем настраивать всё с ИИ-агентами поэтапно, поэтому здесь ничего не пишем.

После покупки в настройках домена нужно найти DNS-записи и добавить запись типа А, в которой вместо хоста должен быть ваш домен, а в качестве значения — IP-адрес сервера. Тогда домен тоже будет указывать на сервер, например, если пользователь открывает домен в браузере.

Оплата домена на 1 год и сервера на 1 месяц суммарно обошлись в ~1000 рублей.

Подключаемся к серверу

Мы подключаемся к серверу по SSH с использованием root-пароля командой такого вида:

ssh root@62.54.11.208

После этого терминал запросит root-пароль, который можно найти в панели управления сервером:

Первоначальная настройка

Сначала я попросил у агента план настройки сервера и просто повторял команды в терминале командной строки.

Шаг 1: установить Docker для запуска наших контейнеров. Выполняем такие команды:

apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
docker --version && docker compose version

Шаг 2: потом клонируем репозиторий и переходим в корневую директорию проекта:

git clone https://github.com/igorrosliakov-bitrix24/Bitrix24-Article2-Adding-4-Robots.git /opt/b24-robots
cd /opt/b24-robots

Шаг 3: создаём и настраиваем переменные окружения:

cp .env.example .env
nano .env

Что нужно заполнить для приложения на портале Битрикс:

VIRTUAL_HOST=https://bremenrobots24.site   # ваш домен

SERVER_HOST=http://api-python:8000
JWT_SECRET=сгенерируйте-длинную-случайную-строку

CLIENT_ID=local.xxxxxxxx.xxxxxxxx      # из настроек приложения в Битрикс24
CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxx # из настроек приложения в Битрикс24

DB_NAME=appdb
DB_USER=appuser
DB_PASSWORD=пароль
DB_ROOT_PASSWORD=root_пароль
DATABASE_URL=postgresql://appuser:сильный_пароль@database:5432/appdb

BUILD_TARGET=production
NODE_ENV=production

DJANGO_SUPERUSER_USERNAME=admin
DJANGO_SUPERUSER_EMAIL=admin@bremenrobots24.site
DJANGO_SUPERUSER_PASSWORD=сильный_пароль_admin

ENABLE_RABBITMQ=0

В настройках есть параметры CLIENT_ID и CLIENT_SECRET. Взять их можно на портале Битрикс при регистрации нового приложения. Подробно об этом шаге можно прочесть в 1-й статье в разделе «Регистрируем приложение на портале Битрикс24».

Шаг 4: после этого нужно настроить NGINX. В нашем проекте это внешний вход в систему. Он нужен не просто как веб-сервер для хранения файлов, а как reverse proxy и SSL termination layer. То есть когда пользователь или Битрикс24 приходит на https://bremenrobots24.site, этот запрос принимает nginx. Дальше он решает, куда его отправить:

  • / → во frontend.

  • /api/ → в Django backend.

  • /admin/ → в Django admin.

  • /static/ → отдаёт Django файлы статики напрямую.

Какие команды понадобятся:

mkdir -p infrastructure/nginx/certs
mkdir -p infrastructure/nginx/certbot-webroot
sed -i 's/YOUR_DOMAIN/bremenrobots24.site/g' infrastructure/nginx/nginx.conf

Это создаёт директории для сертификатов и ACME webroot и подставляет реальный домен вместо шаблона YOUR_DOMAIN. Зачем это нужно: в nginx домен и путь к сертификату завязаны на YOUR_DOMAIN, и пока мы его не заменим, nginx не знает, какой домен обслуживать.

Шаг 5: после этого стандартная настройка сервера закончена, и остаётся одна команда для деплоя:

./scripts/deploy.sh

Какие проблемы могут быть при деплое на разных этапах

На этом месте начались проблемы, потому что деплой никак не хотел сходиться. С этого места я дал агентам доступ к серверу и репозиторию, чтобы они сами смогли найти все проблемные места и решить их. 

В какой-то момент я израсходовал все токены для Claude и перешёл на Codex. В итоге Codex довольно быстро нашёл ошибки, которые допустил Claude, исправил их и довёл приложение до рабочего состояния.

Вот основные этапы, на которые можно разделить тот процесс деплоя, который получился у меня. На всякий случай к каждому разделу я приложу краткое описание основных составных элементов — возможно, кому-то это окажется полезным.

Этап 1 — подготовка

Базовая вещь: приложение вообще должно запускаться на VPS по домену bremenrobots24.site. Это инфраструктурная работа: нужно поднять контейнеры, настроить nginx, получить SSL-сертификат и запустить Django + Nuxt.

Эту работу я описал по шагам выше в разделе «Первоначальная настройка».

Технические компоненты этапа:

  • Docker Compose поднимает несколько контейнеров как одно приложение.

  • nginx — веб-сервер, принимает запросы снаружи и проксирует их во frontend/backend.

  • certbot — программа, которая получает SSL-сертификаты от Let's Encrypt.

  • frontend — Nuxt-приложение, пользовательский интерфейс.

  • backend — Django API, которое общается с Битрикс24 и запускает роботов.

Этап 2 — запуск nginx

Довольно частая проблема, когда nginx-серверу нужен сертификат для старта, а для получения сертификата нужен уже работающий nginx. 

Nginx читает конфиг при старте. В конфиге написано: «слушай порт 443 с SSL, используй сертификат из файла /etc/letsencrypt/live/domain/fullchain.pem». В нашей конфигурации nginx не запускался, если сертификат отсутствовал: в конфиге сразу был указан HTTPS и путь к файлам сертификата, которых ещё не было.

Сертификаты выдаёт сервис Let's Encrypt. Он делает это так: делает HTTP-запрос на порт 80 к нашему серверу для проверки. Если порт 80 не отвечает — отказывает в выдаче сертификата. Получается: сертификат нужен чтобы запустить nginx, а nginx нужен чтобы получить сертификат.

Как эту проблему решил Claude: перед запуском nginx создавался временный самоподписанный сертификат через встроенную утилиту шифрования openssl:

openssl req -x509 -nodes -newkey rsa:2048 \
  -keyout privkey.pem \
  -out fullchain.pem \
  -days 1 -subj "/CN=domain.com"

Этот сертификат ненастоящий, то есть браузеры его не признают. Но nginx с ним стартует, и порт 80 становится доступен. В итоге certbot получает реальный сертификат, и nginx перезагружается с ним.

Технические компоненты этапа:

  • SSL-сертификат, который нужен для работы домена по защищённому протоколу https://.

  • self-signed cert — временный сертификат, чтобы сервер мог запуститься до получения настоящего.

  • Let's Encrypt — сервис, выдающий бесплатные SSL-сертификаты.

  • ACME challenge — способ, которым certbot доказывает, что домен действительно принадлежит серверу. Let's Encrypt выдаёт токен, и certbot должен разместить этот токен определённым образом, чтобы Let's Encrypt мог сделать запрос и найти его. Логика в том, что если ты можешь положить файл на сайт — значит, ты владелец домена.

Этап 3 —  Битрикс-интеграция на бэкенде (неправильный вариант)

К этому шагу сервер, контейнеры и HTTPS уже работали. Но роботы в портале Битрикс24 не появились. В конце я попросил Codex проанализировать ошибки, допущенные в предыдущих этапах, и он починил приложение, но допустил архитектурную ошибку: перевёл установку на бэкенд.

Как рассуждал Codex:

Claude не сделал решающую проверку интеграции. Он не подтвердил по логам и живым API-вызовам:

  • вызывался ли /api/install

  • вызывался ли /api/robots/register

  • сработал ли bizproc.robot.add

  • сохранился ли токен Битрикс24 в базе

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

  • /api/install в views.py сначала только сохранял установку.

  • Сами роботы регистрировались отдельно через frontend install-page.

  • Обычное открытие приложения вело на главную страницу, а не на install-page, где происходит регистрация.

Для агента это выглядело так, что логика размазана между backend и frontend. Часть логики процесса установки жила на бэкенде, а часть на фронтенде. Чтобы убрать хрупкость установки, агент сделал несколько вещей:

  • Перенёс регистрацию роботов в backend /api/install. То есть «Путь обработчика» при регистрации приложения в портале выглядел как https://bremenrobots24.site/api/install.

  • Добавил fallback на главную страницу приложения.

  • Добавил кнопку повторной регистрации. Если автоматическая регистрация не проходила, на главном экране приложения можно вызвать её вручную:

После этого логика стала действительно намного надёжнее. Для регистрации роботов появились 3 варианта:

  • Либо install-hook сам зарегистрирует роботов.

  • Либо обычное открытие приложения сделает это позже.

  • Как запасной парашют, пользователь нажмёт кнопку вручную. В реальном проекте такое решение выглядит криво, но мы добавили его как демонстрацию возможностей и для отладки.

Технические компоненты этапа:

  • install hook — backend endpoint, который Битрикс24 вызывает при установке приложения.

  • OAuth token — токен доступа, с которым backend потом вызывает API Битрикс24.

  • bizproc.robot.add — метод Битрикс24 для регистрации робота.

  • health endpoint — техническая проверка, что сервер работает. Отвечает только на вопрос «жив ли backend», но не отвечает на вопрос «видит ли Битрикс24 роботов».

Этап 4 — Битрикс-интеграция на фронтенде (правильный вариант)

Проблема была в том, что установка Битрикс-приложений задумана иначе, как frontend wizard:

  1. Битрикс24 открывает страницу /install.

  2. frontend показывает шаги установки и progress bar.

  3. Один из шагов вызывает backend /api/install.

  4. Другой шаг вызывает /api/robots/register.

  5. В конце frontend вызывает installFinish().

После объяснения этой схемы агент вернул каноническую установку:

  • Во views.py /api/install снова стал узким backend-шагом: он только сохраняет установку и auth-данные.

  • В index.client.vue исчез автозапуск регистрации роботов и кнопка повторной регистрации.

  • Основным install-flow снова стал install.client.vue.

Этап 5 — финальные правки

В начале я не обратил внимания на то, что инструкции агента по установке приложения в бизнес-портал расходятся с тем, что написано в официальной документации.

Как должны выглядеть параметры установки:

При таких параметрах:

  • если Битрикс открывает /install, запускается wizard

  • если Битрикс открывает /, открывается обычный index

  • если Битрикс после завершения установки открывает backend endpoint, пользователь видит JSON

Что предлагал агент:

Из-за этого после возвращения установки на фронтенде появлялись разные симптомы:

  • В одном варианте после переустановки открывалась обычная главная страница, и в панели DevTools на вкладке Network были только health/getToken, без install и register.

  • в другом варианте после завершения установки Битрикс открывал JSON {"message":"Installation successful"} вместо UI приложения:

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

Проверяем работу приложения в портале

После успешного деплоя и регистрации роботов я ещё раз прошёл путь проверки роботов. Я создал тестовый контакт, имя и номер телефона которого нужно было нормализовать:

После этого создал тестовую сделку, в которую добавил все нужные данные:

После запуска стадии, на которой стоят роботы, видно, что всё работает правильно. Это можно увидеть в логах:

Роботы форматирования телефона и нормализации ФИО
Роботы форматирования телефона и нормализации ФИО
Роботы для суммы просроченных задач ответственного за сделку и для подсчёта суммы сделок клиента
Роботы для суммы просроченных задач ответственного за сделку и для подсчёта суммы сделок клиента

И в карточках клиента или компании, у которых отформатированы ФИО, название и номер телефона:

Результат

Сейчас у нас есть стабильно работающее приложение 24 часа в сутки без необходимости локального запуска. 

На локальной машине мы не устанавливали ничего, кроме Docker Desktop — все остальные зависимости уже были упакованы в контейнеры. Поэтому во время отладки появились только те баги, которые вызывал код и настройки самого проекта. Любой разработчик на любой машине получил бы те же самые проблемы, и решал бы их примерно так же.

Что будем делать дальше

В следующий раз будем испытывать AI-агентов как инструмент архитектурного анализа. Разберём существующий проект и попробуем добавить в него новые функции.

Содержание цикла статей про создание приложений с AI-агентами

  1. Пишем первое приложение с AI-стартером, чтобы видеть прибыли и убытки

  2. Добавляем в бизнес-портал Битрикс24 роботов для автоматизации

  3. Что даёт воспроизводимая среда разработки и как развернуть контейнеры на VPS.

Комментарии (0)