Установка и настройка Linphone-server (FlexiSip)


Ранее я уже рассказывал, про довольно удобный VOIP-клиент Linphone и как верно подметили читатели моего блога, в данном VOIP-клиенте при использовании его совместно с тем же Asterisk или FreePBX (что в принципе одно и тоже) вам будет недоступно больше половины функционала. Для того чтобы полноценно использовать клиент Linphone вам понадобится настроить VOIP-прокси сервер FLEXISIP и лишь в этом случае вам будет доступен чат, видео-звонки, статусы присутствия и многое другое.

VOIP-прокси сервер с поддержкой видео-звонков

Но как вы наверное понимаете, не все так гладко как может показаться на первый взгляд и компания которая разрабатывает Flexisip и Linphone владеет одноименным сервисом и не заинтересованна в том, чтобы вы поднимали у себя сервер и текущее состояние Opensource части проектов Linphone и Flexisip довольно странное и напоминает того самого суслика из ДМБ который как бы есть, но его как бы и нет. Документация крайне скудная, предназначена для устаревших версий FLEXISIP, а исходные коды проекта довольно запутанные и для того чтобы разобраться в особенностях работы модулей требуются не дюжие знания сразу в нескольких областях IT. Несколько лет назад я реализовывал проекты защищенных внутренних коммуникаций на основе Opensource версий Linphone и Flexisip и недавно меня поросили проанализировать текущее состояние проекта и можно ли его использовать сейчас.

Не буду приводить отчет по этой задаче полностью, скажу лишь, то что все стало гораздо хуже и opensource-версия FLEXISIP теперь выложена скорее для красоты, а документация максимально устарела и противоречит реальному функционалу. Попробовать запустить этот проект в прод можно, только в том случае если вы истинный мазохист в плане сборки и настройки этого шедевра и садист для тех людей которые будут им пользоваться в дальнейшем.

Если я вас не убедил, то могу предложить вам инструкцию по сборке и настройке (рабочую кстати), что бы вы не отправились в дурдом пытаясь применить устаревшую документацию и получая немногословные segmentation fault core dumped.

Начинаем мы с установки необходимых для сборки пакетов:

# aptitude install python doxygen cmake build-essential pkg-config libv4l-dev libtheora-dev libpulse-dev libpq-dev python-pystache
# aptitude install autoconf shtool libtool libssl-dev intltool nasm unixodbc-dev odbc-postgresql python-pyodbc libmysql++-dev python-six

Собственно сборка системы в "минимальной комплектации":

# cd /usr/src/
# git clone https://github.com/BelledonneCommunications/flexisip
# cd ./flexisip/
# git submodule sync && git submodule update --init --recursive
# ./prepare.py -DENABLE_EXTERNAL_AUTH_PLUGIN=True -DENABLE_TRANSCODER=True -DCMAKE_INSTALL_PREFIX:PATH=/opt/flexisip/ -DSYSCONF_INSTALL_DIR=/etc
# make
# make install

Минимальный конфигурационный файл для запуска /etc/flexisip/flexisip.conf:

[global]
debug=false
aliases=5.249.148.159

[module::Registrar]
enabled=true
reg-domains=5.249.148.159
db-implementation=internal

[module::Authentication]
enabled=true
auth-domains=5.249.148.159
db-implementation=file
datasource=/etc/flexisip/passwd

Формат файла с паролями дложен иметь строго определнный формат, включая пробел перед ";" и пропуск строки после описания формата, а в противном случае вы словите сегфолт и будете долго читать исходники их парсера.

version:1

1000@5.249.148.159 clrtxt:drt077 ;
1001@5.249.148.159 clrtxt:dtf079 ;

Пароли мы храним открытым текстом и их еще можно шифровать, но у меня ничего не получилось, а копаться в модуле авторизации и заниматься глубокой отладкой мне было банально некогда. Исполняемые файлы и библиотеки храняться в каталоге /opt/flexisip/, а запуск flexisip сервера в режиме отладки производится командой:

# /opt/flexisip/bin/flexisip -d

И поверьте мне, этот режим вам понадибиться очень часто.

Немного усложним конструкцию и добавим поддержку Redis для кластеризации системы и хранения информации о состоянии подключений клиентов и это в идеале должно реализовать функционал отслеживания присутствия:

# apt-get install  libprotobuf-dev protobuf-compiler
# ./prepare.py -DENABLE_PROTOBUF=ON -DENABLE_EXTERNAL_AUTH_PLUGIN=True -DENABLE_TRANSCODER=True -DCMAKE_INSTALL_PREFIX:PATH=/opt/flexisip/ -DSYSCONF_INSTALL_DIR=/etc

Конфигурация с поддержкой Redis:

[global]
debug=false
aliases=5.249.148.159

[module::Registrar]
enabled=true
reg-domains=5.249.148.159
db-implementation=redis
redis-server-domain=127.0.0.1
redis-record-serializer=protobuf
redis-server-port=6379
redis-auth-password=Redirtf077


[module::Authentication]
enabled=true
auth-domains=5.249.148.159
db-implementation=file
datasource=/etc/flexisip/passwd

[module::MediaRelay]
enabled=true

[module::Router]
enabled=true
use-global-domain=true
fork=true
stateful=true
fork-late=true

Вы кстати можете получить значения всех переменных конфигруции по умолчанию (и это вам сильно поможет):

# cd /opt/flexisip/bin/
# mkdir /etc/flexisip
# ./flexisip --dump-default all > /etc/flexisip/flexisip.conf.base

Подключаем авторизацию c использованием базы данных:

# aptitude install postgresql-server-dev-11 postgresql-11

Сборка с поддержкой баз данных:

# ./prepare.py -DENABLE_SOCI=ON -DENABLE_VCARD=ON -DWITH_ODBC=True -DWITH_POSTGRESQL=ON -DENABLE_PROTOBUF=ON -DENABLE_EXTERNAL_AUTH_PLUGIN=True -DENABLE_TRANSCODER=True -DCMAKE_INSTALL_PREFIX:PATH=/opt/flexisip/ -DSYSCONF_INSTALL_DIR=/etc

Модуль Mysql для SOCHI находится в каталоге: src/backends/mysql/CMakeFiles/soci_mysql.dir/row-id.cpp.o,  а мы собираем еще модуль для Postgresql вручную (он есть, но не предусмотрена его сборка):

# cd /usr/src/flexisip/linphone-sdk/external/soci
# cmake -DWITH_POSTGRESQL=ON -DSOCI_SHARED=ON -DSOCI_STATIC=OFF .
# make
# make install

Ну и на последок финальный файл конфигурации:

[global]
debug=false
aliases=5.249.148.159

[module::Registrar]
enabled=true
reg-domains=5.249.148.159
db-implementation=redis
redis-server-domain=127.0.0.1
redis-record-serializer=protobuf
redis-server-port=6379
redis-auth-password=RedisDrtf077


[module::Authentication]
enabled=true
auth-domains=5.249.148.159
db-implementation=file
datasource=/etc/flexisip/passwd

[module::MediaRelay]
enabled=true

[module::Router]
enabled=true
use-global-domain=true
fork=true
stateful=true
fork-late=true
message-fork-late=true
message-delivery-timeout=3600
message-accept-timeout=15
root@production-master:~# cat /etc/flexisip/flexisip.conf
[global]
debug=false
aliases=5.249.148.159
default-servers=proxy presence

[module::Registrar]
enabled=true
reg-domains=5.249.148.159
db-implementation=redis
redis-server-domain=127.0.0.1
redis-record-serializer=protobuf
redis-server-port=6379
redis-auth-password=RedisDrtf077

[module::Authentication]
enabled=true
auth-domains=5.249.148.159
db-implementation=soci
soci-backend=postgresql
soci-poolsize=10
soci-connection-string=dbname=flexi_db user=flexisip password='flexisip2pass' host=127.0.0.1
soci-password-request=select password, 'CLRTXT' from accounts where login = :id and domain = :domain
soci-users-with-phones-request=select login, domain, phone from accounts where phone in (:phones)

[module::DoSProtection]
enabled=false

[module::MediaRelay]
enabled=true

[module::Router]
enabled=true
use-global-domain=true
fork=true
stateful=true
fork-late=true
message-fork-late=true
message-delivery-timeout=3600
message-accept-timeout=15

[module::NatHelper]
enabled=false

[module::Transcoder]
enabled=true
filter=
jb-nom-size=0
rc-user-agents=
audio-codecs=speex/8000 amr/8000 iLBC/8000 gsm/8000 pcmu/8000 pcma/8000 telephone-event/8000
remove-bw-limits=false
block-retransmissions=false

[module::Presence]
enabled=true
filter=is_request && (request.method-name == 'PUBLISH' || request.method-name == 'NOTIFY' || request.method-name == 'SUBSCRIBE')
presence-server=sip:127.0.0.1:5065;transport=tcp
only-list-subscription=false
check-domain-in-presence-results=false

Еще вы конечно наверное заметили, что проприетармные кодеки вы теперь собрать не сможете:

2019-06-20 09:44:16:737 mediastreamer-message-Could not find encoder for AMR
2019-06-20 09:44:16:737 flexisip-error-Codec amr/8000 is configured but is not supported (missing plugin ?)
2019-06-20 09:44:16:737 mediastreamer-message-Could not find encoder for iLBC
2019-06-20 09:44:16:737 flexisip-error-Codec iLBC/8000 is configured but is not supported (missing plugin ?)
2019-06-20 09:44:16:737 mediastreamer-message-Could not find encoder for GSM
2019-06-20 09:44:16:737 flexisip-error-Codec gsm/8000 is configured but is not supported (missing plugin ?)
2019-06-20 09:44:16:737 mediastreamer-message-Could not find encoder for telephone-event
2019-06-20 09:44:16:737 flexisip-debug-Loading domain registration configuration from /etc/flexisip/domain-registrations.conf
2019-06-20 09:44:16:740 flexisip-debug-CLI socket is at /tmp/flexisip-proxy-3247
2019-06-20 09:44:16:742 belle-sip-message-Creating listening point [0x55fb78f393d0] on [sip:127.0.0.1:5065;transport=TCP]

Но часть ограничений все же можно обойти используя опцию ENABLE_NON_FREE_CODECS:

# ./prepare.py -DENABLE_NON_FREE_CODECS=ON -DENABLE_AMRNB=ON -DENABLE_AMRWB=ON -DENABLE_GSM=ON  -DENABLE_SOCI=ON -DENABLE_VCARD=ON -DWITH_ODBC=True -DWITH_POSTGRESQL=ON -DENABLE_PROTOBUF=ON -DENABLE_EXTERNAL_AUTH_PLUGIN=True -DENABLE_TRANSCODER=True -DCMAKE_INSTALL_PREFIX:PATH=/opt/flexisip/ -DSYSCONF_INSTALL_DIR=/etc