Flexisipアカウントマネージャー

Linphoneアプリ向けにアカウント作成用サーバのソースコードが公開されています。
CentOS+Apache向けとなっていますが、Flexisipを稼働しているDockerコンテナ群のNginx+PHP-FPMに導入します。

また用意されたphpスクリプトにより、以下のLinphoneアカウント用テーブルを作成します。

インストール手順(Docker-Composeファイルによる)

Docker-Composeファイル

別記事で設定したFlexisip用docker-composeファイル内で、flexisip-account-manager用に新たに共有ボリュームをnginxphp-fpmの項目に追加します。

./docker_files内のdockerfileにより、予め各コンテナに必要な追加パッケージをインストールしています。

# nginx, additional install $ docker exec nginx apk add bash nano
  nginx:
    container_name: nginx
    image: nginx:alpine
    tty: true
    environment:
      - VIRTUAL_HOST=test.site.com
      - VIRTUAL_ROOT=/var/www/html
      - VIRTUAL_PORT=80
      # - VIRTUAL_PROTO=fastcgi
      - LETSENCRYPT_HOST=test.site.com
      - [email protected]
    volumes:
      # shared nginx default.conf between host and container
      - ./nginx_default.conf:/etc/nginx/conf.d/default.conf
      # shared the directory /var/www/html in php-fpm container
      - ./html:/var/www/html/register
      # shared the directory /var/www/html in phpmysql-fpm container
      - ./phpmyadmin_data:/var/www/html/phpmyadmin
      # for flexisip-account-manager
      - ./flexisip-account-manager:/var/www/html/flexisip-account-manager
    external_links:
      - nginx-proxy-letsencrypt
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.6

  # php-fpm, additional install $ docker exec php-fpm apk add bash nano
  # php extension mysqli should be installed, $ docker exec php-fpm docker-php-ext-install mysqli
  # for Userfrosting, install followings.
  # apk add libpng-dev freetype-dev libjpeg-turbo-dev zip
  # docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
  # docker-php-ext-install -j$(nproc) gd
  # docker-php-ext-install -j$(nproc) pdo pdo_mysql
  # docker-php-ext-install -j$(nproc) zip
  php-fpm:
    container_name: php-fpm
    build: 
      context: ./docker_files
      dockerfile: php7.2-fpm-alpine
    tty: true
    expose: 
      - "9000"
    volumes:
      - ./html:/var/www/html/register
      # for flexisip-account-manager. install # apk add libxml2-dev, # docker-php-ext-install xmlrpc
      - ./flexisip-account-manager:/var/www/html/flexisip-account-manager
      - ./etc/flexisip-account-manager:/etc/flexisip-account-manager
    depends_on:
      - flexisip-mariadb
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.7

./docker_files/php7.2-fpm-alpine

FROM php:7.2-fpm-alpine
# For flexisip-account-manager xmlrpc server
RUN apk add --no-cache bash nano libpng-dev freetype-dev libjpeg-turbo-dev zip libxml2-dev \
    && docker-php-ext-install mysqli xmlrpc \
    && docker-php-ext-enable mysqli xmlrpc \

# 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 www-data:www-data account-manager.log

flexisip-account-managerのダウンロード

git cloneコマンドによりダウンロードします。

以下srcフォルダconfフォルダの中身をdocker-composeファイルで設定した共有フォルダ
flexisip-account-manageretc へコピーします。

php-fpmコンテナの設定

php-fpmコンテナ内にbashコマンドで移動し、xmlrpcサーバに必要なパッケージ、機能拡張をインストールします。インストール後、再起動します。

$ docker exec -ti php-fpm bash

# apk add libxml2-dev
# docker-php-ext-install xmlrpc
# exit

php-fpmの再起動

$ docker container restart php-fpm

nginxコンテナの設定(/etc/nginx/conf.d/default.conf)

nginxコンテナ内でサブディレクトリflexisip-account-managerの追加・設定をします。

$ docker exec -ti nginx bash
# nano /etc/nginx/conf.d/default.conf
location ^~ /flexisip-account-manager {

    alias /var/www/html/flexisip-account-manager/xmlrpc;
    try_files $uri $uri/ @flexisip-account-manager;

    location ~ \.php$ {
        fastcgi_split_path_info ^\/flexisip-account-manager\/(.+\.php)(.*)$;
        fastcgi_param  HTTPS 'on';
        fastcgi_pass   php-fpm:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
    }
  }

  location @flexisip-account-manager {
     rewrite /flexisip-account-manager/(.*)$ /flexisip-account-manager/xmlrpc.php;
  }

設定のリロード

# nginx -s reload

アカウントデータテーブルの作成

事前に

/etc/flexisip-account-manager/db.conf

/var/www/html/flexisip-account-manager/database/database.php

内でデータベース、ユーザ名、パスワードを設定して下さい。

db.conf

define("DB_HOST", "mariadb-flexisip");

define("DB_USER", "flexisip");

define("DB_PASSWORD", "your_password");

define("DB_NAME", "flexisip");

database.php

"mysql:host=flexisip-mariadb;dbname=flexisip"

php-fpmコンテナ内で以下phpスクリプトを実行してアカウント用テーブルを作成します。

$ docker exec -ti php-fpm bash
# php /var/www/html/flexisip-account-manager/tools/create_tables.php

xmlrpcサーバ、プロビジョニングの動作については現在検証中。

Flexisipの設定ファイルの変更

flexisip-account-managerにより作成されたaccountsテーブルとpasswordsテーブルは切り離されているので、accountsテーブルのusernameからpasswordを抽出できるようFlexisipの設定ファイルflexisip.confsociの項目を変更します。

/etc/flexisip/flexisip.conf

soci-password-request=select passwords.password, 'SHA-256' from accounts inner join passwords on accounts.id=passwords.account_id where username = :id and domain = :domain

アカウントマネージャーログ確認(php-fpmコンテナ内)

bash-5.0# cat /var/opt/belle*/log/account-manager.log

コンテナphp-fpmログ確認

$ docker logs php-fpm

Update Flexisip Account Manager

アップデートについては以下リンク先参照のこと。

Ver 1.6以降の新規インストール後の対応

.envファイルでデバックモードに変更して動作確認のこと。


500 error 対応

原因:以下hcaptchaの旧バージョンによる不具合

4.5から5.2へ変更

composer.json

"rvxlab/hcaptcha": "^5.2"

依存パッケージのアップデート

# composer update 

依存パッケージのインストール

# composer install --no-dev

php artisan コマンド

新規インストールした場合

# php artisan key:generate

データベースアップデート(作成)

# php artisan migrate

SIPドメインと管理者ユーザの登録を以下のphp artisanコマンドで行います。

SIPドメインを登録(superはオプション)

# php artisan sip_domains:create-update sip.example.com --super

Your will create or update a SIP Domain in the database
A new domain will be created
Set as a super domain

管理者ユーザの登録

# php artisan accounts:create-admin-account -u user001 -p password -d sip.example.com

Your will create a new admin account in the database, existing accounts with the same credentials will be overwritten
Admin test account created: "[email protected]" | Password: "password" | API Key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" (valid on any ip)

MINEタイプエラー

login:1 Refused to execute script from ‘https://xxx.xxx.xxx/scripts/[email protected]’ because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.

ヒント

flexiapi/resources/views/layouts/main.blade.php

<script src="{{ asset('scripts/[email protected]') }}"></script>

JSファイルであることを明示するため、以下のファイルを採用

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/chartjs-plugin-datalabels.min.js"></script>

ラベル属性指定エラー

ラベルエレメントが、インプットエレメントのidではなくnameを参照しているため発生。実際にはインプットエレメントにid項目が欠如。

Incorrect use of
The label’s for attribute refers to a form field by its name, not its id. This might prevent the browser from correctly autofilling the form and accessibility tools from working correctly.

To fix this issue, refer to form fields by their id attribute.

2 resources
Label
Label
Learn more: HTML Standard

インプットエレメントにid項目追加。下記ファイル以外にも <input id= エレメントを含むファイルの修正必要(多数、動作に問題はない)。

flexisip-account-manager/flexiapi/resources/views/account/login.blade.php

<input id="username" placeholder="username or phone number" required="" name="username" type="text"
                        value="{{ old('username') }}">

<input id="username" placeholder="username" required="" name="username" type="text"
                        value="{{ old('username') }}">
                    <label for="username">Username</label>

<input id="password" placeholder="myPassword" required="" name="password" type="password" value="">