AsterConnector v2.0 - Asterisk+Битрикс24
Интеграция Asterisk (FreePBX / Issabel) с Битрикс24.
Что умеет
- Регистрация входящих и исходящих звонков в Битрикс24
- Автосоздание лидов, контактов и сделок при звонке
- Click-to-Call из карточки клиента в Битрикс24
- Загрузка записей разговоров в карточку звонка
- Маршрутизация входящих на ответственного менеджера
- Создание задач «Перезвонить» при пропущенных
- Автозакрытие задач при успешном перезвоне
- Повторные сделки для существующих клиентов
- Несколько DID с разными воронками продаж
- Нормализация номеров телефонов
- Работает с Битрикс24 Облако и Коробка
Системные требования
Сервер
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| ОС | Ubuntu 20.04 / CentOS 7 | Ubuntu 22.04 LTS |
| PHP | 8.0 | 8.1 и выше |
| RAM | 256 МБ свободно | 512 МБ |
| Asterisk | 16 | 18 и выше |
| Место на диске | 100 МБ | 1+ ГБ (для записей) |
PHP расширения (обязательные)
| Расширение | Назначение |
|---|---|
php-cli | Запуск PHP из командной строки |
php-curl | HTTP запросы к Битрикс24 |
php-pdo_sqlite или php-sqlite3 | База данных SQLite |
php-pcntl | Обработка системных сигналов |
php-mbstring | Работа с многобайтовыми строками |
Сеть
- Порт 8080 должен быть открыт и доступен из интернета — для Click-to-Call
- Сервер должен иметь выход в интернет — для OAuth и проверки лицензии
Установка
Ubuntu / Debian (FreePBX, PJSIP)
Подключитесь к серверу по SSH от пользователя root и выполните команды по порядку:
apt update
apt install -y php-cli php-curl php-sqlite3 php-mbstring
php -v
cd /tmp
wget https://asterconnector.uz/download/AsterConnector-v2.0-stable.zip
cp /tmp/asterconnector.php /opt/asterconnector.php
chmod 644 /opt/asterconnector.php
mkdir -p /etc/asterconnector
mkdir -p /var/log/asterconnector
cat > /etc/systemd/system/asterconnector.service << 'EOF'
[Unit]
Description=AsterConnector v2.0
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/php /opt/asterconnector.php
Restart=always
RestartSec=5
StandardOutput=null
StandardError=null
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable asterconnector
systemctl start asterconnector
Active: active (running):systemctl status asterconnector
curl -s http://127.0.0.1:8080/health
{"status":"ok","version":"2.0.0",...}http://IP_ВАШЕГО_СЕРВЕРА:8080Логин по умолчанию:
adminПароль по умолчанию:
adminПосле входа сразу смените пароль в разделе Система.
Issabel / CentOS 7 (chan_sip)
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y php81 php81-php-cli php81-php-curl php81-php-pdo php81-php-mbstring php81-php-pcntl
php81 -v
cd /tmp
wget https://asterconnector.uz/download/asterconnector.php
cp asterconnector.php /opt/asterconnector.php
chmod 644 /opt/asterconnector.php
mkdir -p /etc/asterconnector /var/log/asterconnector
cat > /etc/systemd/system/asterconnector.service << 'EOF'
[Unit]
Description=AsterConnector v2.0
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/php81 /opt/asterconnector.php
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable asterconnector
systemctl start asterconnector
systemctl status asterconnector
Управление сервисом
| Команда | Действие |
|---|---|
systemctl start asterconnector | Запустить |
systemctl stop asterconnector | Остановить |
systemctl restart asterconnector | Перезапустить |
systemctl status asterconnector | Статус сервиса |
tail -f /var/log/asterconnector/asterconnector.log | Лог в реальном времени |
Обновление
systemctl stop asterconnector
cp /tmp/asterconnector_new.php /opt/asterconnector.php
systemctl start asterconnector
curl -s http://127.0.0.1:8080/health
Удаление
systemctl stop asterconnector
systemctl disable asterconnector
rm -f /etc/systemd/system/asterconnector.service
systemctl daemon-reload
rm -f /opt/asterconnector.php
rm -rf /etc/asterconnector/
rm -rf /var/log/asterconnector/
Настройка AMI (Asterisk)
AMI — интерфейс управления Asterisk. Модуль подключается к AMI для отслеживания звонков в реальном времени.
Шаг 1 — Настройка manager.conf
Откройте файл конфигурации:
nano /etc/asterisk/manager.conf
Убедитесь что секция [general] выглядит так:
[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1
Добавьте пользователя для модуля в конец файла:
[asterconnector]
secret = ВАШ_ПАРОЛЬ_ЗДЕСЬ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = all
write = all
Применяем изменения без перезагрузки Asterisk:
asterisk -rx "manager reload"
Проверяем что AMI работает:
asterisk -rx "manager show settings"
Шаг 2 — Настройка в панели модуля
Панель → раздел AMI → заполните поля и нажмите Проверить:
| Поле | Значение |
|---|---|
| Хост | 127.0.0.1 |
| Порт | 5038 |
| Логин | asterconnector |
| Пароль | ваш пароль из manager.conf |
| SIP стек | Авто (или вручную: FreePBX→PJSIP, Issabel→chan_sip) |
Нажмите Сохранить. Проверяем подключение в логе:
tail -5 /var/log/asterconnector/asterconnector.log | grep AMI
Подключение к Битрикс24
http://IP_СЕРВЕРА:8080/oauth/callback| Поле | Значение |
|---|---|
| Название | AsterConnector |
| Тип | Серверное |
| Путь вашего обработчика | адрес из шага 1 |
| Путь для первоначальной установки | тот же адрес |
| Использует только API | ✓ поставьте галочку |
- CRM — работа со сделками, контактами, лидами
- Телефония — регистрация звонков
- Пользователи — синхронизация сотрудников
- Сообщения (im) — уведомления о пропущенных
- Задачи — создание и закрытие задач
Настройка сотрудников
Модуль сопоставляет сотрудников Битрикс24 с внутренними номерами Asterisk. Без этого невозможно определить кто совершил или принял звонок.
Шаг 1 — Заполнить внутренние номера в Битрикс24
Для каждого сотрудника в Битрикс24 должен быть заполнен внутренний номер:
Битрикс24 → Сотрудники → открыть профиль → Изменить → поле «Внутренний телефон»
Номер должен совпадать с номером в Asterisk (например: 101, 102).
Шаг 2 — Синхронизировать
Панель → Сотрудники → кнопка «↻ Синхронизировать»
Синхронизация также происходит автоматически раз в час.
Шаг 3 — Проверить
В таблице сотрудников должна быть заполнена колонка Внутренний. Если пусто — заполните номер в Битрикс24 и синхронизируйте снова.
sqlite3 /etc/asterconnector/asterconnector.db \
"SELECT user_id_b24, name, inner_number FROM employees WHERE active=1"
Настройки звонков
Контексты Asterisk
| Параметр | По умолчанию | Описание |
|---|---|---|
| Входящие контексты | from-trunk, from-pstn | Через запятую. Звонки из этих контекстов — входящие. |
| Контекст исходящих | from-internal | Звонки из этого контекста — исходящие. |
| Префикс набора | — | Добавляется перед номером при исходящем (например: 9) |
asterisk -rx "dialplan show"Нормализация номеров
Автоматически добавляет код страны. Пример для Узбекистана: 901234567 → +998901234567
Номера компании (DID)
Укажите все номера вашей АТС. Для каждого DID можно настроить отдельную воронку продаж. Добавляйте в панели → Настройки звонков → «Номера компании (DID)».
Создание CRM объектов
| Настройка | Описание |
|---|---|
| Создавать контакт при входящем | Если номер не найден — создать контакт |
| Создавать сделку при входящем | Создать сделку. Требует создания контакта. |
| Повторная сделка при входящем | Если у контакта нет открытых сделок — создать новую |
| То же для исходящих | Аналогично для исходящих звонков |
Ответственный за пропущенный
- Первый агент — первый сотрудник которому позвонило
- Последний агент — последний кому звонило
- Все агенты — уведомляются все
- Ответственный за сделку — ищется в CRM по номеру телефона
Дополнительно укажите пользователя по умолчанию — будет ответственным если клиент новый и в CRM не найден.
Маршрутизация на ответственного
Автоматически направляет входящий звонок на менеджера ответственного за клиента в Битрикс24.
Как работает
- Входящий звонок поступает на АТС
- Диалплан Asterisk делает HTTP запрос:
http://127.0.0.1:8080/forward?phone=НОМЕР - Модуль ищет ответственного в Битрикс24 по номеру
- Возвращает внутренний номер сотрудника (например
101) - Диалплан переводит звонок на этого сотрудника
- Если ответственный не найден — звонок идёт в очередь
Шаг 1 — Настройка диалплана FreePBX (PJSIP)
nano /etc/asterisk/extensions_custom.conf
Добавьте в конец файла:
[ac-transfer]
exten => _.,1,NoOp(AsterConnector: ${CALLERID(num)})
same => n,Set(AC_EXT=)
same => n,Set(CURLOPT(httptimeout)=3)
same => n,Set(CURLOPT(conntimeout)=3)
same => n,Set(AC_EXT=${CURL(http://127.0.0.1:8080/forward?phone=${CALLERID(num)})})
same => n,GotoIf($["${AC_EXT}"=""]?queue)
same => n,Set(AC_RESPONSIBLE=${AC_EXT})
same => n,Dial(PJSIP/${AC_EXT},20,tTg)
same => n,GotoIf($["${DIALSTATUS}"="ANSWER"]?done)
same => n(queue),Goto(ext-queues,1000,1)
same => n(done),NoOp(Answered: ${AC_EXT})
Замените ext-queues,1000,1 на ваш контекст и номер очереди.
asterisk -rx "dialplan reload"
Шаг 1 — Настройка диалплана Issabel (chan_sip)
То же самое, но используем SIP/ вместо PJSIP/:
[ac-transfer]
exten => _.,1,NoOp(AsterConnector: ${CALLERID(num)})
same => n,Set(AC_EXT=)
same => n,Set(CURLOPT(httptimeout)=3)
same => n,Set(CURLOPT(conntimeout)=3)
same => n,Set(AC_EXT=${CURL(http://127.0.0.1:8080/forward?phone=${CALLERID(num)})})
same => n,GotoIf($["${AC_EXT}"=""]?queue)
same => n,Set(AC_RESPONSIBLE=${AC_EXT})
same => n,Dial(SIP/${AC_EXT},20,tTg)
same => n,GotoIf($["${DIALSTATUS}"="ANSWER"]?done)
same => n(queue),Goto(ext-queues,1000,1)
same => n(done),NoOp(Answered: ${AC_EXT})
asterisk -rx "module load func_curl.so". Если нет модуля: yum install -y asterisk16-curlШаг 2 — Подключить маршрут во FreePBX
FreePBX → Connectivity → Inbound Routes → выберите маршрут → Set Destination → Custom Destinations → введите: ac-transfer,s,1 → Save
Шаг 3 — Включить в панели модуля
Панель → Настройки звонков → включите «Использовать автораспределение» → выберите метод → Сохранить.
Шаг 4 — Проверить работу
curl -s "http://127.0.0.1:8080/forward?phone=998901234567"
Если ответственный найден — вернётся его внутренний номер. Если нет — пустой ответ.
Запись разговоров
Модуль автоматически загружает записи разговоров в карточку звонка в Битрикс24 каждые 30 секунд.
| Параметр | По умолчанию | Описание |
|---|---|---|
| Директория записей | /var/spool/asterisk/monitor | Путь к WAV/MP3 файлам Asterisk |
| Макс. размер файла (МБ) | 50 | Файлы больше не загружаются |
| Загружать в Битрикс24 | Да | Включить/выключить загрузку |
| Удалять после загрузки | Нет | Удалять файл с сервера после загрузки |
Автоочистка старых файлов (cron)
Для удаления файлов старше 7 дней добавьте задание в cron:
echo "0 3 * * * find /var/spool/asterisk/monitor/ -name '*.wav' -mtime +7 -delete" | crontab -
Мониторинг
tail -f /var/log/asterconnector/asterconnector.log | grep RECORD
Click-to-Call (C2C)
Звонок клиенту прямо из карточки Битрикс24 одним кликом.
Как работает
- Менеджер нажимает на номер в Битрикс24
- Битрикс24 отправляет событие ONEXTERNALCALLSTART на сервер модуля
- Модуль через AMI звонит на внутренний номер менеджера
- Менеджер поднимает трубку
- Asterisk звонит клиенту
- Звонок фиксируется в карточке клиента
Требования
- Порт 8080 доступен из интернета
- В Битрикс24 → Телефония выбрано приложение AsterConnector
- У сотрудника заполнен внутренний номер в Битрикс24
- Сотрудник синхронизирован в модуле
Ручная регистрация обработчика
Если C2C не работает — переподключите Битрикс24 или зарегистрируйте вручную:
TOKEN=$(python3 -c "import json; print(json.load(open('/etc/asterconnector/tokens.json'))['access_token'])")
# Удаляем старый обработчик
curl -s "https://ДОМЕН.bitrix24.ru/rest/event.unbind.json" \
-d "auth=$TOKEN" -d "event=ONEXTERNALCALLSTART" -d "handler=http://ВАШ_IP:8080/c2c"
# Регистрируем новый
curl -s "https://ДОМЕН.bitrix24.ru/rest/event.bind.json" \
-d "auth=$TOKEN" -d "event=ONEXTERNALCALLSTART" -d "handler=http://ВАШ_IP:8080/c2c"
Задачи при пропущенных звонках
При пропущенном создаётся задача «Перезвонить: НОМЕР» с привязкой к контакту и сделке.
| Параметр | Описание |
|---|---|
| Создавать задачу при пропущенном | Включить/выключить |
| Исполнитель задачи | Ответственный за пропущенный / за сделку / по умолчанию / конкретный |
| Срок выполнения (часы) | Через сколько часов дедлайн. По умолчанию: 24 |
| Автозакрытие задач | Закрывать при успешном звонке с клиентом |
Сделки и контакты
Повторные сделки
- Ищем контакт по номеру телефона
- Проверяем есть ли открытые сделки у контакта
- Если нет — создаём новую сделку в настроенной воронке
- Если есть — новую не создаём
Несколько DID с разными воронками
Каждый DID номер можно привязать к отдельной воронке и этапу. Например:
- Звонки на
+998712026262→ воронка «Продажи», этап «Новый» - Звонки на
+998712026200→ воронка «Поддержка», этап «В работе»
Настраивается: панель → Настройки звонков → Номера компании (DID).
crm.item.update, а не crm.deal.update — только первый метод позволяет менять воронку через REST API.Лицензия
Активация
| Файл | Описание |
|---|---|
| /etc/asterconnector/license.key | Лицензионный ключ |
| /etc/asterconnector/license.json | Кэш. Подписан HMAC — не редактировать вручную. |
Приобрести или продлить: asterconnector.uz
Ошибки и решения
Проверьте что enabled=yes в manager.conf и логин/пароль совпадают:
asterisk -rx "manager show settings"Проверьте permit: должен быть 127.0.0.1/255.255.255.0. После изменений: asterisk -rx "manager reload"
Включите нормализацию номеров в панели → Настройки звонков и укажите код страны (для Узбекистана: 998).
Переподключите Битрикс24: панель → Битрикс24 → Отозвать → Подключить.
1. У сотрудника не заполнен внутренний номер в Битрикс24. Заполните и синхронизируйте.
2. Обработчик не зарегистрирован. Переподключите Битрикс24.
3 (Issabel). Неверный SIP стек. Выберите chan_sip вручную в настройках AMI.
4. Порт 8080 недоступен из интернета: ufw allow 8080/tcp
yum install -y asterisk16-curl
asterisk -rx "module load res_curl.so"
asterisk -rx "module load func_curl.so"
Для автозагрузки добавьте в /etc/asterisk/modules.conf:
load => res_curl.so
load => func_curl.soСтарая версия SQLite на CentOS 7. Убедитесь что используете актуальную версию модуля.
1. Включите автораспределение в панели → Настройки звонков.
2. Проверьте что ac-transfer подключён к входящему маршруту в FreePBX.
3. Протестируйте поиск ответственного:
curl -s "http://127.0.0.1:8080/forward?phone=998901234567"
4. Посмотрите лог:
tail -20 /var/log/asterconnector/asterconnector.log | grep "getDeal\|FORWARD"
Файл кэша повреждён. Удалите и перезапустите:
rm -f /etc/asterconnector/license.json
systemctl restart asterconnectorОбщая диагностика
# Статус сервиса
systemctl status asterconnector
# Последние ошибки
tail -50 /var/log/asterconnector/asterconnector.log | grep ERROR
# Проверка панели
curl -s http://127.0.0.1:8080/health | python3 -m json.tool
# Проверка AMI
asterisk -rx "manager show connected" | grep asterconnector
Часто задаваемые вопросы
Работает ли с Битрикс24 Коробка?
Да. Работает как с Облако так и с Коробкой на своём сервере.
Можно использовать с несколькими DID?
Да. Панель → Настройки звонков → Номера компании. Каждый DID можно привязать к своей воронке.
Звонок регистрируется дважды
Укажите DID номера компании в настройках. Без них входящий звонок может обрабатываться как входящий и как исходящий одновременно.
Как посмотреть историю звонков?
Панель → История звонков. Или напрямую в базе:
sqlite3 /etc/asterconnector/asterconnector.db \
"SELECT datetime(started_at,'unixepoch','localtime'), direction, status, phone_number, duration FROM calls ORDER BY id DESC LIMIT 20"
Как изменить порт панели?
Панель → Система → Порт панели → Сохранить. Не забудьте открыть новый порт: ufw allow НОВЫЙ_ПОРТ/tcp
Как сменить пароль панели?
Панель → Система → Новый пароль → Сохранить.
Как сохранить настройки при переустановке?
Панель → Система → кнопка «↓ Бэкап». Скачается JSON с настройками.
Проверка что записи загружаются
sqlite3 /etc/asterconnector/asterconnector.db \
"SELECT record_file, record_uploaded FROM calls WHERE record_file IS NOT NULL ORDER BY id DESC LIMIT 10"
Значение record_uploaded=1 — успешно загружено.
История изменений
v2.0.0 Текущая
- Встроенный HTTP сервер и веб-панель управления на порту 8080
- Поддержка PJSIP (FreePBX) и chan_sip (Issabel)
- OAuth2 авторизация в Битрикс24
- Регистрация входящих и исходящих звонков
- Click-to-Call
- Умная маршрутизация на ответственного менеджера
- Загрузка записей разговоров в карточку звонка
- Автосоздание задач «Перезвонить» при пропущенных
- Автозакрытие задач при успешном перезвоне
- Повторные сделки через crm.item.update
- Несколько DID с отдельными воронками
- Два метода поиска ответственного: по лиду и по контакту
- Нормализация номеров телефонов
- Работа с Битрикс24 Облако и Коробка
- Пометка неотвеченных исходящих: «Не дозвонились»
- Совместимость с Issabel / CentOS 7 через PHP 8.1 Remi