🐤

Mozilla HubsのバックエンドサーバーReticulumを改造する方法

2020/12/08に公開

Mozilla Hubs の /duck コマンドのアヒル

はじめに

Mozilla Hubs 使っていますか。

最近、諸事情で Mozilla Hubs のバックエンドサーバー Reticulum を改造したり、Hubs Cloud を構築してデプロイするなどしていました。

Hubs Cloud そのものを構築する方法は公式ドキュメントにあり、またクライアント側に関しても公式ドキュメントにあるので、それに沿ってやればそれほど困らないのですが、バックエンドサーバー Reticulum についてはソースコードは公開されているものの、カスタマイズする方法に関してドキュメントは存在せずほとんど情報がありませんでした。

そのため、それぞれ Mozilla の公開しているリポジトリのソースコードを読みつつ、AWS Marketplace にある Hubs Cloud Personal を実際に構築して EC2 インスタンスに SSH でアクセスして、手探りでガチャガチャといろいろ試していくうちに、なんとなく仕組みが分かり改造できるようになったのでその方法を紹介します。

そもそも、どのくらいの人が Reticulum を改造したいのかよく分からないですが、そういう人にとってはこの記事は参考になるかもしれません。

Reticulum とは

Elixir/Phoenix で作られた Web アプリです。基本的には Mozilla Hubs のユーザーのビデオ・音声のストリーミング以外の部分を担っています。
Reticulum をカスタマイズすることによって、独自のメッセージハンドラーを追加したり、既存の認証・認可機構に介入したりできます。

Reticulum のセットアップ

まず Reticulum の README を参考にして開発環境を構築します。

PostgreSQL

PostgreSQL の構築などは Docker Compose を使うと便利なのですが、リポジトリに含まれる docker-compose.ymlpostgres:10 イメージでバージョンが古く、あまりメンテナンスされていない様子だったため役に立ちませんでした。
そのため、私は次のような docker-compose.yml ファイルを作成し、docker-compose up して使いました。

docker-compose.yml
version: "3"
services:
  db:
    image: postgres:11
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports: ["5432:5432"]

Elixir

Ubuntu 20.04 LTS であれば、おそらく次のコマンドでセットアップできます。

sudo apt-get install -y erlang erlang-dev elixir inotify-tools
mix deps.get
mix ecto.create
yarn --cwd assets

ここでは Yarn を使っていますが npm を使っても問題ないと思います。

以上でセットアップ完了です。

開発用サーバーの起動

README によれば

iex -S mix phx.server

とすれば開発用サーバーを起動できるはずなのですが、少なくとも私の環境では環境変数 PERMS_KEY を与えなければ機能しませんでした。
config/test.exs の中にある perms_key をそのまま使うことによって対処しました。

export PERMS_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEpgIBAAKCAQEA3RY0qLmdthY6Q0RZ4oyNQSL035BmYLNdleX1qVpG1zfQeLWf\n/otgc8Ho2w8y5wW2W5vpI4a0aexNV2evgfsZKtx0q5WWwjsr2xy0Ak1zhWTgZD+F\noHVGJ0xeFse2PnEhrtWalLacTza5RKEJskbNiTTu4fD+UfOCMctlwudNSs+AkmiP\nSxc8nWrZ5BuvdnEXcJOuw0h4oyyUlkmj+Oa/ZQVH44lmPI9Ih0OakXWpIfOob3X0\nXqcdywlMVI2hzBR3JNodRjyEz33p6E//lY4Iodw9NdcRpohGcxcgQ5vf4r4epLIa\ncr0y5w1ZiRyf6BwyqJ6IBpA7yYpws3r9qxmAqwIDAQABAoIBAQCgwy/hbK9wo3MU\nTNRrdzaTob6b/l1jfanUgRYEYl/WyYAu9ir0JhcptVwERmYGNVIoBRQfQClaSHjo\n0L1/b74aO5oe1rR8Yhh+yL1gWz9gRT0hyEr7paswkkhsmiY7+3m5rxsrfinlM+6+\nJ7dsSi3U0ofOBbZ4kvAeEz/Y3OaIOUbQraP312hQnTVQ3kp7HNi9GcLK9rq2mASu\nO0DxDHXdZMsRN1K4tOKRZDsKGAEfL2jKN7+ndvsDhb4mAQaVKM8iw+g5O4HDA8uB\nmwycaWhjilZWEyUyqvXE8tOMLS59sq6i1qrf8zIMWDOizebF/wnrQ42kzt5kQ0ZJ\nwCPOC3sxAoGBAO6KfWr6WsXD6phnjVXXi+1j3azRKJGQorwQ6K3bXmISdlahngas\nmBGBmI7jYTrPPeXAHUbARo/zLcbuGCf1sPipkAHYVC8f9aUbA205BREB15jNyXr3\nXzhR/ronbn0VeR9iRua2FZjVChz22fdz9MvRJiinP8agYIQ4LovDk3lzAoGBAO1E\nrZpOuv3TMQffPaPemWuvMYfZLgx2/AklgYqSoi683vid9HEEAdVzNWMRrOg0w5EH\nWMEMPwJTYvy3xIgcFmezk5RMHTX2J32JzDJ8Y/uGf1wMrdkt3LkPRfuGepEDDtBa\nrUSO/MeGXLu5p8QByUZkvTLJ4rJwF2HZBUehrm3pAoGBANg1+tveNCyRGbAuG/M0\nvgXbwO+FXWojWP1xrhT3gyMNbOm079FI20Ty3F6XRmfRtF7stRyN5udPGaz33jlJ\n/rBEsNybQiK8qyCNzZtQVYFG1C4SSI8GbO5Vk7cTSphhwDlsEKvJWuX+I36BWKts\nFPQwjI/ImIvmjdUKP1Y7XQ51AoGBALWa5Y3ASRvStCqkUlfFH4TuuWiTcM2VnN+b\nV4WrKnu/kKKWs+x09rpbzjcf5kptaGrvRp2sM+Yh0RhByCmt5fBF4OWXRJxy5lMO\nT78supJgpcbc5YvfsJvs9tHIYrPvtT0AyrI5B33od74wIhrCiz5YCQCAygVuCleY\ndpQXSp1RAoGBAKjasot7y/ErVxq7LIpGgoH+XTxjvMsj1JwlMeK0g3sjnun4g4oI\nPBtpER9QaSFi2OeYPklJ2g2yvFcVzj/pFk/n1Zd9pWnbU+JIXBYaHTjmktLeZHsb\nrTEKATo+Y1Alrhpr/z7gXXDfuKKXHkVRiper1YRAxELoLJB8r7LWeuIb\n-----END RSA PRIVATE KEY-----"

あとは Client 側を構築するなどして、Hubs Cloud の開発を行うことができるので、自由にカスタマイズしましょう。

Chef Habitat パッケージの作成

Reticulum のカスタマイズを終えたら、Hubs Cloud にデプロイするための Chef Habitat パッケージを作成します。
Chef Habitat CLI を利用してパッケージを作成し、Chef Habitat Builder にデプロイします。
Chef Habitat CLI をインストールするには環境に合わせた Chef Habitat CLI のインストール方法を参照してください。

まず、Chef Habitat Builder にサインインします。
アカウントの作成は、GitHub アカウントを使ったサインインページにアクセスして行います。

次に、hab setup コマンドで Builder の認証トークンを指定したり、デフォルトの Origin を指定したりします。

hab setup

以降の説明では例として、 Chef Habitat Builder Origin に kou029w、パッケージ名に kou029w/reticulum として説明します。

次のコマンドを実行し、Chef Habitat CLI を利用して Origin を作成します。

hab origin create kou029w

Reticulum リポジトリの habitat/plan.sh を書き換え、Chef Habitat Builder の Origin を指定します。

habitat/plan.sh
 pkg_name=reticulum
-pkg_origin=mozillareality
+pkg_origin=kou029w
 pkg_version="1.0.1"
 pkg_maintainer="Mozilla Mixed Reality <mixreality@mozilla.com>"
 pkg_upstream_url="http://github.com/mozilla/reticulum"

Origin を書き換えたらビルドします。

hab pkg build .

ビルドに成功すれば results ディレクトリ以下に .hart アーティファクトが生成されます。

Chef Habitat Builder へのアップロード

生成された .hart アーティファクトを指定して hab pkg upload コマンドを実行します。

hab pkg upload --channel stable results/kou029w-reticulum-1.0.1-20201029030558-x86_64-linux.hart

以上で、Chef Habitat Builder にビルドしたパッケージをアップロードすることができました。

Hubs Cloud の構築

公式ドキュメントに沿って Hubs Cloud AWS を構築します。

EC2 インスタンスで実行されている Reticulum サービスの置換

Hubs Cloud の構築完了後、それぞれの EC2 インスタンスに対して繰り返し下記の作業を実施します。

SSH でアクセス

管理コンソールから [Server Access] を選択すると、アクセスするための 2 要素認証のための情報が得られます。

ssh -i <key file> ubuntu@<host name>

インスタンス名は、AWS マネジメントコンソールから確認できます。

Chef Habitat パッケージのインストールと起動スクリプトの修正

以降の作業は SSH で EC2 インスタンスにアクセスした後の作業の実際のコマンドとその説明です[1]

# 稼働中のサービスを停止
sudo bio sup status | tail +2 | awk '$0=$1' | sudo xargs -n1 bio svc stop

# 作成した Chef Habitat パッケージのインストール
sudo bio pkg install kou029w/reticulum

# サービス mozillareality/reticulum を kou029w/reticulum に置換
sudo bio svc unload mozillareality/reticulum
sleep 10 # …アンロードするまで数秒待機
sudo bio svc load kou029w/reticulum

# 起動スクリプトの改変: kou029w/reticulum を読み込んで実行されるように変更
sudo perl -i -pe 's(\b(mozillareality/reticulum)\b)(kou029w/reticulum)g' /opt/polycosm/polycosm_boot.sh

# 起動スクリプトの改変: 起動スクリプト実行時のインスタンス名の変更に伴う証明書の更新対応
sudo perl -i -pe 's/^(ln -s)\b/ln -sf/' /opt/polycosm/polycosm_boot.sh

# 起動
sudo /opt/polycosm/polycosm_boot.sh aws aws

いかがでしたか

以上です。
この記事では Mozilla Hubs のバックエンドサーバー Reticulum のカスタマイズ手順を紹介しました。Hubs Cloud の全体構成や Reticulum の構成など触れなかった部分についてはまた別の機会にでも書きたいと思います。

脚注
  1. 常時起動 (お金がかかる…) で運用する想定で手順を書いており、いくつか Hubs Cloud のデフォルトの挙動 (CloudFormation テンプレート内に宣言されているものなど) によってインスタンスの内部が初期化されうるという問題があります。既知の問題を参照してください。 ↩︎

GitHubで編集を提案

Discussion