WebRTC Gateway JanusをGCPで動かす

[Janus Gateway](https://janus.conf.meetecho.com/) に関する記事はいくつかあるものの、インターネット上で公開してどこからでもアクセスできるようにするところまでについて書かれものがあまりなかったので、自分のメモ代わりとして記事に残します。

ここでは、新規に確保したGCP(Google Cloud Platform)インスタンス上にJanusをインストールしてNginxでデモサーバを構築し、インターネットからアクセスできるようにします。ブラウザはChromeを使用しました。

※ お試しで動くようにできたところまでのメモなので、セキュリティ面については全く考慮されていません。

以下のサイトの情報が大いに参考になりました。

> [How to run Janus on a Google Cloud Compute instance and build your own WebRTC streaming server]
(https://medium.com/good-robot/how-to-run-janus-on-a-google-cloud-compute-instance-and-build-your-own-webrtc-streaming-server-14144f9efb8)

## 全体の流れ

1. GCPインスタンスの構築
2. GCPインスタンス上にJanusビルド環境をインストール
3. Janusビルド・インストール
4. サーバ証明書の取得・インストール
5. 設定ファイルの修正
6. Janus起動

なお、SSL接続でないとJanusのWebRTCが動作しないため、GCPインスタンスに割り当て可能なドメイン名が必要になります。
テスト目的ならIPアドレスの自己証明書とかでも構わないと思います。

## GCPインスタンスの構築

### インスタンス作成
一番安い範囲（無料枠？）で構築します。
ただし、動くことは動くのですが、メモリ614MBでは実用上は厳しいかもしれません。
構築したインスタンスの内容は以下になります。GCPのインスタンス構築方法の詳細は割愛します。

項目 | 設定値 | デフォルトからの変更の有無
--- | --- | ---
シリーズ| N1 | 無
マシンタイプ | f1-micro (1 vCPU, 614MBメモリ) | 有 (無料枠を狙う)
永続ディスク容量 | 30GB | 有 (30GBまでは無料枠で使えるらしい)
オペレーティングシステム | Debian 10 (buster) | 有 (特に理由はない。Ubuntuとかでも大丈夫だと思う)

<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493279/f0c5aebc-f639-e2c1-b95d-15f8a227050d.png">

### ドメイン名の割り当て

作成したGCPインスタンスに独自ドメインを割り当てます。

まず、GCPインスタンスのIPアドレスを静的アドレスに設定します。
GCPのコントロールパネルから、VCPネットワーク → 外部IPアドレス　で設定します。
※静的アドレスにすると無料枠から外れるかもしれません。

予約した静的IPアドレスに、新しくドメイン名を割り当てておきます。

## GCPインスタンス上にJanusビルド環境をインストール

作成したGCPインスタンスにSSHログインします。
必要に応じて、アカウントなどの初期設定をします。

### apt-get初期化

```shell
$ sudo apt-get update
$ sudo apt-get upgrade
```

### 必要なパッケージのインストール

基本的には、GitHubの[Janus README](https://github.com/meetecho/janus-gateway)に説明されている通りですが、若干違う箇所があります。

```shell
$ sudo apt-get install libmicrohttpd-dev libjansson-dev \
	libssl-dev libsofia-sip-ua-dev libglib2.0-dev \
	libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
	libconfig-dev pkg-config gengetopt libtool automake
```

ビルドで必要になる開発関連ツールを追加でインストールします。

```shell
$ sudo apt-get install make git
```

### WEB Serverのインストール

WEB ServerはNginxです。
証明書は[Let's Encrypt](https://letsencrypt.org/ja/)を使用します。
certbotのインストールで固まったことがあったので最初にインストールしておきます。
とりあえずインストールしておくだけです。

> どうしてもcertbotをapt-getでインストールできず、パッケージDBを壊してしまって、
GCPインスタンス作成からやり直したことがありました。原因不明。

```shell
$ sudo apt-get install nginx certbot
```

### libnice

そのままビルドすると `./autogen.sh: 26: ./autogen.sh: gtkdocize: not found` のエラーが出るので、追加パッケージ gtk-doc-tools をインストールしてからビルドします。

```shell
$ sudo apt-get install gtk-doc-tools
$ git clone https://github.com/libnice/libnice.git
$ cd libnice
$ ./autogen.sh
$ ./configure --prefix=/usr
$ make && sudo make install
```

### libsrtp2

```shell
$ git clone https://github.com/cisco/libsrtp.git
$ cd libsrtp
$ ./configure --prefix=/usr --enable-openssl
$ make shared_library && sudo make install
```

### その他

フォーラムの記事によると、Data Channelを有効にするには、usrsctpだけでなくBoringSSLも必要らしいです。実際、usrsctpをインストールしただけではData Channelは有効になりませんでした。というわけで、面倒なのでData Channelは試していません。

## Janusビルド・インストール

### ビルド・インストール
```shell
$ git clone https://github.com/meetecho/janus-gateway.git
$ cd janus-gateway
$ ./autogen.sh
$ ./configure --prefix=/opt/janus
$ make
$ sudo make install
$ sudo make configs
```

### www

NginxのホームディレクトリにJanusデモサイトをコピーします。

```shell
$ sudo cp -r html /var/www
```

### お試し起動

```shell
$ sudo /opt/janus/bin/janus
```

エラーが出なければOK。ワーニングは無視。

GCPインスタンスに割り当てたドメイン名がjanus.example.comとして、`http://janus.example.com/`のようなURLでアクセスすると、Janusのデモサイトが表示されるはず。

ただし、この時点では、エコーテストなどしようとしても、次のようなエラーが出ます。

> WebRTC error... "getUserMedia not available"

これは、SSLではないために起こるようです。
この原因が分からず困っていましたが、同様のトラブルがフォーラムに書かれていました。

## サーバ証明書の取得・インストール

### Let's Encrypt

まず、Nginxを動作停止します。

```shell
$ sudo systemctl stop nginx
```

証明書を取得します。

```shell
$ sudo certbot certonly --standalone -d janus.example.com -m webmaster@example.com --agree-tos -n
```

成功していれば、/etc/letsencrypt/live/janus.example.com に証明書ができているはずです。

## 設定ファイルの修正
### Nginx設定

SSLとリバースプロキシの設定をします。

```nginx:/etc/nginx/sites-enabled/default
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name janus.example.com;
        return 301 https://$host$request_uri;
}
server {
        server_name janus.example.com;
        root /var/www/html;

        # SSL
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ssl_certificate /etc/letsencrypt/live/janus.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/janus.example.com/privkey.pem;

         # Reverse Proxy
        location /janusbase/ {
                proxy_pass http://127.0.0.1:8088/;
        }
}
```

### STUNサーバ設定

STUNサーバを設定しないとNAT越えができません。
Googleのサーバを使用します。

```:/opt/janus/etc/janus/janus.jcfg
nat: {
      stun_server = "stun.l.google.com"
      stun_port = 19302
      nice_debug = false
      #full_trickle = true
      #ice_lite = true
      #ice_tcp = true
}
```

### リバースプロキシ設定

`/var/www/html/janus.js`の447行目を次のように変更します。

```javascript:/var/www/html/janus.js
  // line 447
  // var server = gatewayCallbacks.server;
  var server = "/janusbase/janus";
```

## Janus起動

```shell
$ sudo /opt/janus/bin/janus
```

これで、インターネットからアクセスしてEcho TestやVideo Roomなどが動作するはずです。
※Chromeでのみ確認しました。

## 参考URL

- [How to run Janus on a Google Cloud Compute instance and build your own WebRTC streaming server](https://medium.com/good-robot/how-to-run-janus-on-a-google-cloud-compute-instance-and-build-your-own-webrtc-streaming-server-14144f9efb8)