Installer FlexiSIP
Avant-propos
FlexiSIP est une suite de serveurs SIP complète, modulaire et évolutive, développée par Belledonne Communications, principalement connue pour être l’éditeur de Linphone.
Fonctionnalités principales :
- Proxy SIP : cœur du système, il relaie et gère le trafic des communications SIP (appels audio/vidéo, messagerie instantanée, présence, etc.).
- Gestionnaire de comptes SIP : administration centralisée des comptes utilisateurs, avec une API REST pour l’intégration à des plateformes existantes.
- Module B2BUA : interconnexion avec le réseau téléphonique classique (PSTN) ou des services de trunk SIP.
- Passerelle Push : acheminement fiable des notifications d’appels ou de messages sur mobile, même lorsque l’application VoIP est en arrière-plan ou l’écran éteint.
Autre informations :
- Sécurité : Authentification sécurisée, chiffrement des communications (SIP/TLS, SRTP, ZRTP, etc.).
- Open source : le code est disponible sous double licence (AGPLv3 ou propriétaire).
Installation de Flexisip
Les instructions d'installation sont disponible sur la page https://wiki.linphone.org/xwiki/wiki/public/view/Flexisip/1.%20Installation/ mais certaines des commandes utilisées sont obsolètes.
Ajout du dépôt APT de Belledonne Communications :
Écrire la ligne suivante dans le fichier /etc/apt/sources.list.d/belledonne.list
:
deb [arch=amd64, signed-by=/etc/apt/keyrings/belledonne.gpg] http://linphone.org/snapshots/debian bookworm stable
Ajout de la clé PGP du dépôt avec la commande suivante :
wget https://linphone.org/snapshots/debian/keyring.gpg -O - | sudo tee /etc/apt/keyrings/belledonne.gpg > /dev/null
Installation du serveur Flexisip :
sudo apt update
sudo apt install bc-flexisip redis-server
Génération du fichier de configuration par défaut :
/opt/belledonne-communications/bin/flexisip --dump-default all | sudo tee /etc/flexisip/flexisip.conf
Installation d'une base de données pour stocker les comptes SIP :
sudo apt install postgresql
Créer une base de données flexisip ainsi qu'un utilisateur flexisip
ayant le droit de modifier cette base de donnée.
Créer un utilisateur flexisip
sur la machine et l'ajouter au groupe dehydrated-certs
.
Modifier le fichier de configuration de redis /etc/redis/redis.conf
:
bind 127.0.0.1 ::1
daemonize yes
supervised systemd
Il faut ensuite créer un mot de passe et l'indiquer dans le champ requirepass
Pour que le serveur fonctionne, il faut autoriser dans nftables les différents ports utilisés par le serveur Flexisip:
En TCP, le port 5060 pour SIP et 5061 pour SIPS (SIP-TLS).
En UDP, le port 3478 pour le serveur STUN et les ports utilisés pour le media relay (10000 à 65535).
Démarrage manuel du serveur :
sudo systemctl start flexisip-proxy
Lancement automatique du serveur au démarrage de la machine :
sudo systemctl enable flexisip-proxy
Installation de flexisip-account-manager
sudo apt install bc-flexisip-account-manager php-fpm
Ensuite modifier le fichier /etc/flexisip-account-manager/flexiapi.env
:
APP_URL=http://srv-flexisip.exemple.fr
APP_SIP_DOMAIN=srv-flexisip.exemple.fr
ACCOUNT_DEFAULT_PASSWORD_ALGORITHM=MD5
ACCOUNT_PROVISIONING_RC_FILE=/etc/flexisip-account-manager/linphonerc.ini
PUBLIC_REGISTRATION=false
PHONE_AUTHENTICATION=false
DEVICES_MANAGEMENT=true
INTERCOM_FEATURES=true
DB_CONNECTION=pgsql
DB_HOST=/var/run/postgresql
DB_DATABASE=flexisip
DB_USERNAME=flexisip
On crée le fichier /etc/php/8.2/fpm/pool.d/flexisip.conf
:
[flexisip]
user = flexisip
group = flexisip
listen = /var/run/php/php-fpm-flexisip.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
On redémarre php-fpm :
sudo systemctl restart php8.2-fpm
On crée ensuite le fichier /etc/flexisip-account-manager/linphonerc.ini
et on met dedans :
[net]
firewall_policy=ice
stun_server=srv-flexisip.exemple.fr
[proxy_0]
reg_proxy="<sip:srv-flexisip.exemple.fr;transport=tcp>"
reg_expires=86400
Il faut ensuite aller dans le dossier /opt/belledonne-communications/share/flexisip-account-manager/flexiapi
et exécuter la commande :
sudo php artisan migrate
…puis créer un compte admin avec la commande :
sudo php artisan accounts:create-admin-account -u admin -p password
…en remplaçant admin et password par le nom d'utilisateur et le mot de passe souhaité.
Créer un fichier /etc/nginx/sites-available/flexisip_account_manager
:
server {
server_name srv-flexisip.exemple.fr;
listen 443 ssl http2;
listen [::]:443 ssl http2;
include include/ssl_keys_srv-flexisip.exemple.fr;
index index.php index.html;
access_log /var/log/nginx/access.flexisip_account_manager.log;
root /opt/belledonne-communications/share/flexisip-account-manager/flexiapi/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm-flexisip.sock;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
server {
listen 80;
listen [::]:80;
server_name srv-flexisip.exemple.fr;
access_log /var/log/nginx/access.flexisip_account_manager.log;
include include/redirect_ssl;
}
Activer le site et redémarrer nginx :
sudo ln -s /etc/nginx/sites-available/flexisip_account_manager /etc/nginx/sites-enables/flexisip_account_manager
sudo systemctl restart nginx
On crée le fichier /etc/systemd/system/flexisip-proxy.service.d/override.conf
:
[Service]
User=flexisip
Group=flexisip
LimitNOFILE=1048576
Il faut mettre l'utilisateur flexisip comme propriétaire des fichiers et dossiers suivants :
/opt/belledonne-communications/share/flexisip-account-manager/flexiapi/storage/logs/laravel.log
/var/opt/belledonne-communications/log/flexiapi
/opt/belledonne-communications/share/flexisip-account-manager/flexiapi/storage/framework
et tous ses fichiers et sous dossiers
Configuration de Flexisip
La configuration du serveur se fait en modifiant le fichier /etc/flexisip/flexisip.conf
. Il faut utiliser sudo pour modifier ce fichier.
Pour que les changements soit pris en compte il faut redémarrer le serveur avec la commande :
sudo systemctl restart flexisip-proxy
Le fichier de configuration est composé de différentes sections (par exemple [global]
).
[global]
transports=sip:srv-flexisip.exemple.fr;maddr=* sips:srv-flexisip.exemple.fr;maddr=*
tls-certificates-file=/etc/dehydrated/certs/srv-flexisip.exemple.fr/fullchain.pem
tls-certificates-private-key=/etc/dehydrated/certs/srv-flexisip.exemple.fr/privkey.pem
[event-logs]
enabled=true
logger=flexiapi
flexiapi-host=srv-flexisip.exemple.fr
flexiapi-port=443
flexiapi-prefix=/api/statistics/
Il faut ensuite aller sur http://srv-flexisip.exemple.fr pour générer une clé d'API et la mettre dans le champ flexiapi-token
[module::Authentication]
enabled=true
auth-domains=srv-flexisip.exemple.fr
available-algorithms=MD5
db-implementation=soci
soci-backend=postgresql
- Pour le champ
soci-connection-string
il faut mettre les informations de connexion à la base de données. soci-password-request=SELECT password, algorithm FROM accounts JOIN passwords ON accounts.id = passwords.account_id WHERE username = :id
soci-poolsize=10
[module::Registrar]
reg-domains=srv-flexisip.exemple.fr
max-expires=31536000
db-implementation=redis
- Il faut mettre le mot de passe de Redis pour le champ
redis-auth-password
[module::PushNotification]
enabled=true
apple=false
firebase=false
register-wakeup-interval=30
[module::MediaRelay]
sdp-port-range-min=10000
sdp-port-range-max=65535
Correction PHP
Il faut également réaliser quelques modifications pour que les pages de statistiques soit compatibles avec postgresql. Il faut modifier le fichier /opt/belledonne-communications/share/flexisip-account-manager/flexiapi/app/Libraries/StatisticsGraphFactory.php
:
- Il faut mettre en commentaires les lignes
$this->data->orderBy($dateColumn, ‘asc’);
- Dans le
case ‘accounts’:
remplacer la ligne$this->data = Accounts::orderBy($dateColumn, ‘asc’);
par$this->data = Accounts::orderBy('moment, ‘desc’);
- En remplaçant les
date_format(
parto_char(
et en remplaçant son deuxième argument par un argument dans le formats attendus par postgresql ('YYYY-MM-DD HH24'
pour‘day’
,‘YYYY-MM-DD’
pour‘week
’ et‘month’
et‘YYYY-MM’
pour‘year’
.
Auteur original de cette documentation : Maxime Kejikian