This is a summary of a forum article about installing the latest version of the Flexisip server on Ubuntu 22.04 by installing the SDK and building from source. For troubleshooting and more detailed information (flexisip.conf, redis.conf and so on), please refer to the forum article (see link below). After building the binary, a new Docker image file for Flexisip is created, which is combined with other Docker image files necessary for operating the Flexisip server to configure the entire system.
-
Creating a Linphone SDK Docker image
Creating a Linphone SDK Docker image will help resolve dependencies for Flexisip. -
Building Flexisip and creating a DEB package
Build Flexisip and create a DEB package. -
Creating a Flexisip Docker image
Create a new Docker image file using the binary built for Flexisip. -
SSL/TLS authentication procedure with Certbot Docker container
Obtain an SSL/TLS certificate using a Certbot Docker container. -
Preparing for Flexisip Account Manager installation
Prepare the necessary files for installing Flexisip Account Manager. -
Creating a Docker Compose file
Create a Docker Compose file to configure the Flexisip server. -
Starting and operating in containers
Use Docker Compose to start the Flexisip server and perform any necessary operations inside the container.
Link to related forum article:Linphone-SDK Ubuntu 22.04 Dockerイメージの作成とアプリのビルド(IPv6対応)
1. Creating a Linphone SDK Docker image(Ubuntu 22.04)
To build the Linphone app and Flexisip server within a Linphone SDK Docker container, you will need to create a Linphone SDK Docker image. To do this, you will need to download the docker-files
directory from the following source:
$ git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git
Create a new file that is compatible with Ubuntu 22.04 based on the bc-dev-ubuntu-rolling
file in the docker-files
directory.
bc-dev-ubuntu-22-04-lts
FROM ubuntu:22.04
MAINTAINER Takanobu Fuse [email protected]>
# Configure locale
RUN apt-get update && \
apt-get install -y locales && \
apt-get clean && \
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \
locale-gen
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'
ENV TZ=Europe/Paris
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ARG DEBIAN_FRONTEND=noninteractive
ENV SHELL=/bin/bash
#ENV PS1='\[\e[33m\]\u@bc-dev-ubuntu-22-04-lts>\[\e[0m\] '
# Install common general tools
RUN apt-get update && \
apt-get install -y nano sudo vim && \
apt-get clean
# Install development tools
RUN apt-get update && \
apt-get install -y alien at autoconf bison ccache clang cmake doxygen elfutils g++ gdb git graphviz intltool libtool lsb-release make nasm ninja-build openssh-client patch python3-pip python3-pystache python-six yasm && \
apt-get clean
# Install linphone & flexisip dependencies development packages
RUN apt-get update && \
apt-get install -y libasound2-dev libavcodec-dev libavutil-dev libbsd-dev libegl1-mesa-dev libglew-dev libgsm1-dev libjansson-dev libmariadb-dev-compat libmbedtls-dev libopus-dev libpq-dev libprotobuf-dev libpulse-dev libqt5svg5-dev libsnmp-dev libspeex-dev libspeexdsp-dev libsqlite3-dev libsrtp2-dev libssl-dev libswscale-dev libturbojpeg0-dev libv4l-dev libvpx-dev libxerces-c-dev libxml2-dev libxv-dev protobuf-compiler qt3d5-dev qtbase5-dev qtbase5-dev-tools qtchooser qt5-qmake qtconnectivity5-dev qtdeclarative5-dev qtdeclarative5-dev-tools qtdeclarative5-dev-tools qtquickcontrols2-5-dev qttools5-dev qttools5-dev-tools xsdcxx && \
apt-get clean
# Configure user bc
RUN useradd -ms /bin/bash bc && \
echo 'bc:cotcot' | chpasswd && \
echo 'bc ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER bc
WORKDIR /home/bc
COPY --chown=bc rpmmacros /home/bc/.rpmmacros
CMD bash
Edit Makefike ( add the section of ubutnu 22.04)
.....
.....
ubuntu-22.04-LTS:
docker build -f bc-dev-ubuntu-22-04-lts -t $(BASE_NAME)/bc-dev-ubuntu:22.04 --rm .
.....
.....
Build( or build directory by docker build
command )
$ make ubuntu-22.04-LTS
Confirm Docker Image
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu 22.04 6ee9dee48674 47 minutes ago 2.28GB
Launch a container using the above image in any folder (where you will build Linphone or Flexisip)
$ docker run --name linphone-sdk -v $PWD:/home/bc -it gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:22.04
bc@616cdfa4bb84:~$
2. Building Flexisip and creating a DEB package
Start a container from linphone-sdk
image.
$ docker run --name linphone-sdk -v $PWD:/home/bc -it gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:22.04
The following is a task to be performed inside a container. Download the source code of flexisip within the container.
$ git clone https://gitlab.linphone.org/BC/public/flexisip.git --recursive
Next, install the necessary packages for building flexisip by referring to the following file, and build and install them.
Additional Packages
$ sudo apt install file llvm libboost-dev libboost-system-dev libboost-thread-dev libhiredis-dev libjsoncpp-dev mariadb-server libnghttp2-dev redis-server
Build and install for the additional package by the scrypt.
$ cd flexisip/docker
$ sudo ./libnghttp2_asio_install.sh 1.43.0
Once you have completed the above preparations, you can build flexisip using the following flow.
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/belledonne-communications -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSYSCONF_INSTALL_DIR=/etc -DCPACK_GENERATOR=DEB
$ make package
If everything goes well, two types of packages will be created as follows.
bc-flexisip_2.3.0-0.*_amd64.deb
bc-flexisip-dbgsym_2.3.0-0.*_amd64.ddeb
Note) Installation of flexisip from official repositories for different operating systems.
For those who do not wish to build flexisip from source and want to register the repository to create a new flexisip Docker image, please refer to the following instructions. This is applicable for CentOS, RockyLinux, Ubuntu, and Debian.
/etc/apt/sources.list.d/belledonne.list Ex):Ubuntu 22.04
deb [arch=amd64] http://linphone.org/snapshots/ubuntu jammy stable # hotfix beta alpha
Install flow
$ wget https://www.linphone.org/snapshots/ubuntu/pubkey.gpg -O - | sudo apt-key add -
# Not doing this can result in the following error : "[SOCI] connection pool open error: Failed to find shared library for backend mysql"
$ sudo apt install libmariadb-dev
# Update & Install
$ sudo apt update
$ sudo apt install bc-flexisip
3. Creating a Flexisip Docker image
Copy the created packages below to the flexisip/docker directory to proceed with the work.
bc-flexisip_2.3.0-0.*_amd64.deb
bc-flexisip-dbgsym_2.3.0-0.*_amd64.ddeb
Create a Dockerfile named "flex-from-ubuntu-deb" based on Ubuntu 22.04 by referring to flex-from-deb. Then add the build command to the Makefile. The installation of snmp-mibs-downloader, snmp, and snmpd is optional. By using SNMP, you can check and rewrite the settings of each section in the flexisip configuration file.
flex-from-ubuntu-deb
FROM ubuntu:22.04
MAINTAINER Takanobu Fuse [email protected]>
# Prepare dependencies
RUN apt-get update
RUN apt-get install -y nano xsdcxx gdb libmariadb3 snmp-mibs-downloader snmp snmpd iproute2
# Get flexisip package
COPY *.deb *.ddeb deb-packages/
RUN apt-get install -y /deb-packages/*
RUN rm -rf /deb-packages
# Add it to the default path
ENV PATH=$PATH:/opt/belledonne-communications/bin
WORKDIR /opt/belledonne-communications
# Generate a default configuration
RUN flexisip --dump-default all > /etc/flexisip/flexisip.conf
VOLUME /etc/opt/belledonne-communications/flexisip
VOLUME /var/opt/belledonne-communications/log/flexisip
COPY flexisip-entrypoint.sh /
COPY backtrace.gdb /
RUN chmod a+x /flexisip-entrypoint.sh
# Script to wait db before launch flexisip [Licence Apache2]
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.2.1/wait /wait
RUN chmod +x /wait
ENTRYPOINT ["/flexisip-entrypoint.sh"]
CMD flexisip
Makefile
Note)Write down only additional sections
.....
.....
# For Ubuntu 22.04
flexisip-ubuntu-deb-before:
$(eval DOCKER_FILE = flex-from-ubuntu-deb)
# forcing context to .
# at the moment of the condition above being executed, $DOCKER_FILE doesn't have the right value
$(eval CONTEXT = .)
$(eval DOCKER_TAG = $(DOCKER_TAG)-deb)
.....
.....
.....
# For Ubuntu 22.04
flexisip-ubuntu-deb-build: flexisip-ubuntu-deb-before flexisip-build
flexisip-ubuntu-deb-push: flexisip-ubuntu-deb-before flexisip-push
flexisip-ubuntu-deb-clean: flexisip-ubuntu-deb-before flexisip-clean
.....
Build
Note)Fixed "ulimit -c unlimited*" in flexisip-entrypoint.sh,
delete '*'.
$ make flexisip-ubuntu-deb-build
Check image file
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab.linphone.org:4567/bc/public/flexisip 2.3.0-alpha-29-gb19a1ce5-deb b3e1a47e3efd 9 hours ago 775MB
Start container
Since the configuration file is not defined, only the proxy mode can be launched from this image. To output the configuration file "flexisip.conf", start the container in proxy mode.
Start the container and run flexisip in proxy mode to output the default configuration.
$ docker run -d --network host --name ubuntu-flexisip IMAGE_ID> --server proxy
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fd6f8e90621 b3e1a47e3efd "/flexisip-entrypoin…" 9 hours ago Up 9 hours ubuntu-flexisip
Copy flexisip.conf
$ docker cp ubuntu-flexisip:/etc/flexisip/flexisip.conf ./
4. SSL/TLS authentication procedure with Certbot Docker container
The following tasks are to be performed on the host machine.
SSL (TLS) authentication is essential for operating a system with flexisip. Please obtain it in advance using Docker containers and reflect it in the settings of nginx and flexisip.
Note) $PWD: directory in which executed command.
$ docker run -it --rm --name certbot -v "$PWD/letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot certonly --standalone -d www.example.com
Add the following renew command using the Certbot Docker container to the host machine's cron job.
Note) When specifying a directory, please use an absolute path.
$ docker stop nginx && docker run -it --rm --name certbot -v "/??/??/.../letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot renew && docker start nginx
The SSL certificate is valid for 90 days, so we recommend renewing it every 60 days to ensure uninterrupted service.
Configure in flexisip.conf as follows.
tls-certificates-file=/etc/letsencrypt/live/sip.example.com/fullchain.pem
tls-certificates-private-key=/etc/letsencrypt/live/sip.example.com/privkey.pem
tls-certificates-ca-file=/etc/letsencrypt/live/sip.example.com/cert.pem
5. Preparing for Flexisip Account Manager installation
flexisip-account-manage designed by
Laravel
(php framework)
Create a dockerfile for building a custom image called php-fpm-alpine-laravel
that can be used as a service in a Docker Compose file:
To install Composer and PHP extensions, we can use docker-php-extension-installer
, which is recommended by the official PHP page on DockerHub.
php-fpm-alpine-laravel
FROM php:fpm-alpine
# Set working directory
WORKDIR /var/www/html
RUN apk add --no-cache bash nano libpng-dev freetype-dev libjpeg-turbo-dev libxml2-dev
# Install Composer and PHP extensions
RUN curl -sSLf \
-o /usr/local/bin/install-php-extensions \
https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions && \
chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions redis mysqli xmlrpc pdo_mysql @composer && \
IPE_GD_WITHOUTAVIF=1 install-php-extensions gd
# Installing Laravel
RUN chown -R www-data:www-data /var/www/html
RUN composer global require laravel/installer \
&& ln -s /root/.config/composer/vendor/laravel/installer/bin/laravel /usr/local/bin/laravel
Download flexisip-account-manager in the same directory as the docker-compose.yml file that will be created later.
$ git clone https://github.com/BelledonneCommunications/flexisip-account-manager.git
6. Creating a Docker Compose file
docker-compose.yml
version: '3.5'
services:
##### redis-server
redis:
container_name: redis
image: redis:alpine
volumes:
- ./redis:/etc/redis
# need to download default config file:redis.conf from https://redis.io/topics/config
# then modify it to enable the auth access(password), and input it into /redis/etc directory.
command: ["redis-server", "/etc/redis/redis.conf"]
privileged: true
restart: always
networks:
proxy-tier:
##### nginx
nginx:
container_name: nginx
image: nginx:alpine
tty: true
ports:
- "80:80"
- "443:443"
volumes:
# nginx config
- ./nginx:/etc/nginx/conf.d
# certbot letsencrypt certification. Created by docker_hub certbot/certbot
# $ docker run -it --rm --name certbot -v "$PWD/letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot certonly --standalone -d www.example.com
# Add the below cronjob into the host crontab.
# docker run -it --rm --name certbot -v "/??/??/.../letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot renew
- ./letsencrypt:/etc/letsencrypt
# shared the directory /flexisip-account-manager in php-fpm-laravel container
- ./flexisip-account-manager/flexiapi:/var/www/html/flexiapi
# shared the directory /var/www/html in phpmysql-fpm container
- phpmyadmin:/var/www/html/phpmyadmin
restart: always
networks:
proxy-tier:
##### mariadb
flexisip-mariadb:
container_name: flexisip-mariadb
image: mariadb
restart: always
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
networks:
proxy-tier:
### flexisip
ubuntu-flexisip:
container_name: ubuntu-flexisip
image: gitlab.linphone.org:4567/bc/public/flexisip:2.3.0-alpha-29-gb19a1ce5-deb
volumes:
- ./letsencrypt:/etc/letsencrypt
# previously need to add "flexisip" directory and input "flexisip.conf" into it.
- ./flexisip_conf:/etc/flexisip
# for conference server linphone db directory
- ./linphone:/root/.local/share/linphone
extra_hosts:
- "sip.example.com:192.168.xx.xx"
depends_on:
- redis
- nginx
- flexisip-mariadb
restart: always
# https://github.com/BelledonneCommunications/flexisip/blob/master/docker/flexisip-entrypoint.sh
# for starting only "proxy" server
command: ["--server","proxy"]
# for starting "proxy, presence, conference" servers
#command: [""]
## allow the privilege of network to the container
cap_add:
- NET_ADMIN
- SYS_RESOURCE
network_mode: "host"
##### phpmyadmin-fpm
phpmyadmin-fpm:
container_name: phpmyadmin-fpm
image: phpmyadmin/phpmyadmin:fpm-alpine
tty: true
expose:
- "9000"
environment:
- PMA_HOST=flexisip-mariadb
- PMA_PORT=3306
- PMA_ABSOLUTE_URI=http://localhost/phpmyadmin
volumes:
- phpmyadmin:/var/www/html
- /sessions
depends_on:
- flexisip-mariadb
restart: always
networks:
proxy-tier:
##### php-fpm-laravel
php-fpm-laravel:
container_name: php-fpm-laravel
build:
context: ./docker_files
dockerfile: php-fpm-alpine-laravel
tty: true
expose:
- "9000"
# "php artisan serve" commmand default port
ports:
- 8000:8000
volumes:
# for laravel php framework
- ./flexisip-account-manager/flexiapi:/var/www/html/flexiapi
# provisioning config
- ./xmlrpc:/opt/belledonne-communications/share/flexisip-account-manager/xmlrpc
# Flexisip-account-manager log
- ./log:/var/opt/belledonne-communications/log
depends_on:
- ubuntu-flexisip
restart: always
networks:
proxy-tier:
networks:
proxy-tier:
name: containers-network-ipv6
external: true
### $ docker volume create phpmyadmin
volumes:
phpmyadmin:
external: true
Note) Docker network and phpMyAdmin volume should be created in advance.
Create Bridge Network
$ docker network create --gateway 172.xx.0.1 --gateway fdxx:xxxx:xxxx:1::1 --subnet 172.xx.0.0/24 -- subnet fdxx:xxxx:xxxx:1::0/80 --ipv6 containers-network-ipv6
Create Volume
$ docker volume create phpmyadmin
7. Starting and operating in containers
Start up
$ docker compose up -d
The following tasks will be performed inside the container : php-fpm-laravel
$ docker compose exec php-fpm-laravel sh
# cd flexiapi
① Download the necessary dependency packages for flexisip-account-manager
# composer install --no-dev
② Create a .env file and apply a security key. Configure authentication SMTP mail server, database, etc. in the .env file.
# cp env.example .env
# php artisan key:generate
③ Create database for Linphone
user accounts
# php artisan migrate
④ Register users from the web frontend.
⑤ Configure administrator user: Set the registered user as an administrator in the flexisip-account-manager
# php artisan accounts:set-admin {account_id}
Note)
# php artisan --help
# php artisan cache:clear
Note) The front-end is composed of the flexisip-account-manager/flexiapi directory created with Laravel (the flexisip-account-manager/xmlrpc directory is not needed).
The configuration files are stored in the flexisip-account-manager/flexiapi/config directory. The .env file is used to override the variables in this configuration file.
2023/04/26 Additional Note)
It is possible to implement account authentication via SMS transmission by installing the VONAGE package that corresponds to the Laravel Notification class. Prior registration for a VONAGE account (which includes a trial SMS transmission service for up to 2 euros without requiring credit card registration) is required.
Once registered, an API key and API secret will be provided, which should be recorded in the .env file.
.env
# Vonage SMS API
VONAGE_KEY=xxxxxxxxxx
VONAGE_SECRET=xxxxxxxxxxxxxxx
VONAGE_SMS_FROM=1234567890 (During the trial period, any phone number can be used)
Install the necessary package using composer:
# composer require laravel/vonage-notification-channel
To create a new class called VonageSMS
for sending SMS messages by extending the Notification
class:
# php artisan make:notification VonageSMS
This command will create a new file called VonageSMS.php
in the app/Notifications
directory. You can then modify this file to customize the SMS message and the logic for sending it using the VONAGE API.
New File
app/Notifications/VonageSMS.php
Modified Files
app/Alias.php
app/PhoneChangeCode.php
app/Http/Controllers/Account/RegisterController.php
app/Http/Controllers/Account/AuthenticateController.php
app/Http/Controllers/Api/AccountController.php
app/Http/Controllers/Api/AccountPhoneController.php
If you have any further requests or need more details, please refer to the contact page and get in touch with us.