FreePBX или AGI: как связать Asterisk с CRM
АйТи Фреш
Серверы и инфраструктура

Интеграция Asterisk с CRM: где нужны FreePBX и AGI

Автор: , директор ООО «АйТи-Фреш» · · ~12 мин чтения
Схема выбора FreePBX, AGI, AMI и ARI для интеграции Asterisk с CRM
Интерфейс выбирают по сценарию звонка

Для большинства небольших офисов я оставляю FreePBX базовую телефонию, а нестандартный обмен с CRM выношу в отдельную интеграцию. AGI подходит для логики внутри обработки конкретного вызова; AMI — для событий и команд, ARI — для приложений, которым нужно управлять каналами. Ниже — как выбрать без выдуманных сроков и обещаний «полного контроля».

FreePBX и Asterisk решают разные задачи

FreePBX — веб-интерфейс управления Asterisk и его конфигурацией. Он удобен там, где нужно поддерживать обычную офисную телефонию: внутренние номера, входящие маршруты, очереди, расписания и типовые сценарии. Для небольшой команды это часто разумная отправная точка: администратор меняет повседневные настройки через знакомую панель, а не ведёт каждое изменение в нескольких файлах вручную. В первой части проекта я фиксирую, какие функции остаются типовыми, кто будет менять маршруты и как эти изменения проверяются. Для такой работы важнее настройка телефонии для бизнеса, чем спор о том, какой интерфейс «правильнее».

Но FreePBX не является CRM-коннектором, который сам угадает логику продаж. Модули и доступные точки расширения зависят от версии и конкретной задачи; наличие веб-панели не обещает готовой интеграции с любой CRM. Когда нужны поиск карточки по номеру, передача результата разговора и обработка ошибок API, я описываю эти действия отдельно. В исходном черновике система якобы блокировала PJSIP-конфигурацию, а команда днями искала обход. Это слишком широкое утверждение: FreePBX управляет конфигурацией, а ручные изменения в генерируемых файлах могут быть перезаписаны. Устойчивая настройка опирается на поддерживаемые точки расширения и документацию именно установленной версии.

В качестве базового примера можно рассматривать FreePBX 17: база знаний указывает установку на Debian 12 через установочный скрипт Sangoma. Это не повод переносить инструкцию на произвольную ОС или запускать её поверх готового сервера: способ установки и требования надо сверить с официальным руководством и состоянием системы. Путь «поставим панель, потом разберёмся» иногда заканчивается тем, что неизвестно, кто владеет конфигурацией, как обновлять модули и где хранится источник правды. Я фиксирую версию, способ установки и порядок изменения маршрутов до начала интеграции.

В рабочем проекте условной компании из поля company я бы оставил в FreePBX регистрацию абонентов, очередь и базовые входящие маршруты, если они уже нужны бизнесу. Здесь не требуется переписывать работающий контур только потому, что интеграцию можно сделать «чище» в чистом Asterisk. Переход на другую основу оправдан конкретными ограничениями, а не эстетическим предпочтением разработчика. Отдельно отмечаю, какие файлы формируются самой панелью, какие расширения разрешены и как откатить изменение. Это скучная часть проекта; зато звонки продолжают идти, пока CRM получает новые функции.

Не редактируйте наугад конфиги, которые генерирует панель.

Когда нужен AGI, а когда хватит AMI

AGI — интерфейс между диалпланом Asterisk и внешней программой, которая обрабатывает канал. Asterisk запускает AGI-приложение для вызова; классический вариант обменивается данными через стандартные потоки, а FastAGI подключается к внешнему сервису по TCP. Я выбираю AGI, когда логика должна быть частью последовательности конкретного звонка: передать номер в CRM, получить ограниченный ответ, затем продолжить сценарий или перейти к предусмотренной ветке ошибки. Вызов программы задаётся в диалплане. Это не «вся CRM внутри АТС», а одна точка интеграции с явным входом, выходом и пределом ожидания. Разбор того, почему в связке могут пропадать записи, есть в материале Asterisk и CRM; здесь же я ограничиваюсь выбором интерфейса.

У синхронной схемы есть цена: пока AGI выполняет действие для канала, обработка этого шага ждёт. Если CRM отвечает медленно или недоступна, нельзя бесконечно держать абонента в тишине. Я заранее определяю тайм-аут, поведение при пустом результате и при сбое сети, а затем проверяю их на стенде. Всплывающая карточка на рабочем месте оператора обычно требует ещё и клиентского приложения или механизма доставки события; один AGI не создаёт интерфейс в браузере. Поэтому формулировка «написали AGI — появилось окно» скрывает половину системы.

AMI — отдельный интерфейс управления Asterisk по TCP. Через него приложение может получать события, выполнять разрешённые действия и наблюдать за каналами и очередями. Это часто уместно, когда CRM или промежуточный сервису нужно узнать о начале и завершении вызова, сопоставить события и инициировать команду. AMI не следует путать с AGI: это не скрипт, который диалплан запускает для обработки текущего канала. Права AMI-пользователя нужно ограничить необходимыми классами, а доступ к интерфейсу — сетевыми правилами. Полномочие command особенно не стоит выдавать интеграции без конкретной необходимости.

В условном сценарии CRM показывает карточку по входящему номеру, а оператору достаточно видеть факт звонка и его статус. Я бы сначала проверил, можно ли получить нужные события через AMI и передать их в небольшое промежуточное приложение. Если же результат CRM должен прямо изменить прохождение звонка в диалплане, рассматриваю AGI. Это не соревнование названий: выбирается точка, где бизнес-решение должно повлиять на вызов. Если нужен интерфейс для полноценного управления каналами, мостами и медиа, смотрю на ARI — но это уже архитектура приложения, а не «мониторинг через ARI».

Выбирайте по месту, где логика должна повлиять на вызов.
Сравнение интерфейсов Asterisk AGI AMI и ARI для CRM
Три интерфейса — три разные роли

ARI — отдельный уровень управления звонком

ARI — асинхронный API Asterisk для приложений, которым нужно управлять его объектами: каналами, мостами и медиа. Он использует REST-интерфейс и WebSocket-события; диалплан передаёт канал приложению через Stasis(). Поэтому ARI не является просто более современным мониторингом и не заменяет автоматически FreePBX. Приложение получает значительную ответственность за поведение звонка: нужно обрабатывать события, завершение канала, ошибки, повторные подключения и сценарий возврата управления. Я выбираю ARI, когда задачу действительно проще выразить как отдельное приложение управления вызовами. Если сам план набора требует ревизии, пригодится материал основы диалплана Asterisk.

В документации Asterisk прямо разграничены роли: AGI выполняет внешнюю программу для канала, AMI даёт событийный механизм управления и наблюдения, а ARI предназначен для коммуникационных приложений с управлением объектами Asterisk. У ARI есть три связанные части: HTTP API, WebSocket для событий и Stasis в диалплане. Выдернуть одну часть и назвать это «ARI-мониторингом» — способ получить схему, в которой никто не понимает, кто отвечает за вызов. Когда задаче нужны только уведомления о звонках, сначала проверяю AMI; когда требуется контроль над мостами и медиа, оцениваю объём приложения для ARI.

Доступ ARI нужно настраивать с учётом реального сетевого окружения. В документации указано, что HTTP-сервер Asterisk настраивается отдельно, а порт по умолчанию — 8088; не надо воспринимать это как требование открыть порт наружу. Привязывают сервис к нужному адресу, используют TLS/WSS там, где трафик проходит по сети, и выдают приложению отдельные учётные данные. Официальное руководство отдельно предупреждает не обращаться к ARI прямо из веб-страницы: между браузером и Asterisk должен быть сервер приложения, который решает вопросы аутентификации, журналирования и изоляции.

Проверка на стенде должна включать нормальный звонок, занятый номер, отмену до ответа, недоступность CRM, перезапуск интеграционного сервиса и потерю WebSocket-соединения, если используется ARI. Для каждой ветки задаю ожидаемый результат и способ увидеть его в журнале. Автоматический перезапуск процесса сам по себе не доказывает, что зависший вызов корректно завершится. И тесты кода не заменяют проверку с реальными телефонами и маршрутом вызова. Чем больше каналов приложение контролирует напрямую, тем важнее иметь понятный возврат к штатному сценарию.

Порт по умолчанию не означает, что его надо публиковать.
Я могу разобрать текущий план набора, выбрать интерфейс интеграции и собрать проверяемый сценарий с обработкой отказа CRM. Объём и срок называю после аудита конфигурации и требований. Обсудить задачу
Поток вызова от Asterisk к ARI-приложению и CRM
Stasis передаёт канал приложению

Как оставить FreePBX в схеме и не потерять конфигурацию

Гибридная схема не означает, что AGI и FreePBX «объединяются» в волшебный режим. Панель продолжает управлять базовой телефонией, а отдельный сценарий вызывается в подходящей точке диалплана. В FreePBX существуют поддерживаемые способы добавлять пользовательскую логику; база знаний отдельно подтверждает использование /etc/asterisk/extensions_custom.conf для пользовательских контекстов. Имя файла ещё не делает любой фрагмент безопасным: контекст нужно подключить в правильном месте и проверить по документации и правилам конкретной версии.

Не правлю вручную генерируемые файлы вроде основного extensions.conf или сгенерированных PJSIP-настроек как постоянный способ изменения системы. После применения изменений в интерфейсе или обновления они могут быть пересобраны. Для индивидуальной логики использую документированные custom-файлы и ограниченный собственный контекст, а изменение сначала испытываю отдельно. Это сохраняет управляемость: понятно, где заканчивается конфигурация панели и начинается код интеграции. Если задача требует вмешаться в то, чем панель должна владеть, я сначала проверяю поддерживаемый механизм, а не добавляю ещё один «временный» файл в каталог конфигурации.

Вызов AGI из диалплана должен быть узким и предсказуемым. В программу передаются только нужные данные; секреты CRM не помещаются в аргументы командной строки или журнал. Сетевые ошибки, невалидный ответ и превышение времени ожидания должны приводить к заранее выбранной ветке. Внешний сервис не должен иметь возможности произвольно выполнять команды Asterisk. Для AMI и ARI действует тот же принцип: отдельные учётные записи, минимальные права, ограничение адресов и ротация секретов. Интеграция обрабатывает телефонные номера и данные клиентов, поэтому журналирование тоже требует меры: записывать достаточно для диагностики, но не превращать лог в копию CRM.

Я разделяю ответственность на две части. Администратор отвечает за версии, резервную копию конфигурации, маршруты и проверку связи после обновления. Разработчик — за код, обработку исключений, тайм-ауты и понятный журнал. Перед выпуском фиксируем тестовые сценарии и способ отката. В небольшом офисе это можно вести без громоздких процессов, но устная договорённость «если что — позвоним программисту» документацией не считается. Этот подход особенно полезен, если команда меняется: следующий специалист видит границы своей зоны, а не археологический слой правок.

Сначала стенд и откат, затем рабочие звонки.

Выбор интерфейса: короткое дерево решений

Если CRM должна лишь открыть карточку по номеру, сначала уточняю, откуда операторское приложение получит событие. Для событий звонка и простых действий обычно рассматриваю AMI. Если нужно обработать текущий вызов по шагам — передать номер в CRM и вернуть результат в диалплан — рассматриваю AGI. Если приложение должно само создавать мосты, управлять медиа и менять состояние каналов в асинхронном режиме, тогда оправдан ARI. FreePBX остаётся подходящим способом управлять базовыми маршрутами и очередями, если существующая схема этого требует. Одно название интерфейса не отвечает на вопрос о границах ответственности. А если решающим становится именно поведение ARI под нагрузкой, отдельно разобрана нагрузка скриптов ARI.

До оценки стоимости я прошу описать три вещи: какие события запускают обмен, что должна сделать CRM и что услышит звонящий при ошибке. Затем проверяю API CRM, частоту обращений, требования к защите данных и допустимое поведение при недоступности внешнего сервиса. Никаких честных универсальных сроков «два дня на FreePBX» или «неделя на AGI» нет: они зависят от готовности CRM, текущего диалплана, тестовой среды и числа сценариев. В исходном тексте были точные сроки и цена проекта без проверяемого основания; я их удалил. Коммерческая оценка возможна после этих вводных.

Для условной компании из примера план работ начинается с инвентаризации версии Asterisk/FreePBX и экспортируемой конфигурации. Далее описываются события и ветки ошибок, выбирается интерфейс, собирается тестовый сценарий, затем проводится проверка на стенде и приёмка с операторами. На выходе должны быть схема потока вызова, список изменённых точек конфигурации, инструкция по откату и контакт владельца интеграционного кода. Это конкретнее, чем обещание «лучшего из двух миров»: можно проверить, кто что менял и как система поведёт себя при отказе CRM.

Мой выбор по умолчанию для малого офиса — не мигрировать работающую телефонию ради моды. Я сохраняю FreePBX для типовой конфигурации, а интеграцию строю через тот интерфейс, чьи свойства совпадают с задачей: AMI для событий, AGI для шага в диалплане, ARI для приложения управления звонком. Когда требования не помещаются в одну из этих схем, уточняю их до разработки. Так меньше шанс обнаружить в эксплуатации, что карточка открывается, зато сам вызов зависает на внешнем API. И да, «у нас CRM быстрая» — не тест отказа.

Оценка сроков начинается после описания сценариев.
Дерево выбора интерфейса Asterisk для CRM
Начните с требуемого действия

Частые вопросы

Можно ли использовать FreePBX и собственный диалплан одновременно?

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

Что выбрать для показа карточки CRM при звонке?

Если CRM достаточно получить события звонка, обычно оценивают AMI и отдельный сервис доставки события оператору. Сам интерфейс Asterisk не рисует карточку в CRM.

Когда выбирать AGI?

Когда внешний код должен участвовать в обработке конкретного канала из диалплана. Задайте тайм-аут и безопасный сценарий при недоступной CRM.

Когда нужен ARI?

Когда приложение должно асинхронно управлять каналами, мостами или медиа через REST и получать события по WebSocket. Это требует отдельного приложения и передачи канала через Stasis.

Нужен ли отдельный сервер для AGI?

Для классического AGI Asterisk запускает программу локально; FastAGI использует TCP-соединение с внешним сервисом. Размещение выбирают по нагрузке, изоляции и эксплуатации.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи