ブログ

Linux・オープンソースプロジェクトのティップス紹介

2021/02/14  アンドロイド, Docker, Linphone, リナックス, サーバ


CentOS向けに提供されている公式のFlexisipサーバと、そのアカウントマネージャを含むLAMPサーバをDockerコンテナとして運用します。LAMPサーバとFlexisipサーバを各々独立したコンテナとして稼働します。

構築条件として、

(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<ficus.onine@gmail.com>

# 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 <jehan.monnier@linphone.org>

# 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を有効とする方法については、以前のブログ記事のメールによるアクティベーションを参照願います。

 

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

<?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=from@example.com
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

<?php

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

$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'

 

本内容についての変更・追加点などは、同名のフォーラム記事でフォローします。

 

 

 

 

 

 

 

 

comments powered by Disqus