Яндекс.Метрика

Asterisk Эксперт

Asterisk Эксперт с 31 мая по 1 июня

Количество
свободных мест

8 Записаться

Курс по Asterisk

Интенсив-курс по Asterisk с 26 мая по 30 мая

Количество
свободных мест

3 Записаться

Курсы по Mikrotik MTCWE

Курсы по Mikrotik MTCWE с 20 октября по 23 октября

Количество
свободных мест

6 Записаться
Continuous delivery модулей для FreePBX и MikoPBX
45
Доклад
Николай Бекетов
Continuous delivery модулей для FreePBX и MikoPBX

Continuous delivery модулей для FreePBX и MikoPBX

Введение

Коротко о компании


     Мы уже 16 лет занимаемся разработкой на 1С. За это время создали, пожалуй, лучшее решение по интеграции Asterisk и 1С, и уже около 9 лет успешно развиваем его. Помимо этого, мы «перехватили флаг» у компании Plantel, которая раньше разрабатывала продукт на Asterisk под названием Ascosia. В своё время Ascosia была очень популярна, но, как вы знаете, компанию, которая её делала, купила 3CX и, заплатив немалые деньги, фактически закрыла проект.

 

     Мы переписали Ascosia «с нуля» и сделали MikoPBX. Сейчас это вполне успешный продукт, включённый в реестр российского ПО и используемый по всему миру. У нас много пользователей, которые им интересуются.

 

     Мы очень серьёзно подходим к качеству и стандартам разработки, используем инженерный подход, любим «копаться в кишочках» и считаем себя полноценными разработчиками.


 

Разработка интеграции 1С с телефонией

 

     Когда мы создавали наш продукт интеграции 1С и телефонии, стремились максимально упростить установку, сделать её понятной для пользователей. Именно поэтому нам понравилась идея Ascosia: можно было упаковать всё в один дистрибутив, в один ISO-файл. Клиент после установки сразу получал настроенную станцию, готовую к работе с 1С.

 

     Но так сложилось, что FreePBX — тоже весьма популярная система, и сейчас примерно две трети наших клиентов используют именно её. Нам хотелось упростить механизм доставки и установки наших модулей и для FreePBX.

 

     Наш модуль написан на Go. Это сервер телефонии, который ставится рядом с Asterisk, одним концом подключается к AMI (Asterisk Management Interface), ловит события (пришёл звонок, звонок завершён, произошла переадресация и т.д.), обрабатывает их и передаёт в CRM-систему в удобном для разработчика формате. Таким образом, разработчикам CRM не нужно разбираться во внутренних деталях телефонии.


 

Сервер репозиториев и механизм доставки

 

     Когда мы делали наш сервер репозиториев и механизм доставки расширений для MikoPBX, всё оказалось достаточно просто, потому что мы контролируем проект с обеих сторон: полностью владеем исходным кодом MikoPBX. Мы спроектировали репозиторий, подключили его к системе сборки модулей, и теперь модуль автоматически собирается, выкладывается в репозиторий, а затем в MikoPBX есть кнопка «Установить», которая модуль скачивает и устанавливает. Проблем здесь нет: у пользователя есть личный кабинет, там доступны релизы, сама MikoPBX бесплатна, а вот интеграция с CRM-системами (1С, Битрикс24 и т.д.) — это то, на чём мы зарабатываем. Система лицензирования тоже есть, но всё достаточно прозрачно.

 

     Проблема в том, что с одной только MikoPBX мы далеко не уедем. С самого начала было понятно, что нам придётся иметь дело и с FreePBX, потому что многие хотят получить наш функционал именно там. На первый взгляд, всё просто: берём файл нашего модуля, загружаем во FreePBX и запускаем. Но выяснилось, что наш модуль «весит» порядка 50 МБ, и на большинстве инсталляций FreePBX есть ограничение в PHP (примерно 8 МБ на максимальный размер загружаемого файла). Через веб-интерфейс такой модуль не загрузить. Нужно заходить в консоль, править php.ini, перезапускать веб-сервер (Apache или что у них стоит). С точки зрения удобства для пользователя — это очень плохо. Наша цель была, чтобы модуль можно было легко скачать, установить, попробовать и, в случае интереса, купить. Когда нужно лезть в консоль, удобство теряется.

 

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

 

     Я полез в код FreePBX, чтобы разобраться, как устроен этот механизм. На тот момент в системе была куча легаси-кода: глобальные переменные, отсутствие классов и так далее. Продукт классный и развивался много лет, да ещё и большое количество людей к нему прикасались. Разбираться было непросто. Честно скажу, я потратил 100–200 часов, чтобы изучить, как работает простейший функционал, о котором буду рассказывать. Надо отдать должное: FreePBX активно развивается. Каждый раз, заходя в их код, вижу улучшения — появляются классы, шёл переход на PHP 7, идёт рефакторинг. Система не ужасная, но, на мой взгляд, MikoPBX удобнее.


 

Сложности с разными сборками

     Сложность в том, что существует множество сборок: есть дистрибутив от VoxLink (VoxDistro), есть разные версии FreePBX (13, 16 и прочие), и все они работают немного по-своему. Приходится постоянно подстраиваться.

 

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


 

Сертификат от Sangoma

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


 

HTTPS-соединения

     Далее, в документации по модулям упоминается, что всегда нужно использовать HTTPS-соединения. С появлением Let’s Encrypt это вроде бы не проблема, но осенью прошлого года (1 октября) был отозван один из сертификатов, и около 99% инсталляций FreePBX, где не обновлялась операционная система (а таких много, люди порой не трогают работающие серверы годами), перестали получать обновления через бесплатный SSL. Пришлось искать платные сертификаты или использовать альтернативы вроде Amazon Load Balancer, но не Let’s Encrypt. Так что с HTTPS тоже не всё просто.


 

API для репозитория

     Для полноценного сервера репозиториев, насколько я выяснил, нужно всего две точки входа в API:

  1. GetModuleFile — отдаёт сам архив модуля.
  2. GetModuleUpdate — отдаёт описание доступных версий модуля.

     Принцип следующий:

  • Запрос на GetModuleFile (обычно POST, хотя в некоторых версиях FreePBX может быть GET) содержит путь вроде:

    https://ваш-сервер/GetModuleFile/имя_модуля/версия/архив.tar.gz

    Если вместо конкретной версии указать что-то вроде latest, вы отдаёте последнюю доступную версию.

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

     После успешной загрузки архив распаковывается и устанавливается стандартными методами FreePBX.


 

Обновление модулей

     Когда в интерфейсе FreePBX нажимают «Проверить онлайн» (или проверка идёт по расписанию), система не использует «ручную» ссылку на архив. Она смотрит в module.xml вашего модуля, где прописана опция Update URL (тот самый GetModuleUpdate). FreePBX делает к нему запрос вида:

GET https://ваш-сервер/GetModuleUpdate?module=имя_модуля&vers=14.005

(параметры могут немного отличаться в разных версиях). Сервер репозиториев должен вернуть JSON-ответ с описанием доступных версий, например:

{
"latest": "12",
"md5sum": "...",
"changelog": "...",
"size": 12345678,
"download": "https://ваш-сервер/GetModuleFile/имя_модуля/12/архив.tar.gz"
}

FreePBX увидит, что есть более свежая версия (12), покажет ChangeLog, предложит обновиться и скачает файл по указанной ссылке. Модуль обновится автоматически, без консоли и ручной загрузки.

     Существует также секция previous, позволяющая откатываться на более ранние версии, если что-то пошло не так.


 

Итог

Чтобы всё это заработало, нам понадобилось:

  • Получить SSL-сертификаты (и учесть, что бесплатные могут не сработать на «застывших» системах).
  • Реализовать две точки в сервере репозиториев (GetModuleFile и GetModuleUpdate) и корректно обрабатывать HEAD-запросы, версии, размеры файлов и т.д.
  • Настроить систему сборки модулей так, чтобы в module.xml автоматически прописывались нужные ссылки на репозиторий, а файлы подписывались сертификатом от Sangoma и размещались в нужном месте.

Мы автоматизировали эти процессы, и теперь у нас всё работает штатно.


 

Заключение

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

 

Таймкоды
Показать еще..
Свернуть..
Ежегодная конференция по Asterisk 2025!

Билеты уже в продаже!

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

Наши
клиенты

Посмотреть все
Спасибо !
Мы свяжемся с Вами в ближайшее время
Проверка номера

Проверка номера

Быстро узнать мобильного или городского оператора. Впишите номер

Мы проверили номер

+7 846 254 51 02

МТС (с 2016)

Повторить