構築条件として、
(1)一つのイメージ(コンテナ)にLAMPサーバに必要とされる全てのアプリをインストール
(2)一つのイメージ(コンテナ)にFlexisipサーバに必要とされる全てのアプリをインストール
(3)上記マルチタスクを実行するため、システムデーモンSystemdにより各アプリを起動
注) Flexisipサーバの設定は、ユーザ環境により異なるため、各自調整が必要です(重要:flexisipの設定ファイル+xmlrpc関連ファイル+データベースの設定など)。
また、公式のアカウントマネージャのデザインは簡易版で、以前ブログで報告したメールアクティベーションで採用したカスタムデザインとは大きく異なります。
今回作成した各ファイルについての詳細は、下記Githubページを参照願います。
https://github.com/capitalfuse/centos7_environment
1. システムデーモンが起動するCentOS7イメージの作成
まず初めに、システムデーモンsystemdが起動するCentOS7ベースのイメージファイルを作成します。以下のDockerfileを作成、ビルドして下さい。
centos7_environment/docker_files/centos7_systemd_base_image/Dockerfile
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
ベースイメージのビルド(作成)
$ cd dockerfiles/centos7_systemd_base_image
$ docker build --rm -t local/c7-systemd .
作成されたイメージファイルの確認
$ docker images
REPOSITORY local/c7-systemd
2. LAMPサーバイメージの作成(ベースイメージlocal/c7-systemd)
上記local/c7-systemdをベースとしたLAMPサーバイメージビルド用Dockerfile:lamp-c7を作成します。
centos7_environment/docker_files/lamp-c7
FROM local/c7-systemd
MAINTAINER Takanobu Fuse< [email protected]>
# Prepare the Belledonne's repository
COPY Belledonne.repo /etc/yum.repos.d/Belledonne.repo
# Install varioius utilities
RUN yum -y install curl wget unzip git vim nano \
iproute sysvinit-tools hostname inotify-tools yum-utils which epel-release \
freetype-dev libjpeg-turbo-dev zip libxml2-dev icu-dev nodejs-current npm
# Install Apache
RUN yum -y install httpd httpd-mod_ssl httpd-mod_auth_mellon httpd-mod_security openssl
# Install PHP 7.3
RUN yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm \
&& yum-config-manager --disable remi-php54 \
&& yum-config-manager --enable remi-php73 \
&& yum -y install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json \
php-pdo php-soap php-xmlrpc php-xml php-opcache php-pdo_mysql php-zip php-mysqli php-intl
# Reconfigure Apache
RUN sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf
# Install phpMyAdmin
RUN yum install -y phpMyAdmin \
&& sed -i 's/Require ip 127.0.0.1//g' /etc/httpd/conf.d/phpMyAdmin.conf \
&& sed -i 's/Require ip ::1/Require all granted/g' /etc/httpd/conf.d/phpMyAdmin.conf \
&& sed -i 's/Allow from 127.0.0.1/Allow from all/g' /etc/httpd/conf.d/phpMyAdmin.conf \
&& sed -i "s/'cookie'/'config'/g" /etc/phpMyAdmin/config.inc.php \
&& sed -i "s/\['user'\] .*= '';/\['user'\] = 'root';/g" /etc/phpMyAdmin/config.inc.php \
&& sed -i "s/\['password'\] .*= '';/\['password'\] = 'password1234';/g" /etc/phpMyAdmin/config.inc.php \
# && sed -i "/AllowNoPassword.*/ {N; s/AllowNoPassword.*FALSE/AllowNoPassword'] = TRUE/g}" /etc/phpMyAdmin/config.inc.php \
&& sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 512M/g' /etc/php.ini \
&& sed -i 's/post_max_size = 8M/post_max_size = 512M/g' /etc/php.ini \
&& sed -i 's/memory_limit = 128M/memory_limit = 512M/g' /etc/php.ini
# Install MariaDB
# https://downloads.mariadb.org/mariadb/repositories/#distro=CentOS&distro_release=centos7-amd64--centos7&mirror=netactuate&version=10.5
# After start container, MariaDB [(none)]> set password for 'root'@localhost = password("password1234");
COPY MariaDB.repo /etc/yum.repos.d/MariaDB.repo
RUN yum -y install MariaDB-server MariaDB-client
### Create database and use and set root password in docker container lamp-c7
########## $ mariadb -u root -e 'create database flexisip;'
########## $ mariadb -u root -e 'grant all privileges on flexisip.* TO 'flexisip'@'localhost' identified by 'password1234';'
########## $ mariadb -u root -e 'set password for 'root'@localhost = password("password1234");'
# Place VOLUME statement below all changes to /var/lib/mysql
VOLUME /var/lib/mysql
#EXPOSE 3306
# Install Redis
RUN yum -y install redis
#EXPOSE 3000
# UTC Timezone & Networking
RUN ln -sf /usr/share/zoneinfo/UTC /etc/localtime \
&& echo "NETWORKING=yes" > /etc/sysconfig/network
# Install Composer and Laravel
COPY composer_installer.sh /var/www/html
RUN cd /var/www/html \
&& ./composer_installer.sh \
&& mv composer.phar /usr/local/bin/composer \
&& chown -R apache:apache /var/www/html \
&& composer global require laravel/installer \
&& ln -s /root/.config/composer/vendor/laravel/installer/bin/laravel /usr/local/bin/laravel
# Install flexisip-account-manager
#RUN yum -y install centos-release-scl-rh \
#RUN yum -y install bc-flexisip-account-manager \
#&& chown -R apache:apache /opt/belledonne-communications/share/flexisip-account-manager
#&& cp /opt/rh/httpd24/root/etc/httpd/conf.d/flexisip-account-manager.conf /etc/httpd/conf.d/
### OR
# Install latest flexisip-account-manager from github
RUN mkdir -p /opt/belledonne-communications/share/flexisip-account-manager /etc/flexisip-account-manager /var/opt/belledonne-communications/flexiapi/storage \
&& cd /tmp \
&& git clone https://gitlab.linphone.org/BC/public/flexisip-account-manager.git \
&& cd flexisip-account-manager \
&& cp -R flexiapi /opt/belledonne-communications/share/flexisip-account-manager/ \
&& cp -R src/* /opt/belledonne-communications/share/flexisip-account-manager/ \
&& cp -R conf/* /etc/flexisip-account-manager/ \
&& cp httpd/* /etc/httpd/conf.d/ \
### setting connfig file for flexisip account manager
&& sed -i "s/\"DB_USER\",.*\".*\"/\"DB_USER\", \"root\"/g" /etc/flexisip-account-manager/db.conf \
&& sed -i "s/\"DB_PASSWORD\",.*\".*\"/\"DB_PASSWORD\", \"password1234\"/g" /etc/flexisip-account-manager/db.conf \
&& sed -i "s/\"DB_NAME\",.*\".*\"/\"DB_NAME\", \"flexisip\"/g" /etc/flexisip-account-manager/db.conf \
&& sed -i "s/(\"REMOTE_PROVISIONING_OVERWRITE_ALL\",.*);/(\"REMOTE_PROVISIONING_OVERWRITE_ALL\", True);/g" /etc/flexisip-account-manager/provisioning.conf \
&& touch /var/opt/belledonne-communications/flexiapi/storage/db.sqlite \
&& chown -R apache:apache /opt/belledonne-communications/share/flexisip-account-manager \
&& cd /opt/belledonne-communications/share/flexisip-account-manager/flexiapi \
&& composer install --no-dev
### Implement the below php commnds in docker container lamp-c7
########## $ php /opt/belledonne-communications/share/flexisip-account-manager/tools/create_tables.php
########## $ php artisan key:generate
########## $ php artisan migrate:rollback
########## $ php artisan migrate
### set an account admin user {account_id}, in advance create user and use user's account_id
########## $ php artisan accounts:set-admin 1
# Make the log directory and the log file for flexisip-account-manager
RUN mkdir -p /var/opt/belledonne-communications/log \
&& cd /var/opt/belledonne-communications/log \
&& touch account-manager.log \
&& chown apache:apache account-manager.log
#EXPOSE 80
RUN systemctl enable httpd.service mariadb.service redis.service
CMD ["/usr/sbin/init"]
上記Dockerfile:lamp-c7からdockerコマンドでオプションを指定してビルドするか、予めdocker-composeファイルを作成し、これにオプションを記述してビルドします。
今回は以下のdocker-composeファイルを作成してビルドします。
centos7_environment/docker_files/docker-compose.lamp.yml
version: '3.5'
services:
# LAMP Server
lamp-c7:
container_name: lamp-c7
build:
context: ./docker_files
dockerfile: lamp-c7
tty: true
volumes:
# for Systemd integration:https://hub.docker.com/_/centos
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- ${MAKE_TEMP}:/run
# shared database
- mariadb:/var/lib/mysql
# copy flexiapi env file
- ./flexiapi_env/flexiapi.env:/opt/belledonne-communications/share/flexisip-account-manager/flexiapi/.env
# for laravel php framework
# - ./html:/var/www/html:rw
# - ./etc/flexisip-account-manager:/etc/flexisip-account-manager:rw
# shared apache default.conf between host and container
# - ./etc/http:/etc/http/conf.d/default.conf
# shared the directory /var/www/html
# - ./html:/var/www/html
restart: always
network_mode: host
cap_add:
- SYS_ADMIN
privileged: true
devices:
- /dev/fuse
# need to "$ docker volume create mariadb"
volumes:
mariadb:
external: true
ビルドコマンドの実行
$ docker-compose -f docker-compose.lamp.yml build
3. Flexisip SIPサーバイメージの作成(ベースイメージlocal/c7-systemd)
上記2と同様にlocal/c7-systemdをベースとしたFlexisipサーバイメージビルド用Dockerfile:flexisip-c7を作成します。
centos7_environment/docker_files/flexisip-c7
FROM local/c7-systemd
MAINTAINER Jehan Monnier < [email protected]>
# Prepare the Belledonne's repository
COPY Belledonne.repo /etc/yum.repos.d/Belledonne.repo
RUN yum -y install epel-release yum-downloadonly gdb
RUN yum update -y
# Download rpm to be able to skip systemd's scripts
RUN yum install -y --downloadonly --downloaddir=/opt bc-flexisip bc-flexisip-debuginfo bc-flexisip-jwe-auth-plugin
RUN mv /opt/bc-flexisip*.rpm /tmp
RUN rpm -i /opt/*.rpm
RUN rpm -i --noscripts /tmp/bc-flexisip*.rpm
#RUN echo '/tmp/core' > /proc/sys/kernel/core_pattern
RUN rm /opt/*.rpm
# 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/flexisip
COPY flexisip/flexisip-entrypoint.sh /
COPY flexisip/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
RUN yum clean all
# Make the proxy and presence servers to start on system boot
RUN systemctl enable flexisip-proxy flexisip-presence
CMD ["/usr/sbin/init"]
以下のdocker-composeファイルを作成し、Flexisipサーバイメージを作成します。
注)重要:flexisipの設定ファイルは config/flexisip.conf に上書きされるので、予めデータベースなどの設定項目を記述しておきます。
centos7_environment/docker_files/docker-compose.flexisip.yml
version: '3.5'
services:
# Flexisip SIP Server
flexisip-c7:
container_name: flexisip-c7
build:
context: ./docker_files
dockerfile: flexisip-c7
tty: true
volumes:
# for Systemd integration:https://hub.docker.com/_/centos
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- ${MAKE_TEMP}:/run
#- ./letsencrypt:/etc/flexisip/tls
- ./config:/etc/flexisip
### If you are using TLS Support for Apache to listen on 443 in the container drop them in /certs and set these:
#- TLS_CERT=cert.pem
#- TLS_KEY=key.pem
restart: always
network_mode: host
cap_add:
- SYS_ADMIN
privileged: true
devices:
- /dev/fuse
ビルドコマンドの実行
$ docker-compose -f docker-compose.flexisip.yml build
4. LAMPサーバとFlexisipサーバの起動
docker-composeファイルで起動する前に、データベースバックアップ用外部共有ボリュームを作成します。
$ docker volume create mariadb
次のコマンドでCentOS7 LAMP Server を起動します。ホストマシンOSがUbuntuでない場合、"MAKE_TEMP=/tmp/$(mktemp -d)"
の箇所は削除し、
docker-composeファイルからも "- ${MAKE_TEMP}:/run"
を削除して下さい。
$ MAKE_TEMP=/tmp/$(mktemp -d) docker-compose -f docker-compose.lamp.yml up -d
同様に、CentOS7 Flexisip Server を起動します。ホストマシンOSがUbuntuでない場合、"MAKE_TEMP=/tmp/$(mktemp -d)"
の箇所は削除し、
docker-composeファイルからも "- ${MAKE_TEMP}:/run"
を削除して下さい。
$ MAKE_TEMP=/tmp/$(mktemp -d) docker-compose -f docker-compose.flexisip.yml up -d
Dockerコンテナではなく、CentOSのホストマシンに直接各アプリをインストールする場合、以下DockerfileのCOPY,RUN,ENVの箇所のコマンドを順番に実行して下さい(未検証)。
docker_files/lamp-c7
docker_files/flexisip-c7
5. Mariadb root パスワードの設定
LAMPサーバのコンテナ内のMariaDBコンソールで、phpMyAdminログイン用パスワードを設定します。
$ docker exec -ti lamp-c7 bash
# mariadb
>MariaDB [(none)]> set password for 'root'@localhost = password("password1234");
6. Flexisipサーバ用ユーザとデータベースの作成
MariaDBのコンソールまたはphpMyadminにログインし、Flexisipサーバ用ユーザflexisip(任意)とデータベースflexisip(任意)を作成します。
7. アカウントマネージャの設定
以下ファイルのデータベースの設定をして下さい。
lamp-c7 コンテナ内で:
/etc/flexisip-account-manager/db.conf
/*
* The database username.
*
* Default value: flexisip_rw
*/
define("DB_USER", "root");
/*
* The database user's password.
*
* Default value:
*/
define("DB_PASSWORD", "password1234");
/*
* The name of the database.
*
* Default value: flexisip
*/
define("DB_NAME", "flexisip");
flexisipアカウントテーブル作成のため、以下のphpコマンドを実行して下さい。
lamp-c7 コンテナ内で:
$ php /opt/belledonne-communications/share/flexisip-account-manager/tools/create_tables.php
8. カスタム設定の読込(Provisioning)
カスタム設定の読込みを有効とするため、以下ファイルでprovisioningの上書きを有効(True)にします。
注)Linphone公式標準アプリではカスタム設定は読込まれません。カスタム設定の読込(Provisioning)には、Linphoneアプリ側で読込を有効とする変更が必要になります。
コードを変更してLinphoneの再ビルドが必要です。Provisioningを有効とする方法については、以前のブログ記事のメールによるアクティベーションを参照願います。
2021/11/03:上記訂正します。ビルドする必要はありません。問題なく読み込みは行われます。
lamp-c7 コンテナ内で:
/etc/flexisip-account-manager/provisioning.conf
define("REMOTE_PROVISIONING_OVERWRITE_ALL", True);
以下フォーマットのdefault.rcを作成すると https://sip.example.cpm/flexisip-account-manager/provisioning.php
にアクセスすることで、XMLフォーマットの設定ファイルが自動出力されます。
この場合、Linphoneのリモート設定にこのURLを入力します。
lamp-c7 コンテナ内で:
/opt/belledonne-communications/share/flexisip-account-manager/xmlrpc/default.rc
#
#This file shall not contain path referencing package name, in order to be portable when app is renamed.
#Paths to resources must be set from LinphoneManager, after creating LinphoneCore.
[assistant]
domain=sip.example.com
xmlrpc_url=https://sip.example.com/flexisip-account-manager/xmlrpc.php
または、
直接以下のようにXMLフォーマットによる設定ファイルを作成し、
lamp-c7 コンテナ内で:
/opt/belledonne-communications/share/flexisip-account-manager/xmlrpc/custom_provisioning.xml
version="1.0" encoding="UTF-8"?>
< config xmlns="http://www.linphone.org/xsds/lpconfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.linphone.org/xsds/lpconfig.xsd lpconfig.xsd">
< section name="assistant">
< entry name="domain" overwrite="true">sip.example.com < /entry>
< entry name="xmlrpc_url" overwrite="true">https://sip.example.com/flexisip-account-manager/xmlrpc.php < /entry>
< /section>
< /config>
リモート設定URLを: https://sip.example.cpm/flexisip-account-manager/custom_provisioning.xml として下さい。
Provisioningの詳細については、以下も参照願います。
https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Features/Remote%20Provisioning/
9. Flexisip-Account-Manager ウェブフロントエンド
lamp-c7コンテナ内で、以下ファイルによりアカウントマネージャがアクセスするデータベースを設定します。
/etc/flexisip-account-manager/fleiapi.env
.....
.....
# Local FlexiAPI database
DB_DATABASE=/var/opt/belledonne-communications/flexiapi/storage/db.sqlite
# External FlexiSIP database
DB_EXTERNAL_DRIVER=mysql
DB_EXTERNAL_HOST=127.0.0.1
DB_EXTERNAL_PORT=3306
#DB_EXTERNAL_DATABASE=/var/opt/belledonne-communications/flexiapi/storage/external.db.sqlite
DB_EXTERNAL_DATABASE=flexisip
DB_EXTERNAL_USERNAME=root
DB_EXTERNAL_PASSWORD=password1234
.....
.....
# SMTP and emails
MAIL_DRIVER=smtp
MAIL_HOST=smtp.XXXXX
MAIL_PORT=XXXX
MAIL_USERNAME=XXXXXXXX
MAIL_PASSWORD=XXXXXXXX
MAIL_FROM_ADDRESS=[email protected]
MAIL_FROM_NAME="${APP_NAME}"
MAIL_ALLOW_SELF_SIGNED=false
MAIL_VERIFY_PEER=true
MAIL_VERIFY_PEER_NAME=true
MAIL_SIGNATURE="The Example Team"
# OVH SMS API variables
OVH_APP_KEY=
OVH_APP_SECRET=
OVH_APP_ENDPOINT=ovh-eu
OVH_APP_CONSUMER_KEY=
OVH_APP_SENDER=
# Google reCaptcha v2 parameters
NOCAPTCHA_SECRET=XXXXXXXXXXXXXXXXXXXX
NOCAPTCHA_SITEKEY=XXXXXXXXXXXXXXXXXXX
lamp-c7コンテナ内の /opt/belledonne-communications/share/flexisip-account-manager/flexiapi ディレクトリで、次の php artisan コマンドを実行しアカウント用テーブルを作成します。
lamp-c7コンテナ内で:
$ cd /opt/belledonne-communications/share/flexisip-account-manager/flexiapi
$ chown -R apache:apache /opt/belledonne-communications/share/flexisip-account-manager/flexiapi
$ php artisan key:generate
$ php artisan migrate:rollback
$ php artisan migrate
server.phpが存在しないため(php artisan serveコマンドによるlocalhostとして動作確認不要であれば不要) /opt/belledonne-communications/share/flexisip-account-manager/flexiapi にserver.phpを作成します。
注)Githubから直接インストールする場合は必要ありません。
lamp-c7コンテナ内で:
/opt/belledonne-communications/share/flexisip-account-manager/flexiapi/server.php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell < [email protected]>
*/
$uri = urldecode(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);
// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
return false;
}
require_once __DIR__.'/public/index.php';
アカウントマネージャを起動します。
lamp-c7コンテナ内で:
$ php artisan serve --host 127.0.0.1
以下URLにアクセスして動作を確認して下さい。
http://localhost:8000
通常は、php artisan serveコマンドは不要で、以下のURLにアクセスして下さい。
http://yourdomain.com/flexiapi
アカウントマネージャ最新版を試用する場合は、以下Githubサイトからダウンロードし、 該当ファイルを
/opt/belledonne-communications/share/flexisip-account-manager/flexiapiにコピーして下さい。
Github 'https://gitlab.linphone.org/BC/public/flexisip-account-manager/tree/master/flexiapi'
本内容についての変更・追加点などは、同名のフォーラム記事でフォローします。