🦈

AWS上にWebRTCのWeb会議システムを構築する stable-7882

2022/11/13に公開

みなさんこんにちは

本日のお題

前回、Jitsiを利用した際には、stable-6726を利用しましたが、新型が出ていたので、再度構築しました。
大きく変わったのは、以下の2点です。
Jibriがなくても録画ができるようになった。
WebAssenblyでノイズキャンセル性能が向上した。

Dockerのインストール

Docker自体にこだわりはないので、Versionなど考慮せずにデフォルトでインストール。

[root@yukkuri ~]# yum install -y docker
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                             | 3.7 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package docker.x86_64 0:20.10.17-1.amzn2.0.1 will be installed
...略

Dockerの起動設定

Dockerの起動と、自動起動設定を行います。

[root@yukkuri ~]# systemctl start docker
[root@yukkuri ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@yukkuri ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-11-12 17:43:58 UTC; 48s ago
     Docs: https://docs.docker.com
 Main PID: 6417 (dockerd)
   CGroup: /system.slice/docker.service
           └─6417 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536

Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.674112768Z" level=info msg="ClientConn switching balancer to \"pic...ule=grpc
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.716969600Z" level=warning msg="Your kernel does not support cgroup... weight"
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.717008757Z" level=warning msg="Your kernel does not support cgroup..._device"
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.717177785Z" level=info msg="Loading containers: start."
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.905070868Z" level=info msg="Default bridge (docker0) is assigned w...address"
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.959494477Z" level=info msg="Loading containers: done."
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.976535405Z" level=info msg="Docker daemon" commit=a89b842 graphdri...20.10.17
Nov 12 17:43:57 yukkuri dockerd[6417]: time="2022-11-12T17:43:57.976647011Z" level=info msg="Daemon has completed initialization"
Nov 12 17:43:58 yukkuri systemd[1]: Started Docker Application Container Engine.
Nov 12 17:43:58 yukkuri dockerd[6417]: time="2022-11-12T17:43:58.012351867Z" level=info msg="API listen on /run/docker.sock"
Hint: Some lines were ellipsized, use -l to show in full.
[root@yukkuri ~]#

docker-composeインストール

docker-composeも今回は動けば良いので、とりあえず最新をインストール
https://github.com/docker/compose/releases

[root@yukkuri ~]# curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 42.8M  100 42.8M    0     0  84.0M      0 --:--:-- --:--:-- --:--:-- 91.0M
[root@yukkuri ~]# chmod +x /usr/local/bin/docker-compose
[root@yukkuri ~]# docker-compose -vDocker Compose version v2.12.2
[root@yukkuri ~]#

Dockerイメージの状態

[root@yukkuri ~]# docker images
REPOSITORY      TAG        IMAGE ID       CREATED        SIZE
jitsi/jicofo    unstable   18a9f2355f38   13 hours ago   396MB
jitsi/jvb       unstable   30151ad78462   13 hours ago   440MB
jitsi/prosody   unstable   dc9fbcec520b   14 hours ago   193MB
jitsi/web       unstable   98e1152b894e   14 hours ago   307MB

Let's Encript導入

[root@yukkuri meet]# mkdir -p /home/yukkuri/certificates
[root@yukkuri meet]# ls /home/yukkuri/certificates
[root@yukkuri meet]#

legoツールの導入

https://github.com/go-acme/lego/releases/

[root@yukkuri meet]# mkdir -p /opt/lego
[root@yukkuri meet]# cd /opt/lego
[root@yukkuri lego]# wget https://github.com/go-acme/lego/releases/download/v4.5.3/lego_v4.5.3_linux_386.tar.gz
--2022-11-12 18:54:28--  https://github.com/go-acme/lego/releases/download/v4.5.3/lego_v4.5.3_linux_386.tar.gz
Resolving github.com (github.com)... 140.82.113.4
Connecting to github.com (github.com)|140.82.113.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/37038121/622cb438-75ea-4d47-9031-412a72beda47?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221112%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221112T185428Z&X-Amz-Expires=300&X-Amz-Signature=075777a633478b157aa836c0e358682cc0af8c6c4d6c09b18f6d76aea90da8a2&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=37038121&response-content-disposition=attachment%3B%20filename%3Dlego_v4.5.3_linux_386.tar.gz&response-content-type=application%2Foctet-stream [following]
...

legoツールの設置

[root@yukkuri lego]# tar zxf lego_v4.5.3_linux_386.tar.gz
[root@yukkuri lego]# rm -rf lego_v4.5.3_linux_386.tar.gz
[root@yukkuri lego]# /opt/lego/lego -v
lego version 4.5.3 linux/386

legoツールを利用して証明の作成

[root@yukkuri lego]# ./lego --accept-tos --path=/home/yukkuri --email="XXXXX@gmail.com" --dns="route53" --domains="yukkuri.me" --domains="*.yukkuri.me" run
2022/11/12 18:56:13 No key found for account XXXXX@gmail.com. Generating a P256 key.
2022/11/12 18:56:13 Saved key to /home/yukkuri/accounts/acme-v02.api.letsencrypt.org/XXXXX@gmail.com/keys/XXXXX@gmail.com.key
2022/11/12 18:56:13 [INFO] acme: Registering account for XXXXX@gmail.com
!!!! HEADS UP !!!!

Your account credentials have been saved in your Let's Encrypt
configuration directory at "/home/yukkuri/accounts".

You should make a secure backup of this folder now. This
configuration directory will also contain certificates and
private keys obtained from Let's Encrypt so making regular
backups of this folder is ideal.
2022/11/12 18:56:13 [INFO] [yukkuri.me, *.yukkuri.me] acme: Obtaining bundled SAN certificate
2022/11/12 18:56:13 [INFO] [*.yukkuri.me] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/175423188797
2022/11/12 18:56:13 [INFO] [yukkuri.me] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/175423188807
2022/11/12 18:56:13 [INFO] [*.yukkuri.me] acme: use dns-01 solver
2022/11/12 18:56:13 [INFO] [yukkuri.me] acme: Could not find solver for: tls-alpn-01
2022/11/12 18:56:13 [INFO] [yukkuri.me] acme: Could not find solver for: http-01
2022/11/12 18:56:13 [INFO] [yukkuri.me] acme: use dns-01 solver
2022/11/12 18:56:13 [INFO] [*.yukkuri.me] acme: Preparing to solve DNS-01
2022/11/12 18:56:14 [INFO] Wait for route53 [timeout: 2m0s, interval: 4s]

2022/11/12 18:56:48 [INFO] [yukkuri.me] acme: Preparing to solve DNS-01
2022/11/12 18:56:48 [INFO] Wait for route53 [timeout: 2m0s, interval: 4s]
2022/11/12 18:57:18 [INFO] [*.yukkuri.me] acme: Trying to solve DNS-01
2022/11/12 18:57:18 [INFO] [*.yukkuri.me] acme: Checking DNS record propagation using [172.31.0.2:53]
2022/11/12 18:57:22 [INFO] Wait for propagation [timeout: 2m0s, interval: 4s]
2022/11/12 18:57:29 [INFO] [*.yukkuri.me] The server validated our request
2022/11/12 18:57:29 [INFO] [yukkuri.me] acme: Trying to solve DNS-01
2022/11/12 18:57:29 [INFO] [yukkuri.me] acme: Checking DNS record propagation using [172.31.0.2:53]
2022/11/12 18:57:33 [INFO] Wait for propagation [timeout: 2m0s, interval: 4s]
2022/11/12 18:57:37 [INFO] [yukkuri.me] The server validated our request
2022/11/12 18:57:37 [INFO] [*.yukkuri.me] acme: Cleaning DNS-01 challenge
2022/11/12 18:57:37 [INFO] Wait for route53 [timeout: 2m0s, interval: 4s]
2022/11/12 18:58:03 [INFO] [yukkuri.me] acme: Cleaning DNS-01 challenge
2022/11/12 18:58:03 [INFO] [yukkuri.me, *.yukkuri.me] acme: Validations succeeded; requesting certificates
2022/11/12 18:58:03 [INFO] [yukkuri.me] Server responded with a certificate.
[root@yukkuri lego]#

#ファイルが作成されているか確認する。
[root@yukkuri lego]# ls /home/yukkuri/certificatesyukkuri.me.crt  yukkuri.me.issuer.crt  yukkuri.me.json  yukkuri.me.key
[root@yukkuri lego]#

Jitsi用のdocker-compose起動

docker-compose用の定義取得

[root@yukkuri ~]# git clone https://github.com/jitsi/docker-jitsi-meet.git
Cloning into 'docker-jitsi-meet'...
remote: Enumerating objects: 4423, done.
remote: Counting objects: 100% (194/194), done.
remote: Compressing objects: 100% (137/137), done.
remote: Total 4423 (delta 73), reused 138 (delta 51), pack-reused 4229
Receiving objects: 100% (4423/4423), 1.28 MiB | 30.49 MiB/s, done.
Resolving deltas: 100% (2099/2099), done.
[root@yukkuri ~]#

docker-compose用の定義ファイルの準備

#ディレクトリ名の編集
[root@yukkuri ~]# mv docker-jitsi-meet meet
#ディレクトリの移動
[root@yukkuri ~]# cd meet
[root@yukkuri meet]# ls
base       CHANGELOG.md        env.example   examples          jibri      jicofo  jigasi.yml  LICENSE   prosody    release.sh  web
base-java  docker-compose.yml  etherpad.yml  gen-passwords.sh  jibri.yml  jigasi  jvb         Makefile  README.md  resources

#docker-compose.ymlファイルの各パラメタへのValueを記載するファイルを作成する。
[root@yukkuri meet]# cp env.example .env

#ここでProsodyや、JVBなどと内部で接続するためのPWを作成する。
[root@yukkuri meet]# sh ./gen-passwords.sh

[root@yukkuri meet]# mkdir -p ~/.jitsi-meet-cfg/{web/crontabs,web/letsencrypt,transcripts,prosody/config,prosody/prosody-plugins-custom,jicofo,jvb,jigasi,jibri}

.envファイルの編集

docker-compose.ymlの各パラメーターのValue情報が記載されたファイル。

[root@yukkuri meet]# vi .env
# shellcheck disable=SC2034

################################################################################
################################################################################
# Welcome to the Jitsi Meet Docker setup!
#
# This sample .env file contains some basic options to get you started.
# The full options reference can be found here:
# https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker
################################################################################
################################################################################


#
# Basic configuration options
#

# Directory where all configuration will be stored
CONFIG=~/.jitsi-meet-cfg

# Exposed HTTP port
-#HTTP_PORT=8000
+HTTP_PORT=80

# Exposed HTTPS port
-#HTTPS_PORT=8443
+HTTPS_PORT=443

# System time zone
TZ=UTC

# Public URL for the web service (required)
-#PUBLIC_URL=https://meet.example.com
+PUBLIC_URL=https://meet.yukkuri.me

# Media IP addresses to advertise by the JVB
# This setting deprecates DOCKER_HOST_ADDRESS, and supports a comma separated list of IPs
# See the "Running behind NAT or on a LAN environment" section in the Handbook:
# https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker#running-behind-nat-or-on-a-lan-environment
#JVB_ADVERTISE_IPS=192.168.1.1,1.2.3.4
...

docker-compose.ymlファイルの編集

ホストOS上に作成した証明書ファイルを、ゲストOS上に紐づける設定を追加します。

[root@yukkuri meet]# vi docker-compose.yml
services:
    # Frontend
    web:
        image: jitsi/web:${JITSI_IMAGE_VERSION:-unstable}
        restart: ${RESTART_POLICY:-unless-stopped}
        ports:
            - '${HTTP_PORT}:80'
            - '${HTTPS_PORT}:443'
        volumes:
            - ${CONFIG}/web:/config:Z
            - ${CONFIG}/web/crontabs:/var/spool/cron/crontabs:Z
            - ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts:Z
+            - /home/yukkuri/certificates/yukkuri.me.crt:/config/keys/cert.crt:Z
+            - /home/yukkuri/certificates/yukkuri.me.key:/config/keys/cert.key:Z
        environment:
            - AMPLITUDE_ID
            - ANALYTICS_SCRIPT_URLS
            - ANALYTICS_WHITELISTED_EVENTS
            - AUDIO_QUALITY_OPUS_BITRATE
            - BRANDING_DATA_URL
...

docker-composeを起動する

起動するときに、Dockerの最新のイメージをDLしてくれます。
今回は、録画と、ノイズキャンセルを動かしたいだけでVersionにこだわりがないので、そのまま動かします。

[root@yukkuri meet]# docker-compose up -d

docker-composeを停止する

停止するときのコマンドは以下。docker-compose downとすると、中間ファイルが消えてしまいます。
スッキリが必要なときに利用します。
ただ、停止する場合は、以下のコマンドを利用します。

[root@yukkuri meet]# docker-compose stop

試運転

動くことを確認できました。

新しい機能

会議名_2022-11-12T19_26_10.827Z.webmのようなファイル名で出力される。
ブラウザの機能を利用していると思われる。
Noise suppressionでノイズキャンセリングのONOFFが可能。デフォルトはON

今後の課題

周りからも、お安くなったので、Teamsでいいんじゃないですかね。
と言われましたし、そうですね。とも思うのですが、Webassenblyのノイズキャンセルを試したくて構築。
https://jitsi.org/blog/enhanced-noise-suppression-in-jitsi-meet/
※夜中なので、自分で試した感じだと、そもそもノイズがないということで確認できず。。。
オンプレミスで利用できるのが、いいところなので、有効活用を考えていきたいですね。
単独だと有償サービスも安くなってきたしいいことばかりなんじゃないですかね。
AWSで運用すると転送料金で高額になりがちなOSSですしね。

今回の所要時間

EC2など全部作り直したこともあり、数時間かかりました。
EIPや、ストレージなどあるだけでお金がかかるようなサービスの金額が気にならないくらいの予算が欲しいですね。。。
うーん。また徹夜しちゃいましたね。誰に褒められるでもなく。

Discussion