Passer au contenu principal

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.iniet 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( par to_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