# Interphones / visiophones (FlexiSIP)

Pour adresser les enjeux d'autonomie stratégique, de sécurité et de bonne gestion des données personnelles, Échirolles a fait le choix d'une infrastructure open source auto-hébergée pour la gestion des appels depuis les visiophones de la ville (marques Castel ou 2N).

Pour une présentation fonctionnelle de cette solution, [voir ici](https://grenoble.ninja/des-interphones-libres-flexisip-linhome/).

# 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/](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(` 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’`.

<p class="callout info">Auteur original de cette documentation : [Maxime Kejikian](https://www.linkedin.com/in/maxime-kejikian-a8a8732b1/)</p>