Jitsi Meet（ビデオ会議システム）のサーバを Docker Compose で起動する手順

# Jitsi 概要

[Jitsi Meet](https://jitsi.org/jitsi-meet/) （ジッチ・ミート）とはオープンソース（Apache License 2.0）として開発・利用できるビデオ会議用のシステムです。利用者はブラウザから URL にアクセスするだけで、すぐにビデオ会議が利用できます。ブラウザ以外にも、iOS や Android 対応のアプリが公開されています。

この Jitsi Meet 用のサーバ環境は [Docker に対応しています](https://github.com/jitsi/docker-jitsi-meet) 。自分のドメイン名を使い、自分のサーバ上に  Docker Compose で起動する手順をまとめました。 [公式ドキュメント](https://github.com/jitsi/docker-jitsi-meet) をベースに、自分が持つドメイン名のホストで Jitsi Meet を立ち上げるまでの手順です。（なお、ドメイン名を準備しているのは Let's Encrypt の HTTPS 通信にも対応させるためです。単なるセットアップ確認であれば、HTTPS は必須ではありません。）

![jitsi-docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/930ac0fc-f78d-99ef-7e4b-5627a878f6ed.png)

# 事前準備

- Jitsi Meet を動かす Linux サーバ環境（本手順は CentOS 7.x を前提としています） ※本手順は 2GB のメモリ環境で試しました
- Docker Engine と Docker Compose のインストール
  - 参考：[Docker のセットアップ手順](https://qiita.com/zembutsu/items/b345b9b820ad82e9b3d1#docker-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E7%94%A8%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E5%88%A9%E7%94%A8)
  - 参考：[Docker Compose のセットアップ手順](https://qiita.com/zembutsu/items/b345b9b820ad82e9b3d1#docker-compose-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- DNS サーバ側で、何らかのホスト名をサーバに対して設定（レコードの追加）
  - ここでは `meet.toaru.site` というホスト名での設定を想定
  - Let's Encrypt で SSL 証明書を利用するため。利用しなくても Jitsi Meet を試せられるものの、ブラウザ側のセキュリティ設定によっては映像・音声通話が出来ない可能性


# Jitsi 設定手順

## GitHub リポジトリのクローン

まず GitHub 上のリポジトリを `git clone` でローカルに保存し、ディレクトリを移動します。

```
git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet
```

## Jisti 環境変数用ファイル `.env` の編集

次に、設定ファイルを準備するため、サンプル用のファイルをコピーします。なお、このファイル `.env` は Docker Compose で起動する時、環境変数として読み込むために使います。

```
cp env.example .env
```

それから `.env` ファイルを編集します。  `vi .env` などでファイルを開きます。編集箇所を上からみていきます。

### 基本設定

基本設定として、9～18行目までは、次のように書き換えます。

```
#
# Basic configuration options
#

# Directory where all configuration will be stored
CONFIG=~/.jitsi-meet-cfg		← Let's Encrypt の証明書など、基本的な情報などが格納されるディレクトリ

# Exposed HTTP port
HTTP_PORT=80	← 一般的な HTTP 用ポートにします

# Exposed HTTPS port
HTTPS_PORT=443	← 一般的な HTTPS 用ポートにします

# System time zone
TZ=Asia/Tokyo	← タイムゾーンを日本にします

# Public URL for the web service
PUBLIC_URL=https://meet.toaru.site	←このホスト名は皆さんの環境にあわせ変更します。先頭の # を外すのを忘れずにします
```

### Let's Encrypt 設定

Let's Encrypt の設定を追加します（30～36行目）。

```
#
# Let's Encrypt configuration
#

# Enable Let's Encrypt certificate generation
ENABLE_LETSENCRYPT=1		←「1」が有効です。先頭の # を消します。

# Domain for which to generate the certificate
LETSENCRYPT_DOMAIN=meet.toaru.site	←こちらは、環境にあわせて書き換えます

# E-Mail for receiving important account notifications (mandatory)
LETSENCRYPT_EMAIL=alice@example.jp	← ここは、皆さんのメールアドレスを入力します（Let's Encrypt の有効期限通知が届きます）
```

`.env` で最低限の編集が必要なのは、以上の項目です。

## セキュリティ設定

`.env` に含まれるデフォルトのシステム内部パスワードを書き換えるため、次のコマンドを実行します。（ [関連情報](https://github.com/jitsi/docker-jitsi-meet#security-note) ）

```
./gen-passwords.sh
```

このスクリプト実行により、元々の `.env` ファイルは `.env.backup` に書き換えます。このバックアップ用ファイル中には暗号化前のパスワードが残っていますが、念のため不要であれば削除しておくことが望ましいでしょう。

## 設定ファイル等の保存用ディレクトリ作成

それから、設定情報を格納するディレクトリを作成します。

```
mkdir -p ~/.jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}
```

メモ：ここで作成する `~/.jitsi-meet-cfg` ディレクトリは Let's Encrypt の証明書を格納するなど、重要な場所です。一通りの稼働を確認したら、バックアップ用に控えておくのをおすすめします。また、ホスト名を変更した場合など、トラブルシューティングに困ったら、一旦このディレクトリを別名に変えるなどして、再度 Docker Compose の起動を試すとスムーズに起動できる場合もあります。

## Docker イメージの取得と確認

それから、Docker Compose で使うイメージをダウンロードします。コマンドを実行すると、必要な Docker イメージを順次ダウンロードします。

```
docker-compose pull
```

`docker images` コマンドを実行すると、実行に必要な Docker イメージを確認できます。

```
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
jitsi/jvb                                  latest              fd8201652975        11 days ago         276MB
jitsi/jicofo                               latest              773ffe263260        11 days ago         277MB
jitsi/prosody                              latest              5734ef478ff3        11 days ago         256MB
jitsi/web                                  latest              
```

## Docker Compose で Jitsi の起動

あとは Docker Compose で起動します。

```
docker-compose up -d
```

`docker-compose ps` コマンドを実行すると、各サービスが稼働中 ( Up ) なのが分かります。

```
          Name              Command   State                        Ports
----------------------------------------------------------------------------------------------
dockerjitsimeet_jicofo_1    /init     Up
dockerjitsimeet_jvb_1       /init     Up      0.0.0.0:10000->10000/udp, 0.0.0.0:4443->4443/tcp
dockerjitsimeet_prosody_1   /init     Up      5222/tcp, 5269/tcp, 5280/tcp, 5347/tcp
dockerjitsimeet_web_1       /init     Up      0.0.0.0:8443->443/tcp, 0.0.0.0:8000->80/tcp
```

このコマンドを実行しているバックグラウンドで、 Let's Encrypt 用の証明書発行や、様々な初期設定が進行しています。

どのような処理が進行しているかは 、 `docker-compose logs -f` コマンドで確認できます。ここでは `web` サービス（Nginxが稼働しています）のログを確認します。

```
docker-compose logs -f web
```


ログを辿ると、次のように証明書の取得が成功したり、有効期限などが表示されています。

```
web_1      | Obtaining a new certificate
web_1      | Performing the following challenges:
web_1      | http-01 challenge for meet.toaru.site
web_1      | Waiting for verification...
web_1      | Cleaning up challenges
web_1      | IMPORTANT NOTES:
web_1      |  - Congratulations! Your certificate and chain have been saved at:
web_1      |    /etc/letsencrypt/live/meet.toaru.site/fullchain.pem
web_1      |    Your key file has been saved at:
web_1      |    /etc/letsencrypt/live/meet.toaru.site/privkey.pem
web_1      |    Your cert will expire on 2020-07-05. To obtain a new or tweaked
```

もし `- The following errors were reported by the server:` のようなエラーメッセージや `nginx: [emerg] open() "/config/nginx/nginx.conf" failed (2: No such file or directory)` というエラーメッセージが出る場合、証明書の作成に失敗しています。 `.env` の記述が誤っているか、あるいはファイアウォール等でサーバに HTTP （TCP/80）での通信が出来ない可能性があります。通信に関連する諸設定を確認します。また、ホスト名の記述が間違っている場合は  `~/.jitsi-meet-cfg` を別名にするなどして、作り直すのも1つです。

最終的には、次のようなログが表示されれば問題ありません。ログの表示は `Ctrl-C` で中断できます。

```
web_1      | [cont-init.d] 10-config: exited 0.
web_1      | [cont-init.d] done.
web_1      | [services.d] starting services
web_1      | [services.d] done.
```

## ウェブブラウザでアクセス・動作確認

あとは、ブラウザで **https://設定したホスト名** にアクセスするだけです。

「新しいミーティングを開始」でミーティング名（ルーム名に相当します）を入力し、「GO」を押せば大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/cca27eb0-83f9-d805-321c-ef36163a9366.png)

音声、動画、テキストでのチャットだけでなく、画面共有機能もあります。

![Screenshot_2020-04-07 Jitsi Meet(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/ba53d56f-1e99-9b39-866a-6b1dda68d1e1.png)


Enjoy!





# その他、今後の考慮点など

- 必要に応じてファイアウォール等は検討。このままだと、URLが分かるので誰でもアクセスできてしまう
- Jitsi には認証機能があるようなので、それも試してみたいところ
- 利用者が増えた時のネットワーク帯域を計測しないと
- 長期運用する場合、このまま Compose でよいのだろうか
- 拡張機能として、録画、文章共有、ディクテーション機能があるので試したい


# 参考情報

- [Jisti Meet](https://jitsi.org/jitsi-meet/)
- [Jitsi Meet on Docker](https://github.com/jitsi/docker-jitsi-meet)
- [Jitsi meets Docker - Jitsi](https://jitsi.org/news/jitsi-meets-docker/)