本番稼働に向けて

この資料はクイックスタートで Sora をなんとなく体験したあとに、本番環境に向けてどのような準備が必要なのか、どの機能を使っていけばいいのかをまとめたものです。

不明点などは弊社までお問い合わせください。

IPv4 アドレスの固定

sys.configipv4_address にサーバの IP アドレスを指定してください。

[
 {sora, [
         %% 省略 ...

         %% サーバの IPv4 アドレスを指定してください
         {ipv4_address, "192.0.2.10"},

         %% 省略 ...
        ]},
      %% 以下は変更する必要はありません
].

IPv6 アドレスの利用について

Safari は IPv6 環境での動作が不安定なため Safari をターゲットデバイスに含んでいる場合は sys.config の IPv6 設定を無効にする {ipv6, false} ことを推奨しています。

シグナリングへの HTTPS の適用

WebRTC を利用する場合 HTTPS が必須となります。そのためまず最初に Sora の前段に Nginx を置いて HTTPS 化をしてください。

Nginx の設定については Nginx をご確認ください。

Sora 向けの証明書の作成と適用

Sora が利用する証明書はデフォルトで入っていますが、証明書の生成は難しくないのでできるだけ自前で証明書を生成してください。自己署名証明書で問題ありません。

証明書の生成方法については 証明書 をご確認ください。

カーネルパラメーターの適用

Sora は UDP を利用します。音声や映像の配信では大量の UDP を処理するため Linux のデフォルトの設定だと厳しい場合があります。

そのため、パラメータの変更を推奨しています。

詳細は Linux カーネルチューニング をご確認ください。

SDK の利用の検討

Sora への接続をする場合は弊社がオープンソースにて公開している SDK の利用を検討してください。

これらのライブラリは弊社によって最新版の Sora で動作するようにメンテナンスされています。

導入もとても簡単になっているので、是非利用を検討してください。

重要

SDK に関する質問・要望・バグなどの報告は GitHub Issues の利用をお願いします。ただし、 Sora のライセンス契約の有無に関わらず、 GitHub Issues への応答時間と問題の解決を保証しませんのでご了承ください。

やりたいことが 1:1 双方向の場合

配信が 1:1 の双方向の場合はマルチストリームを利用してください。

詳細は マルチストリーム をご確認ください。

やりたいことが 複数人数の会議の場合

複数人会議を行いたい場合はマルチストリームを利用してください。

詳細は マルチストリーム をご確認ください。

複数人数の会議が 5 人以上の場合

もし 5 人以上の会議が要件に含まれている場合はスポットライト機能の利用を検討してください。

マルチストリーム機能は最大 12 人同時会議が可能ですが、クライアント側の負荷はとても高くなります。

スポットライト機能を利用することで、クライアントとサーバ側の負荷をかなり抑えられるようになりますので、 会議システムを検討している場合はスポットライト機能を検討してください。

詳細は スポットライト機能 のをご確認ください。

Edge が機能要件に含まれている場合

Edge の WebRTC 機能はとても不安定で現状では使い物になりません。

できるだけ要件から落としてください。

認証を外部の指定した HTTP サーバで判断したい場合

認証ウェブフック機能を利用してください。この機能は外部の指定した HTTP サーバで認証を判断することが可能になります。

外部の HTTP サーバの URL 指定は sys.config の auth_webhook_url に設定してください。

そうすることで、外部に認証を移譲することができます。

詳細は 認証ウェブフック をご確認ください。

接続したときや切断した時を外部の指定した HTTP サーバで利用したい場合

イベントウェブフック機能を利用してください。この機能は外部の指定した HTTP サーバでクライアント単位での接続、切断を検知することが可能になります。

外部の HTTP サーバの URL 指定は sys.config の event_webhook_url に設定してください。

配信されている音声や映像を記録したい場合

Sora には録画機能があります。もし利用を検討されている場合はいくつか注意事項があります。

  • 録画を終了させるか、クライアントが切断するまで録画ファイルは生成されない
  • 複数人数が参加する会議の録画ファイルはクライアントごとに生成される
    • 5 人が会議に参加していれば 5 個ファイルが生成されます

これらを踏まえて録画機能の利用を検討してください。

録画機能の詳細は 録画機能 をご確認ください。

クライアント側で参加してきたユーザの情報を通知したい場合

Sora では「〜さんが会議に参加しました」や「〜さんが会議から退席しました」というメッセージをクライアント側で流すことが可能です。

これにはシグナリング通知を利用します。

シグナリング通知機能はシグナリングで利用している WebSocket を経由して、参加しているチャネルに新しく参加、または退席した状態を通知する機能です。自分が参加したときも自身に参加通知は飛びます。

ただシグナリング通知に含まれる標準の情報はあくまでクライアント ID のみになるため、そのクライアント ID が誰なのかはどこからか取得する必要があります。

この処理が毎回走ってしまうのは無駄なため、認証ウェブフックの戻り値に signaling_notify_metadata という任意の値を含める仕組みを使うことで解決可能になります。この任意の値にその参加者のユーザ名を signaling_notify_metadata にサーバから含めて返します。

この signaling_notify_metadata は新しく参加した人には metadata_list として、既存の参加している人の signaling_notify_metadata が含まれたリストが参加時に通知されるようになっています。

さらに、新しく参加者が居た場合はその参加者の metadata が通知されます。もちろん退席者の場合でもその退席者の metadata が含まれて通知されてきます。

metadata にユーザ名が含まれるため、サーバへ問い合わせをしなくても参加者や退席者のユーザ名を取得することができます。

TURN-TCP で 80 番ポート、TURN-TLS で 443 ポートを利用したい場合

この設定はある程度の Nginx や証明書の知識が必要になります

Sora は現時点で UDP 側のポートが固定できないため、ファイアーウォール関連の問題が発生する可能性があります。

そのため TURN-TCP のポート番号を 80 番に、TURN-TLS のポート番号を 443 番にすることを推奨しています。

これらのポート番号は HTTP/HTTPS であれば空いていることが多いです。

Nginx のストリーム機能と SNI 機能を利用する

Nginx の機能を利用して、同一ポートの待受で複数のプロトコルを扱えるようにします。

詳細は以下をご覧ください。

Nginx を利用して同一ポートの待ち受けで複数のプロトコルを扱う - Qiita

その機能を利用した Nginx の参考設定です。証明書には Let's Encrypt を利用している想定です。

利用する証明書はマルチドメイン (SANs) またはワイルドカード証明書が前提となります。

nginx.conf:

stream {
    upstream sora-turns.example.com {
        # Sora の TURN-TCP へ
        # ここの IP アドレスは Sora の ipv4_address に指定した値を指定してください
        # ここの 127.0.0.1 にすると Firefox で繋がらなくなることを確認しています
        server 192.0.2.1:3478;
    }

    upstream sora.example.com {
        server 127.0.0.1:8080;
    }

    server {
        # TURN-TCP を 80 番で受け取ります
        listen 80;
        proxy_pass sora-turns.example.com;
    }

    server {
        # TURN-TLS と WebSecureSocket を 443 で受け取ります
        listen 443 ssl;

        # SNI を利用して転送先を振り分けます
        proxy_pass $ssl_server_name;

        ssl_certificate /etc/letsencrypt/live/sora.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/sora.example.com/privkey.pem;

        ssl_protocols TLSv1.2;
        ssl_prefer_server_ciphers on;

        ssl_handshake_timeout 10s;

        ssl_session_cache off;
        ssl_session_tickets off;
    }
}

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    gzip on;

    server {
        listen 127.0.0.1:8080;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name sora.example.com;

        location = /signaling {
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_pass http://127.0.0.1:5000/signaling;
        }

        location /api {
                proxy_http_version 1.1;
                proxy_pass http://127.0.0.1:3000/;
        }

        location / {
                proxy_http_version 1.1;
                proxy_pass http://127.0.0.1:5000;
        }
    }
}

TURN-TCP を 80 番、 TURN-TLS を 443 番で利用する場合の sys.config の設定は以下になります。

sys.config:

%% TURN 機能を有効にするかどうかを指定してください
{turn, true},

%% TURN 機能で利用するレルムを指定してください
{turn_realm, "sora.example.com"},

%% TURN 機能で TURN-TCP を有効にするかどうかを指定してください
{turn_tcp, true},

%% TURN 機能で TURN-TCP を有効にした際に利用するポート番号を指定してください
{turn_tcp_listen_port, 3478},

%% TURN 機能で TURN-TCP URL 払い出し時のポート番号を指定してください
{turn_tcp_port, 80},

%% TURN 機能で TURN-TLS URL 払い出し機能を有効にするかどうかを指定してください
{turn_tls, true},

%% TURN 機能で TURN-TLS URL 払い出し機能で利用する FQDN (最後の . なし)を指定してください
{turn_tls_fqdn, "sora-turns.example.com"},

%% TURN 機能で TURN-TLS URL 払い出し機能を有効にした際に利用するポート番号を指定してください
{turn_tls_port, 443},

この設定がうまくいかないなどありましたら、サポートまでお問い合わせください。

その歳は Nginx のバージョンや設定ファイルなどもお送りいただければと思います。