Интеграция ручных настроек с FreePBX

В предыдущей теме мы научились создавать собственные контексты в файле extensions_custom.conf. Это дало свободу в написании логики, но пока ваш код существует изолированно. Пора объединить эти два мира.

Кто главный в конфигурации

В экосистеме FreePBX действует жесткое правило: веб-интерфейс — это «автор» большинства файлов. Если вы внесете изменения в extensions_additional.conf напрямую, система сотрет их при первом же нажатии кнопки Apply Config.

Чтобы ручной код и GUI не конфликтовали, Asterisk использует иерархию включений. Основной файл extensions.conf через директиву #include собирает диалплан из разных частей. Ваша «безопасная гавань» — файлы с суффиксом _custom.conf. FreePBX никогда их не трогает, что гарантирует сохранение ручных изменений при любых обновлениях.

Схема 1 показывает, как ваш код вплетается в общую логику обработки вызова.

Custom Destinations: мост между кодом и интерфейсом

Чтобы направить входящий звонок или пункт IVR на ваш контекст, используйте механизм Custom Destinations. Это и есть полноценная интеграция с FreePBX.

Алгоритм простой:

  1. Пишете код в extensions_custom.conf.
  2. Регистрируете этот контекст в GUI (Admin → Custom Destinations).
  3. Используете его в любых выпадающих списках выбора направления.

Пример: Сервис проверки баланса

Добавим в /etc/asterisk/extensions_custom.conf такой блок:

[custom-check-balance]
exten => s,1,Answer()
 same => n,Playback(demo-congrats) 
 same => n,SayNumber(150)
 same => n,Playback(vm-rubles)
 same => n,Hangup()

Чтобы этот код стал доступен в интерфейсе, создайте Custom Destination:

  • Target: custom-check-balance,s,1 (строго в формате контекст,экстеншен,приоритет).
  • Description: Проверка баланса (это имя отобразится в GUI).

Теперь в модуле Inbound Routes в поле Set Destination можно выбрать созданный пункт. Это и есть вызов из GUI.

🛠 Совет эксперта: Перед нажатием Apply Config в браузере всегда проверяйте синтаксис командой dialplan reload в консоли Asterisk. Опечатка в кастомном файле может «уронить» весь диалплан.

Как вернуть вызов в логику FreePBX

Иногда нужно выполнить проверку в коде и вернуть абонента обратно — например, в стандартную очередь.

Для этого в настройках Custom Destination включите опцию Return. В диалплане используйте приложение Return(), и FreePBX направит вызов дальше по цепочке.

Чего делать не стоит: Не используйте extensions_override_freepbx.conf для подмены стандартных функций. Это «грязный» хак 🚩, который делает поведение АТС непредсказуемым при обновлениях.

Правильный путь: Создавайте уникальные контексты и подключайте их через Custom Destinations или стандартные «крючки» (hooks) вроде [from-internal-custom].

Схема 2 демонстрирует правильный цикл разработки.

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

Впереди — глубокое изучение драйвера PJSIP. Мы разберем его объектную модель и поймем, почему он вытеснил классический chan_sip.

Понравился урок?

Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей

Продолжить в Telegram