FreePBX
Интеграция получает журнал звонков (CDR) через GraphQL API FreePBX, а записи разговоров забирает с сервера АТС по SFTP. API FreePBX аудио не отдаёт, поэтому SFTP-доступ к каталогу записей обязателен.
Что попадает в Лия Sense — то же, что и у Asterisk: только звонки с записью, метаданные из CDR, аудио по запросу из каталога записей.
Что подготовить на стороне FreePBX
1. Создайте приложение API
В FreePBX откройте модуль API (Connectivity → API), создайте приложение типа Machine-to-Machine и сохраните его Client ID и Client Secret. Приложению нужны права на чтение CDR: интеграция запрашивает scope gql:cdr:read.
Адрес панели FreePBX должен быть доступен с адресов Лия Sense (уточните их у поддержки) по HTTP или HTTPS; рекомендуем HTTPS.
2. Включите запись разговоров
Запись должна вестись штатными средствами FreePBX (MixMonitor), а в CDR должно заполняться поле recordingfile — по нему интеграция находит файл. Звонки без recordingfile пропускаются.
3. Создайте пользователя SFTP только на чтение
Пользователь должен читать каталог записей — по умолчанию /var/spool/asterisk/monitor/ со всеми подкаталогами вида ГГГГ/ММ/ДД/. Shell можно отключить; аутентификация — по паролю или по SSH-ключу. Порт SFTP должен быть доступен с адресов Лия Sense.
4. Уточните часовой пояс АТС
API FreePBX принимает даты с точностью до суток в локальном времени АТС. Чтобы интеграция запрашивала правильные дни, укажите часовой пояс сервера FreePBX в формате IANA, например Europe/Moscow. Это обязательное поле; неверная зона сдвинет окно и потеряет звонки на границе суток.
Поля формы подключения
| Поле | Обязательное | Описание |
|---|---|---|
| Адрес FreePBX | Да | Адрес панели целиком, например https://pbx.example.com |
| Client ID приложения API | Да | Client ID приложения из шага 1 |
| Client Secret | Да | Client Secret того же приложения |
| Хост SFTP для записей | Да | DNS-имя или IP сервера с записями (обычно тот же сервер FreePBX) |
| Порт SFTP | Нет | По умолчанию 22 |
| Пользователь SFTP (только чтение) | Да | Учётная запись из шага 3 |
| Пароль SFTP | Одно из двух | Пароль пользователя — либо приватный ключ |
| Приватный ключ SFTP | Одно из двух | Полное содержимое приватного ключа, включая строки BEGIN и END |
| Отпечаток/ключ хоста | Нет | Отпечаток SHA-256/MD5/SHA-1 или публичный ключ хоста. Пусто — ключ хоста не проверяется, подключение принимается с любым ключом сервера; укажите значение, чтобы включить строгую проверку |
| Часовой пояс АТС | Да | IANA-зона, например Europe/Moscow |
| Максимальная длительность звонка, ч | Нет | По умолчанию 4. Влияет на границы периода при разовых задачах |
| Каталог записей | Нет | Корень дерева записей на SFTP, по умолчанию /var/spool/asterisk/monitor |
| Шаблон пути к записи | Нет | Как из recordingfile складывается путь внутри каталога записей. По умолчанию {Y}/{m}/{d}/{basename} — типовая раскладка FreePBX, см. пояснение под таблицей |
| Контексты входящих | Нет | Контексты диалплана входящих звонков через запятую. По умолчанию from-pstn,from-trunk,from-did-direct |
| Контексты исходящих | Нет | По умолчанию from-internal |
| Шаблон внутреннего номера | Нет | Регулярное выражение внутреннего номера, например ^\d{3,4}$. Нужен для направления internal |
| Каналов в записи (1 или 2) | Нет | По умолчанию 1 (моно). 2 — только если запись ведётся в стерео |
Шаблон пути к записи задаёт путь внутри Каталога записей: {Y} — год из четырёх цифр, {m} — месяц, {d} — день (две цифры, по дате начала звонка в часовом поясе АТС), {basename} — значение recordingfile из CDR (только имя файла, без каталогов). Пример: каталог /var/spool/asterisk/monitor, звонок 11 сентября 2026 года, recordingfile = out-871.wav → /var/spool/asterisk/monitor/2026/09/11/out-871.wav.
При нажатии Подключить система получает токен API, выполняет пробный запрос CDR и проверяет каталог записей по SFTP. Ошибка авторизации (401/403) означает неверные Client ID/Secret или недостаточные права приложения.
Требования к записям
Те же, что у Asterisk:
- запись через
MixMonitor, форматы.wav,.wav49,.mp3,.ogg; - файл остаётся в каталоге записей до обработки — интеграция забирает его по SFTP в момент обработки, а не копирует заранее;
- размер одной записи — до 64 МиБ (67 108 864 байт);
- стерео (
Каналов в записи = 2): канал 0 — оператор, канал 1 — клиент.
Направление, метаданные и фильтры
Направление звонка, набор метаданных (cdr.*), статус и фильтры задачи сбора («Результат звонка», «Минимальная длительность разговора») совпадают с интеграцией Asterisk — см. соответствующие разделы на странице Asterisk.
Ограничения
- Один CDR — не всегда один разговор: переводы, очереди и
Local-каналы создают несколько плеч с общимlinkedid; загружаются только плечи с поддерживаемой записью. - Даты в API FreePBX — целые локальные сутки. Интеграция запрашивает нужные дни и затем точно фильтрует звонки по времени сама, но неверный часовой пояс всё равно приведёт к потерям на границах.
- Оценка объёма («Оценить» в задаче) для FreePBX приблизительная: она считает все строки CDR, включая звонки без записи.
.wav49может быть сохранён как.WAVс кодеком GSM внутри; такой файл может не воспроизводиться. Предпочтительны.wav(PCM) или.mp3.- Раскладка каталога записей и адреса API различаются между версиями FreePBX — при первом подключении обязательно проверьте воспроизведение записи.
Проверка после подключения
- Создайте разовую задачу за один прошедший день со звонками и запустите её.
- Дождитесь завершения и откройте загруженный разговор: проверьте время звонка, номера в метаданных и воспроизведение записи.
- Если записи нет — проверьте, что
recordingfileв CDR заполнен, а файл по пути из настроенного шаблона (для шаблона по умолчанию —<каталог записей>/ГГГГ/ММ/ДД/<recordingfile>) читается SFTP-пользователем. - Создайте периодическую задачу и привяжите пайплайн.