FICUSONLINE F9E
FusionPBX (FreeSWITCH) on Docker
公式のインストールスクリプトを参考にしつつ、FusionPBXを構成する主要コンポーネントであるNginx、PostgreSQL、PHP、FreeSWITCHをそれぞれ独立したDockerコンテナ として分離・管理します。 Dockerによる運用には、次に挙げる利点があります。 1) 各コンポーネントを最新の安定版の組み合わせで構築できる。 2) 他のホスト環境への移行が容易で、環境依存性を最小化できる。 3) 複数インスタンス(マルチテナント/マルチ運用)を柔軟に展開できる。 4) Let's Encryptを利用したTLS証明書の自動管理が容易。 5) iptablesやfail2banなどのホストレベルのセキュリティ対策を、アプリケーション層とは独立して調整・管理できる。
Takanobu FuseAdministrator

last week

Cloud / Server

FreeSWITCHのインストール (Debian)

https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Installation/Linux/Debian_67240088/

システムインフォメーション

データベース

  • Name PostgreSQL
  • Version 17.6

FusionPBX on Docker


本記事は下記フォーラム(作業ノート)の内容を纏めたものです。内容の詳細については、ここを参照願います。

https://forum.ficusonline.com/t/topic/535/3

掲載したファイルは、githubにアップロードします。

1. 作業ディレクトリ

作業ディレクトリとして、公式インストールスクリプト内のdebianディレクトリを利用します。 このディレクトリ内の一部スクリプトや設定ファイルを、各Dockerコンテナで流用します。

$ git clone https://github.com/fusionpbx/fusionpbx-install.sh
$ cd fusionpbx-install.sh/debian

ダウンロードしたディレクトリの中で、実際に使用するファイルはデータベース、サーバの設定に必要な以下の4ファイルです。各自の環境に併せ内容の編集をして下さい。

注) DockerイメージにFreeSWITCHをインストールするには、アクセストークンが必要です。予め下記サイトを参照してトークンを取得してください。 https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Installation/how-to-create-a-personal-access-token/how-to-create-a-personal-access-token/

  • fusionpbx-install.sh/debian/resources/config.sh 各種スクリプトで参照する環境変数ファイル。アクセストークンが必要。
  • fusionpbx-install.sh/debian/resources/finish.sh Docker-Composeで初回起動後にデータベースの構築などをするスクリプト
  • fusionpbx-install.sh/debian/resources/fusionpbx/config.conf FusionPBXの設定ファイル
  • fusionpbx-install.sh/debian/resources/nginx/fusionpbx  Nginxの設定ファイル

2. FusionPBXとオプションパッケージのダウンロード

上記作業ディレクトリ内でFusionPBX最新安定版をダウンロード、fusionpbx/appにオプションパッケージを追加します。

FusionPBXのダウンロード

$ git clone $branch https://github.com/fusionpbx/fusionpbx.git

追加パッケージ(オプション)

$ git clone https://github.com/fusionpbx/fusionpbx-app-transcribe.git ./fusionpbx/app/transcribe
$ git clone https://github.com/fusionpbx/fusionpbx-app-speech.git ./fusionpbx/app/speech
$ git clone https://github.com/fusionpbx/fusionpbx-app-device_logs.git ./fusionpbx/app/device_logs
$ git clone https://github.com/fusionpbx/fusionpbx-app-dialplan_tools.git ./fusionpbx/app/dialplan_tools
$ git clone https://github.com/fusionpbx/fusionpbx-app-edit.git ./fusionpbx/app/edit
$ git clone https://github.com/fusionpbx/fusionpbx-app-sip_trunks.git ./fusionpbx/app/sip_trunks
$ sudo chown -R www-data:www-data /var/www/fusionpbx /var/cache/fusionpbx /etc/freeswitch

3. カスタムDockerイメージの作成

FusionPBXを構成する主要パッケージは、nginx, php-fpm,postgresql,freeswitchですが、php-fpmとfreeswitchについては、FusionPBXの動作環境に適合するようカスタムイメージを作成します。 カスタムイメージを作成するためのdockerfileをdocker_filesディレクトリに作成し、各カスタムイメージをビルドします。

3-1. PHP-FPMカスタムイメージのビルド

FusionPBXのソースは、Docker-Composeファイルで、このコンテナ内に配置されます。

$ mkdir docker_files

docker_files/php-fpm-fusionpbx

docker_files/entrypoint.sh

ビルド

$ docker build -f $(pwd)/docker_files/php-fpm-fusionpbx -t php-8.2-fpm:20250817 $(pwd)/docker_files

3-2. FreeSWITCHカスタムイメージのビルド

FreeSWITCHのDockerイメージについては、下記公式パッケージをダウンロードしてカスタマイズ(取得方法は、git,svnコマンドを使用するなど任意)。

https://github.com/signalwire/freeswitch/tree/master/docker/master

docker_filesディレクトリに新規freeswitch_masterディレクトリを作成してイメージビルド用の各ファイルを配置

$ mkdir freeswitch_master

インストールするFreeSWICTHのパッケージは、必要な機能ごとに数パターン用意されていますが、今回はfreeswitch-meta-allではなく、freeswitch-meta-bareをインストールした上で必要な拡張機能を追加しています。

  • freeswitch-meta-bare
  • freeswitch-meta-vanilla
  • freeswitch-meta-sorbet
  • freeswitch-meta-all-dbg
  • freeswitch-meta-all

docker_files/freeswitch_master/Dockerfile

docker_files/freeswitch_master/docker-entrypoint.sh

docker_files/freeswitch_master/build/freeswitch.limits.conf

ビルド

$ docker build -f $(pwd)/docker_files/freeswitch_master/Dockerfile -t freeswitch:20250817 $(pwd)/docker_files/freeswitch_master

ビルドしたイメージの確認

$ docker images
REPOSITORY               TAG         IMAGE ID       CREATED        SIZE
php-8.2-fpm              20250817    xxxxxxxxxxxx   5 weeks ago    740MB
freeswitch               20250817    xxxxxxxxxxxx   6 weeks ago    2.11GB

4. TLS証明書取得

LetsEncryptによるTLS認証に必要な証明書を取得します。

今回はNginx, FreeSwitchともにIPv6のみの対応とし、CloudflareのDNSレコード:タイプAAAAでドメインを登録、DNSチャレンジで証明書を取得します。

以下のcloudflare専用certbotコンテナを使用します。cloudflareのアカウントとAPIトークン(cloudflare.iniに記述)は必須です。

https://hub.docker.com/r/certbot/dns-cloudflare

$ docker run -it --rm --name certbot_cloudflare -v "/etc/letsencrypt:/etc/letsencrypt" -v "./cloudflare.ini:/opt/certbot/cloudflare.ini" certbot/dns-cloudflare:latest certonly --dns-cloudflare --dns-cloudflare-propagation-seconds 60 --dns-cloudflare-credentials ./cloudflare.ini -d ficusonline.com -d *.ficusonline.com

Nginxには取得した証明書をそのまま利用できますが、FreeSWITCHのTLS認証ファイルは、これら証明書をベースに新たに作成する必要が有ります。

ホストマシン上で以下の作業を実行。

# cat ./letsencrypt/live/ficusonline.com/fullchain.pem > ./letsencrypt/live/ficusonline.com/all.pem
# cat ./letsencrypt/live/ficusonline.com/privkey.pem >> ./letsencrypt/live/ficusonline.com/all.pem
# cd ./letsencrypt
# ln -s live/ficusonline.com/all.pem agent.pem
# ln -s live/ficusonline.com/all.pem tls.pem
# ln -s live/ficusonline.com/all.pem wss.pem
# ln -s live/ficusonline.com/all.pem dtls-srtp.pem

5. Docker-Composeファイルの作成

FreeSwitchコンテナのネットワークモードはhostとして下さい。他のコンテナについては任意ですが、 設定ファイルがそのまま流用できるため、Nginx、PHP-FPMコンテナについてもhostモードにしています。

PHP-FPMとFreeSWITCHコンテナで共有するディレクトリは以下の通りです。

      - ./resources/fusionpbx/config.conf:/etc/fusionpbx/config.conf
      - ./fusionpbx/app/switch/resources/conf:/etc/freeswitch
      - ./fusionpbx/app/switch/resources/scripts:/usr/share/freeswitch/scripts
      - freeswitch_lib:/var/lib/freeswitch
      - freeswitch_usr_lib:/usr/lib/freeswitch
      - freeswitch_share:/usr/share/freeswitch
      - freeswitch_log:/var/log/freeswitch
      - freeswitch_run:/var/run/freeswitch
      - ./cache:/var/cache/fusionpbx

PHP-FPMコンテナ起動時に、複数のPHPスクリプトを実行するため、Supervisorの設定ファイルを作成・指定しています。

      - ./php-fpm_conf/php.ini:/usr/local/etc/php/php.ini
      - ./php-fpm_conf/supevisor.conf:/etc/supervisor/conf.d/supevisor.conf:ro
      - ./php_log:/var/log/supervisor

docker-compose.yaml


6. FusionPBXの起動

起動

$ docker compose up -d

起動後にfinish.shスクリプトをphp-fpmコンテナ内で実行するとFreeSWITCHの設定テーブルが作成され、アクセスURL、管理者アカウント:admin、パスワードが表示されるので、ブラウザでアクセス・ログインして下さい。

$ docker compose exec php-fpm bash
# cd /opt/fusionpbx-installer-sh 
# ./finish.sh

    Installation has completed.

    Use a web browser to login.
       domain name: https://000.000.000.000
       username: admin
       password: XXXXXXXXXXXXXXXXXXXXXXX

    The domain name in the browser is used by default as part of the authentication.
    If you need to login to a different domain then use username@domain.
       username: [email protected]

    Additional information.
       https://fusionpbx.com/support.php
       https://www.fusionpbx.com
       http://docs.fusionpbx.com
       https://www.fusionpbx.com/training.php

ログイン画面 Login

ダッシュボード Dash Board


7. セキュリティ対策とデバック

インストールスクリプトを参照し、ホストマシン上で別途設定して下さい。 セキュリティについては iptables, fail2ban、デバックには sngrep を利用しています。