Интеграция Asterisk с CRM: где нужны FreePBX и AGI
Для большинства небольших офисов я оставляю FreePBX базовую телефонию, а нестандартный обмен с CRM выношу в отдельную интеграцию. AGI подходит для логики внутри обработки конкретного вызова; AMI — для событий и команд, ARI — для приложений, которым нужно управлять каналами. Ниже — как выбрать без выдуманных сроков и обещаний «полного контроля».
FreePBX и Asterisk решают разные задачи
FreePBX — веб-интерфейс управления Asterisk и его конфигурацией. Он удобен там, где нужно поддерживать обычную офисную телефонию: внутренние номера, входящие маршруты, очереди, расписания и типовые сценарии. Для небольшой команды это часто разумная отправная точка: администратор меняет повседневные настройки через знакомую панель, а не ведёт каждое изменение в нескольких файлах вручную. В первой части проекта я фиксирую, какие функции остаются типовыми, кто будет менять маршруты и как эти изменения проверяются. Для такой работы важнее настройка телефонии для бизнеса, чем спор о том, какой интерфейс «правильнее».
Но FreePBX не является CRM-коннектором, который сам угадает логику продаж. Модули и доступные точки расширения зависят от версии и конкретной задачи; наличие веб-панели не обещает готовой интеграции с любой CRM. Когда нужны поиск карточки по номеру, передача результата разговора и обработка ошибок API, я описываю эти действия отдельно. В исходном черновике система якобы блокировала PJSIP-конфигурацию, а команда днями искала обход. Это слишком широкое утверждение: FreePBX управляет конфигурацией, а ручные изменения в генерируемых файлах могут быть перезаписаны. Устойчивая настройка опирается на поддерживаемые точки расширения и документацию именно установленной версии.
В качестве базового примера можно рассматривать FreePBX 17: база знаний указывает установку на Debian 12 через установочный скрипт Sangoma. Это не повод переносить инструкцию на произвольную ОС или запускать её поверх готового сервера: способ установки и требования надо сверить с официальным руководством и состоянием системы. Путь «поставим панель, потом разберёмся» иногда заканчивается тем, что неизвестно, кто владеет конфигурацией, как обновлять модули и где хранится источник правды. Я фиксирую версию, способ установки и порядок изменения маршрутов до начала интеграции.
В рабочем проекте условной компании из поля company я бы оставил в FreePBX регистрацию абонентов, очередь и базовые входящие маршруты, если они уже нужны бизнесу. Здесь не требуется переписывать работающий контур только потому, что интеграцию можно сделать «чище» в чистом Asterisk. Переход на другую основу оправдан конкретными ограничениями, а не эстетическим предпочтением разработчика. Отдельно отмечаю, какие файлы формируются самой панелью, какие расширения разрешены и как откатить изменение. Это скучная часть проекта; зато звонки продолжают идти, пока CRM получает новые функции.
- 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».
- AGI: обработка канала из диалплана
- AMI: события и разрешённые действия
- ARI: управление ресурсами звонка
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. Для каждой ветки задаю ожидаемый результат и способ увидеть его в журнале. Автоматический перезапуск процесса сам по себе не доказывает, что зависший вызов корректно завершится. И тесты кода не заменяют проверку с реальными телефонами и маршрутом вызова. Чем больше каналов приложение контролирует напрямую, тем важнее иметь понятный возврат к штатному сценарию.
- HTTP API и WebSocket-события
- 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 быстрая» — не тест отказа.
- Нужны события: AMI
- Нужен шаг в диалплане: AGI
- Нужен контроль каналов: ARI
Частые вопросы
Можно ли использовать FreePBX и собственный диалплан одновременно?
Да, для пользовательской логики предусмотрены точки расширения, включая extensions_custom.conf. Проверяйте подключение контекста и документацию установленной версии; не редактируйте наугад сгенерированные файлы.
Что выбрать для показа карточки CRM при звонке?
Если CRM достаточно получить события звонка, обычно оценивают AMI и отдельный сервис доставки события оператору. Сам интерфейс Asterisk не рисует карточку в CRM.
Когда выбирать AGI?
Когда внешний код должен участвовать в обработке конкретного канала из диалплана. Задайте тайм-аут и безопасный сценарий при недоступной CRM.
Когда нужен ARI?
Когда приложение должно асинхронно управлять каналами, мостами или медиа через REST и получать события по WebSocket. Это требует отдельного приложения и передачи канала через Stasis.
Нужен ли отдельный сервер для AGI?
Для классического AGI Asterisk запускает программу локально; FastAGI использует TCP-соединение с внешним сервисом. Размещение выбирают по нагрузке, изоляции и эксплуатации.
Источники
- Asterisk Documentation: AGI — Назначение AGI, запуск внешней программы и вариант FastAGI. https://docs.asterisk.org/Asterisk_22_Documentation/API_Documentation/Dialplan_Applications/AGI/
- Asterisk Documentation: AMI — Модель AMI, manager.conf, действия, события и права пользователей. https://docs.asterisk.org/Configuration/Interfaces/Asterisk-Manager-Interface-AMI/The-Asterisk-Manager-TCP-IP-API/
- Asterisk Documentation: ARI overview — Различия AGI/AMI/ARI, Stasis, REST и WebSocket в архитектуре ARI. https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/
- Asterisk Documentation: ARI configuration — Настройки HTTP-сервера и ARI, порт по умолчанию и TLS. https://docs.asterisk.org/Configuration/Interfaces/Asterisk-REST-Interface-ARI/Asterisk-Configuration-for-ARI/
- FreePBX installation script — Официальный установочный скрипт FreePBX 17 для Debian 12. https://github.com/FreePBX/sng_freepbx_debian_install
- Sangoma FreePBX dialplan customization — Пользовательские точки расширения диалплана FreePBX. https://sangomakb.atlassian.net/wiki/spaces/FCD/pages/10551405/FreePBX+Dialplan+Customization+AstriCon+2020



