FICUSONLINE F9E
Flexisip + Account Manager on Docker (Ubuntu 22.04)
フォーラム記事を纏めた内容です。導入時のトラブルシュート・詳細(flexisip.conf、redis.confなどの設定ファイル)についてはフォーラム記事を参照願います(以下リンク先、関連フォーラム記事参照)。Ubuntu22.04上で動作するFlexisipサーバの最新版をインストールするため、SDKを導入しソースからビルドします。ビルドしたバイナリから新規にFlexisipのDockerイメージファイルを作成し、これとFlexisipサーバの運用に必要な他のDockerイメージファイルとを組合せてシステム全体を構成します。
Takanobu FuseAdministrator

12 min read

2 years ago

Linux

フォーラム記事を纏めた内容です。導入時のトラブルシュート・詳細(flexisip.conf、redis.confなどの設定ファイル)についてはフォーラム記事を参照願います(以下リンク先、関連フォーラム記事参照)。Ubuntu22.04上で動作するFlexisipサーバの最新版をインストールするため、SDKを導入しソースからビルドします。ビルドしたバイナリから新規にFlexisipのDockerイメージファイルを作成し、これとFlexisipサーバの運用に必要な他のDockerイメージファイルとを組合せてシステム全体を構成します。

Docker Flexisip System

  1. Linphone SDK Dockerイメージの作成(Ubuntu 22.04)
  2. Flexisipのビルド・DEBパッケージの作成
  3. Flexisip Dockerイメージの作成
  4. Certbot DockerコンテナによるSSL/TLS認証手続き
  5. Flexisip Account Managerの導入準備
  6. Docker Compose ファイルの作成
  7. 起動・コンテナ内での操作

関連フォーラム記事Linphone-SDK Ubuntu 22.04 Dockerイメージの作成とアプリのビルド(IPv6対応)


1. Linphone SDK Dockerイメージの作成(Ubuntu 22.04)

Linphone-SDKのDockerコンテナ内でLinphoneアプリやflexisipサーバをビルドするため、Linphone-SDKのDockerイメージを作成します。必要なのは下記でダウンロードした docker-files ディレクトリです。

$ git clone https://gitlab.linphone.org/BC/public/linphone-sdk.git

docker-files ディレクトリ内の bc-dev-ubuntu-rolling を参考にして Ubuntu 22.04 に対応した新規ファイルを作成します。

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

Makefikeの編集(Ubuntu 22.04のセクション追加)

.....
.....
ubuntu-22.04-LTS:
	docker build -f bc-dev-ubuntu-22-04-lts -t $(BASE_NAME)/bc-dev-ubuntu:22.04 --rm .
.....
.....

ビルド(直接 docker build コマンドでビルドしても構いません)

$ make ubuntu-22.04-LTS

Dockerイメージの確認

$ 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

任意のフォルダ(Linphoneまたは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. Flexisipのビルド・DEBパッケージの作成

1.で作成したlinphone-sdk イメージからコンテナを起動します。

$ docker run --name linphone-sdk -v $PWD:/home/bc -it gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:22.04

以下コンテナ内での作業です。コンテナ内で flexisip のソースをダウンロードします。

$ git clone https://gitlab.linphone.org/BC/public/flexisip.git --recursive

次に flexisip のビルドに必要なパッケージを、以下ファイルを参考に追加インストール・ビルドインストールします。

追加パッケージ

$ sudo apt install file llvm libboost-dev libboost-system-dev libboost-thread-dev libhiredis-dev libjsoncpp-dev mariadb-server libnghttp2-dev redis-server

追加するパッケージのビルド・インストール(スクリプトによりビルド・インストール)

$ cd flexisip/docker
$ sudo ./libnghttp2_asio_install.sh 1.43.0

上記の準備ができたら以下のフローで flexisip をビルドします。

$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/belledonne-communications -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSYSCONF_INSTALL_DIR=/etc -DCPACK_GENERATOR=DEB
$ make package

問題なければ以下2種類のパッケージが作成されます。

bc-flexisip_2.3.0-0.*_amd64.deb
bc-flexisip-dbgsym_2.3.0-0.*_amd64.ddeb


備考)OS別flexisip公式レポジトリのインストール

CentOS, RockyLinux, Ubuntu, Debian対応。flexisipをビルドせずにレポジトリを登録し、新規にflexisipDockerイメージを作成する場合は以下を参照して下さい。

/etc/apt/sources.list.d/belledonne.list Ex):Ubuntu 22.04

deb [arch=amd64] http://linphone.org/snapshots/ubuntu jammy stable # hotfix beta alpha

インストールフロー

$ 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. Flexisip Dockerイメージの作成

作成した以下のパッケージを flexisip/docker ディレクトリにコピーして作業します。

bc-flexisip_2.3.0-0.*_amd64.deb
bc-flexisip-dbgsym_2.3.0-0.*_amd64.ddeb

flex-from-deb を参考にUbuntu 22.04ベースのDockerfile flex-from-ubuntu-deb を作成しMakefileにビルドコマンドを追加します。(snmp-mibs-downloader snmp snmpd のインストールはオプション。SNMPによりflexisipの設定ファイル内の各セクションの設定事項の確認と書換えが行えます。)

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 注)追加部分のみ記載

.....
.....

# 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

.....

ビルド

注)flexisip-entrypoint.sh の "ulimit -c unlimited*" を修正。'*'を削除。

$ make flexisip-ubuntu-deb-build

イメージファイルの確認

$ 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

コンテナ起動

設定ファイルを定義していないため、このイメージから起動できるのはプロキシモードのみとなります。設定ファイル flexisip.conf を出力するためプロキシモードでコンテナを起動して下さい。

$ 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

設定ファイル flexisip.conf をコピー

$ docker cp ubuntu-flexisip:/etc/flexisip/flexisip.conf ./

4. Certbot DockerコンテナによるSSL/TLS認証手続き

以下ホストマシン上での作業です。

flexisipによるシステム運用にはSSL(TLS)認証は不可欠です。Dockerコンテナにより事前に取得しておくことによりnginxflexisipの設定に反映させて下さい。

注) $PWDはコマンドを実行するディレクトリ

$ docker run -it --rm --name certbot -v "$PWD/letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot certonly --standalone -d www.example.com

ホストマシンのクロンジョブに以下のCertbot Dockerコンテナによるrenewコマンドを追加
注) ディレクトリには絶対パスを指定すること。

$ docker stop nginx && docker run -it --rm --name certbot -v "/??/??/.../letsencrypt:/etc/letsencrypt" -p 80:80 certbot/certbot renew && docker start nginx

証明書の期限は90日のため60日毎の更新手続きを推奨しています。

flexisip.conf での設定は以下のようにします。

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. Flexisip Account Managerの導入準備

flexisip-account-manage(以下 fam )は Laravel (PHPフレームワーク)によりデザインされています。

Docker Compose ファイルで使用するサービスの一つとして、専用のイメージをビルドするための Docker ファイル : php-fpm-alpine-laravel を作成します。

ComposerPHP機能拡張のインストールには、DockerHubのPHP公認ページが推奨している docker-php-extension-installer を利用します。

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

後ほど作成するdocker-compose.ymlファイルと同一のディレクトリ内にflexisip-account-managerをダウンロードします。

$ git clone https://github.com/BelledonneCommunications/flexisip-account-manager.git

6. Docker Compose ファイルの作成

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

注)Dockerネットワークとphpmyadminボリュームは予め作成すること。

ブリッジネットワーク

$ 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

ボリュームの作成

$ docker volume create phpmyadmin

7. 起動・コンテナ内での操作

起動

$ docker compose up -d

php-fpm-laravel コンテナ内で以下の作業を行います。

$ docker compose exec php-fpm-laravel sh
# cd flexiapi

① flexisip-account-manager に必要な依存パッケージのダウンロード

# composer install --no-dev

② .env ファイルを作成しセキュリティキーを適用。認証用SMTPメールサーバ、データベースなどの設定を .env ファイル内で行います。

# cp env.example .env
# php artisan key:generate

③ Linphone のアカウント用データベースを作成します。

# php artisan migrate

④ ウェブフロントエンドからユーザ登録します。

Ficus Home.myvnc.com Register Email

⑤ 管理者ユーザの設定。登録したユーザを flexisip-account-manager の管理者とします。

# php artisan accounts:set-admin {account_id}

Note)

# php artisan --help
# php artisan cache:clear

注) フロントエンドは Laravel で作成された flexisip-accont-manager/flexiapi ディレクトリで構成されています( flexisip-accont-manager/xmlrpc ディレクトリは必要はありません)。

設定ファイルは flexisip-accont-manager/flexiapi/config ディレクトリに格納されています。この設定ファイルの変数を上書きするために .env ファイルが利用されます。

Ficus Home.myvnc.com Admin Accounts

Ficus Home.myvnc.com Admin Accounts Show

2023/04/26追記)

SMS送信によるアカウント認証については、LaravelのNotificationクラスに対応したVONAGEパッケージをインストールすることで対応可能です。事前にVONAGEアカウント(2ユーロまでのトライアルSMS送信サービス付き。トライアルではクレジットカードの登録は必要ありません)に登録する必要があります。

登録するとAPIキーAPIシークレットが付与されるので、これを .env ファイルに記載します。

.env

# Vonage SMS API
VONAGE_KEY=xxxxxxxxxx
VONAGE_SECRET=xxxxxxxxxxxxxxx
VONAGE_SMS_FROM=1234567890 (トライアルでは任意の番号)

必要なパッケージを composer によりインストール

# composer require laravel/vonage-notification-channel

Notification クラスを拡張したSMS送信メッセージ用新規クラス VonageSMS を作成

# php artisan make:notification VonageSMS

新規ファイル

app/Notifications/VonageSMS.php

内容追加・書換ファイル

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

詳細について要望などあればコンタクトページを参照の上連絡願います。

Register by Phone

Sms Validate Pin

Vonage Received