フォーラム記事を纏めた内容です。導入時のトラブルシュート・詳細(flexisip.conf、redis.confなどの設定ファイル)についてはフォーラム記事を参照願います(以下リンク先、関連フォーラム記事参照)。Ubuntu22.04上で動作するFlexisipサーバの最新版をインストールするため、SDKを導入しソースからビルドします。ビルドしたバイナリから新規にFlexisipのDockerイメージファイルを作成し、これとFlexisipサーバの運用に必要な他のDockerイメージファイルとを組合せてシステム全体を構成します。
- Linphone SDK Dockerイメージの作成(Ubuntu 22.04)
- Flexisipのビルド・DEBパッケージの作成
- Flexisip Dockerイメージの作成
- Certbot DockerコンテナによるSSL/TLS認証手続き
- Flexisip Account Managerの導入準備
- Docker Compose ファイルの作成
- 起動・コンテナ内での操作
関連フォーラム記事: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
をビルドせずにレポジトリを登録し、新規にflexisip
のDocker
イメージを作成する場合は以下を参照して下さい。
/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
コンテナにより事前に取得しておくことによりnginx
やflexisip
の設定に反映させて下さい。
注) $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
を作成します。
Composer
とPHP
機能拡張のインストールには、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
④ ウェブフロントエンドからユーザ登録します。
⑤ 管理者ユーザの設定。登録したユーザを 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
ファイルが利用されます。
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
詳細について要望などあればコンタクトページを参照の上連絡願います。