最近、巷では新型コロナウィルスが流行っています。コロナウィルスに夢中になった結果、満員電車からリモートワークへと「推し変」する人・組織が増えているんだとか。そこで今回は、リモートワークに欠かせないツールのひとつである「ビデオ会議」をNextcloudで構築してみましょう。
会議をすれば仕事した気になれる
日本人は通勤と同じくらい会議が大好きです[1]。その中でも「ビジネスパーソン」と呼ばれる種族は、一日のうち2時間ぐらいを通勤に、残りのすべてを会議に使っていると言っても過言ではないという意見もあります[2]。そんなに会議ばかりやっていると会議に参加する人の調整が難しくなりますし、議題もなくなってくるため、会議を開催するために会議を行うこともあるくらいです。
日本語では「会議」との言葉をよく用いますが、必ずしも「会って議する」とは限りません。議論はお飾りでただ「会うだけ」だったり、会うことすら目的ではなく「会議を開催した事実」のみが重要視されることもあるのです。ミーティングからブレインストーミング・ブリーフィング・カンファレンスに至るまで、すべてを内包する便利な言葉・仕組みとも言えるでしょう。
そんな日本の伝統的な商慣習が現在、危急存亡の時を迎えています。そう、新型コロナウィルス(SARS-CoV-2)の登場に伴うリモートワークの流行です。
これまでは仕事上で何か行き詰まったら、気分転換がてら「よし、会議だ!」と招集をかけられたのに対し、リモートワークだと安易には声かけできません[3]。招集するとなるとメールやチャットを使うことになるのですが、だったらそのまま議論の流れを記録しやすい文字媒体で議論をすればいいのでは、となるわけです[4]。
他にもリモートワークは「仕事した感」を得ることが難しいとも言われています。環境が普通の生活の延長になってしまうためか、ずるずると働き続けたり、適度な緊張感を維持できなかったりするそうです。そこで会議です。意味もなく会議を開いて、なんとなく議題について語り合えば、その日はもうバッチリ仕事をした気分になれます!
つまりリモートワークにこそ会議を行う仕組みが必要なのです。とりわけボイスチャットを導入すれば、「最近、人類とは会話してないなぁ」みたいなこともなくなります。さらにビデオチャットだと部屋の中の特定の方向がきれいに整頓されるという副次的効果もあります。
前置きが長くなってしまいましたが、そろそろリモートワークにおける会議の有効性について納得していただけたことでしょう。そこでビデオ会議に対応したFLOSSなツールとして、Nextcloud Talkの導入方法を説明します。
オンラインストレージサービスであるNextcloudのアプリ
Nextcloudはオンラインストレージを構築できるソフトウェアとして人気のあったownCloudから、開発者ごとフォークする形でスタートしたプロジェクトです。現在では単なるオンラインストレージだけでなく、ウェブブラウザベースのコラボレーションツールとしてさまざまな機能を備えるようになりました。さらに「アプリ」という形で、機能を拡張できます。アプリはNextcloud公式が作っていることもありますし、コミュニティで開発されているものも存在します。
今回紹介するNextcloud Talk(spreed)もそんな公式アプリのひとつです。具体的には次のようなことを実現できます。
- Nextcloud上の他のユーザーとのチャット
- WebRTCを利用した音声通話・ビデオ通話
- チャットや通話への特定のユーザーの呼び出し
- カメラの代わりにデスクトップ・特定のウィンドウ画面の共有
- ファイルの送受信
- グループ・ユーザーごとの権限の管理
- AndroidやiOS向けの専用アプリ
サーバーのスペックはそこまで高くなくて良いようです。たとえばRaspberry Pi 3+でも参加者4名でのチームミーティングが可能だったという報告もありました。
Nextcloudのアプリをインストールするためには、まずはNextcloudをインストールする必要があります。Nextcloudそのものは、PHPベースのWebアプリケーションとして実装されています。よって一般的なソフトウェアをサーバーにインストールするだけです。さらにUbuntuならsnapパッケージが用意されているので、次のようにコマンドひとつでインストールできます。
$ sudo snap install nextcloud
Nextcloudそのものの設定やsnapパッケージの使い方については、第476回「Nextcloudに学ぶsnapパッケージ入門」を参照してください。なお、通話を行うためにはNextcloudをHTTPS化しておく必要があります。
無事に設定できたらまずはNextcloudをインストールしたホストのアドレスにウェブブラウザーからアクセスします。
図1 初回アクセス時に管理者アカウントを作成する
図2 しばらく待つとファイル一覧の画面が表示される
ちなみにLXD内部にNextcloudをインストールしておくと、LXDコンテナごと別ホストに移動できるため、ホストのメンテナンスの際に便利です。この場合、次のいずれかの方法でホストの外からコンテナの中のNextcloudに通信できるようにする必要があります。
- ホスト上にNginxなどのリバースプロキシーを導入する
- 第533回のようにホスト上の特定のポートをLXDコンテナに転送する
- iptablesを用いてホスト上の特定のポートをLXDコンテナに転送する
もっとも簡単で汎用性が高いのは、リバースプロキシーの導入です。ホスト上に複数のLXDコンテナを用意して、ホストごとに転送先を変えるといった使い方も可能になります。
せっかくなのでLXD上へのインストール方法も紹介しておきます。LXDに興味のない方は次の節までスキップしてください。
まずはNextcloud用のコンテナを作っておきます。
$ lxc launch ubuntu:18.04 talk
コンテナが起動してネットワークに接続されたら、パッケージのアップデートとnextcloudのインストールを行いましょう。
$ lxc exec talk -- sh -c "apt update && apt full-upgrade -y"
$ lxc exec talk -- locale-gen ja_JP.UTF-8
$ lxc exec talk -- update-locale LANG=ja_JP.UTF-8
$ lxc exec talk -- timedatectl set-timezone Asia/Tokyo
$ lxc exec talk -- snap install nextcloud
$ lxc restart talk
次にNextcloud側のTrusted proxyの設定を行います。これはLXDのネットワーク設定・外から見えるホスト名に合わせて設定してください。
- 「
lxc network get lxdbr0 ipv4.address
」を実行したときに表示されるアドレス部分を「10.241.13.1」とする
- インターネットからアクセスするときのホスト名を「talk.example.com」とする
上記の条件だと、次のような設定になります。
$ cat <<'EOF' | lxc file push --uid 0 --gid 0 --mode 644 - talk/var/snap/nextcloud/current/nextcloud/config/proxy.config.php
<?php
$CONFIG = array (
"trusted_proxies" => ['10.241.13.1'],
"overwritehost" => "talk.example.com",
"overwriteprotocol" => "https",
"overwritewebroot" => "",
"overwritecondaddr" => "^10\.241\.",
);
EOF
$ lxc exec talk -- systemctl restart snap.nextcloud.apache.service
最後のコマンドでHTTPサーバーごとNextcloudを再起動しています。
次にリバースプロキシーの設定です。こちらはNginxを利用するなら、コンテナではなくホスト上にNginxをインストールし、たとえば次のように設定します。
$ cat <<'EOF' | sudo tee /etc/nginx/sites-available/talk
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name talk.example.com;
access_log /var/log/nginx/talk.example.com.access.log;
error_log /var/log/nginx/talk.example.com.error.log;
client_max_body_size 0;
underscores_in_headers on;
ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
location / {
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 64;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Front-End-Https on;
proxy_pass http://10.241.13.100;
}
}
EOF
$ sudo ln -s /etc/nginx/sites-available/talk /etc/nginx/sites-enabled/
$ sudo systemctl reload nginx.service
「10.241.13.100」はNextcloudをインストールしたLXDコンテナのIPアドレスです。NginxとLXDの間はHTTP/IPv4で通信しています。別途インターネットからNginxへの通信をHTTPS/IPv4/IPv6に対応しておけばおこの設定でも問題ないはずです。逆にNginxとLXDの間はHTTPS/IPv6のみにするという手もあります。また「ssl_certificate
」や「ssl_certificate_key
」はHTTPS用の証明書ファイルを指定します。
Nginxの設定は状況によって設定内容が大きく変わるため、各自でNextcloudやNginxのドキュメントを参照してください。
ここまでの設定によりホストのインターネット側のIPアドレスに紐付いたホスト名にアクセスすると、コンテナ上のNextcloudサービスにアクセスできるようになりました。
Nextcloud Talkのインストール
Nextcloudの管理者アカウントを作成したら、Nextcloudにログインし、次の手順でNextcloud Talkを追加しましょう。ここから先はウェブブラウザーだけで完結します。
図3 右上の設定メニューからアプリを選択
図4 ソーシャル・コミュニケーションやマルチメディアから「Talk」を選択
図5 もしくは検索ウィンドウから「talk」で検索
「ダウンロードして有効にする」を選択すると、管理者パスワードの入力画面が現れ、インストールが開始されます。
図6 左上に「通話」アイコンが現れる
図7 「トーク更新」を選択すると基本的な使い方が表示される
図8 左上の「新規チャット」で新規に会話を開始できる
インストールしたばかりなのでユーザーは自分自身とadminしか存在しませんが、とりあえずadminに語りかけてみましょう[5]。
実はNextcloud Talk 7までは日本語入力に問題が存在します。具体的には行頭に入力する最初の一文字が自動的に確定状態になってしまうというものです。「こんにちは(konnnitiha)」と入力した場合は「k」が確定状態になってしまうため「kおんにちは」と入力されてしまいます。ただし自動確定されるのは最初の一文字だけなので、適当な文字を入力してそこから普通に入力していけば回避は可能です。また、一度確定した文字列の後ろに入力する際も問題はないようです。
この問題はNextcloud Talk 8で解消されたとの報告があります。NextcloudのアプリにはNextcloud本体に対する「サポートバージョン」のようなものが存在するため、修正されたNextcloud Talk 8をインストールするには最新のNextcloud 18が必要です。しかしながら現時点でのsnap版の最新バージョンは17です。現在、Nextcloud 18のテスト中というステータスですので、当分は上記の回避策が必要になるでしょう。
図9 メッセージ入力ボックスの右にある「+」ボタンからファイル共有を行える
ファイル共有はあくまで「Nextcloud上のファイル」を共有する機能です。ローカルのファイルを共有したい場合は、一度Nextcloud上にアップロードする必要があります。もちろんNextcloudクライアントを用いて特定のディレクトリを同期していればそこから共有可能です。
図10 共有されたファイルは相手のNextcloud上にも保存(共有)される
ちなみにチャットシステムでは必須とも言える「Ctrl + Enterで投稿する」設定は、いまのところ存在しないようです。
Nextcloud Talkで通話する
ようやく本題のビデオ通話機能の話にたどり着きました。ところが、この手の機能を紹介する上で最大の問題は「テストする相手がいないこと」です。そこで今回は、どこのご家庭にも1台ずつ存在するであろう、ノートPCとスマートフォン間で通話をしてみます。
まずアカウントの作成です。現在のNextcloudは、管理者がアカウント名を決めて作成する方式になっています。Nextcloudの設定でメールサーバーを登録しておけば、パスワードは空にしつつメールでユーザーにパスワード登録依頼を送ることは可能ですが、アカウント名については事前に決める必要があります。よくあるサービスのようにアカウントも含めてユーザーに決めてもらいたい場合は、Registrationアプリなどを併用しましょう。
今回は新しいユーザーの情報をすべて管理者が入力する方法を紹介します。まずは画面右上の「ユーザー」を選択し、ページの左に表示される「新しいユーザー」を選択します。
図11 最低限必要なのはアカウント名とパスワードもしくはメールアドレス
次にAndroidもしくはiOSのアプリをスマートフォンにインストールしておきましょう。ちなみにこれらのアプリはNextcloud本体(つまりはオンラインストレージの同期アプリ)とは別になっている点は注意しておいてください。
あとは構築済みのNextcloudサーバーのURLと、先ほど作成したアカウント情報をアプリに入力するだけです。次にスマートフォンもしくはデスクトップ側のどちらでもかまわないので、チャットを開始しておきます。その後、「通話の開始」ボタンを押せば、通話を開始します。ちなみにスマートフォンとデスクトップどちらも「通話の開始」ボタンを押さないと通話開始にならないようです。
図12 デスクトップ・スマートフォンともにカメラ・オーディオへのアクセス権限を与える必要がある
通話中の画面下に表示されるボタンで消音やビデオの停止が可能です。海外のテレビ局との中継中に子供が部屋に入ってきてしまった場合に役に立つでしょう。
また、デスクトップ版に関しては同じところにあるディスプレイっぽいボタンを押すことで画面を共有できます。デスクトップ全体はもちろん、個別のウィンドウのみを共有することも可能です。
図13 画面共有状態をスマートフォンから見た例
上記画像では下部に共有画面、上部に相手のカメラ映像、右上にインカメラが表示されています[6]。
グループ通話の設定方法
グループで通話する場合、チャットそのものもグループチャットにする必要があります。
図14(左) 左上の「新規チャット」から任意の文字列を入力
図15(右) 右にある「参加者を追加」からメンバー追加
上記の手順でグループチャットルームを作成できますので、あとは通常の通話と同じように「通話を開始」ボタンを参加者が押すだけです。
図16 デスクトップ側から見た3者通話+画面共有の例
上記の画像だと全員がカメラを切っている状態です。カメラをオンにすると画面下のアイコン部分にそれぞれのカメラ映像が表示されます。上記の例ではスマートフォン側はLTE回線を利用しましたが、音声・映像ともに品質に特に問題はありませんでした。
画面右にある「リンクをコピー」を選択し、そのURLを他のユーザーと共有することで、そのユーザーをグループチャットに招待できます。Nextcloud上にアカウントを持っていなくても、共有されたURLから「ゲスト」としてチャットに参加可能です。また、「リンクをコピー」のさらに右にあるドロップダウンメニューからは、グループのパスワードの設定やゲストの参加を許可するかどうかを変更できます。ゲストの参加を不許可にした場合、リンクURLもコピーできなくなります。
同じ欄の「Enable lobby」は発言を「モデレータ」のみに限定するモードです。チャットルームの作成者は自動的にモデレータになっており、モデレータは他の参加者をモデレータに昇格・降格できます。特定の講師のみが発言できるセミナーモードのような用途を想定しているようです。
会議の開催でリモートワークにメリハリを
画面右上の「設定」から「通話」を選択すると、Nextcloud Talkそのものの設定を行えます。チャット上のコマンドの追加や各種権限の管理に加えて、STUN/TURN/シグナリングサーバーの設定も行えます。
STUN/TURNはいわゆる「NAT越え」のために使われる仕組みです。STUNでNATの有無を確認し、必要ならTURNを用いてNATを越えるための作業を行います。Nextcloud Talkで使われるWebRTCがNATを越えるために必要になる機能だと思っておけば良いでしょう。シグナリングサーバーは通話相手の状態を把握するための仕組みです。こちらはNextcloudでも対応できるのですが、負荷を考慮して大規模運用なら別のソフトウェアを使ったほうが良いようです。
本記事の執筆時はNextcloud自体をインターネット上のVPSサーバーに配置し、クライアントは家庭用のホームゲートウェイの内側ならびに一般的なキャリア(au)のスマートフォンネットワークに存在していました[7]。この場合はTURNの設定も不要でした。
それに対してNextcloudをNATの内側に配置する場合は、TURNサーバーを別途用意する必要があります。今回は説明を省きますが、よく使われるのはcoturnです。現在サポートしているUbuntuならどれでもパッケージが存在しますので、必要ならリポジトリからインストールして設定しましょう。
STUN/TURN/シグナリングサーバーはいずれも、より本格的な運用を行う際に考慮すべき項目です。とりあえずはここで設定できると覚えておけば良いでしょう。
リモートワークの流行に伴い、インターネットを活用したリモートミーティングの仕組みが脚光を浴びています。ビジネス用途だとSkypeやZoom、Googleハングアウトなどは有名ですし、他にもDiscordのようにゲーマーがメインで使うサービスもあります。チャットサービスソフトウェアであるMattermost自身にはビデオ通話機能はないものの、これらのサービスと連携する方法を提案しています。
これらの既存のサービスと比べるとNextcloud Talkは機能的にも認知度的にも一歩下がります。また、APIが足りないため他サービスとの連携ができないとかデスクトップクライアントがないなど、用途・目的によっては「まだまだ」なのかもしれません。それでもNextcloudには「ソースコードにアクセス可能」「ベンダーロックインされる可能性がない」「クラウド恐怖症の人を説得しやすい」という強みがあります。またNextcloudそのものがオンラインストレージとしてトップクラスの機能を備えている点も重要です。Nextcloudの「ついで」にTalkも導入してしまえば良いのですから。
会社の偉い人から「なんかリモートミーティングの仕組み用意しといて。ただしお金は出せない」とか言われてしまった不幸な皆様におかれましては、Nextcloud Talkの導入も考慮に入れてみてはいかがでしょうか。それはそれとして、人類とのコミュニケーションはHPもMPも大量に消費するため、会議を開催せずに済むならそれにこしたことはありません。