AutoMuteUsをリバースプロキシでHTTPS化してセルフホスティングする

技術

TL;DR

  • 基本は設定ファイル書いて docker-compose up するだけ
  • WebSocketを使うのでリバースプロキシの設定の際には気を付けよう

緒言

背景

Among Usをやる際、 AutoMuteUs を使うと快適だ。というのも、Discordのボイスチャットを良い感じにミュートしてくれるのである。

しかし、公式がホストしているBotはレスポンスが悪い・混雑時間帯に使えないなどの問題がある。そのため、公開されているDockerイメージ・コードをもとにDockerないし自前で構築した環境上で実行するセルフホスティングという手法がとられている。

AutoMuteUsのセルフホスティングをネットで検索すると、以下のような知見が見受けられる。

  • 外部には公開せずローカル上で実行
  • HTTPで外部に公開して実行(!)
  • HTTPSが使えるように拡張された docker-compose.yml の利用

セキュリティ・ユーザビリティの観点から、HTTPS化した上でネット上に公開することが望ましい。その際、すでに設定されているnginxを利用し、新たにバーチャルホストを切って使いたいといった需要もあるだろう。しかし、この需要を満たす知見は現状公開されていないのである。

そこで、本記事ではリバースプロキシ(nginx)を用いて、HTTPS・バーチャルホストの設定をした上で、AutoMuteUsを実行する知見を共有したい。なお、この記事は公式ドキュメントや各自の経験に基づき設定することを前提とした上で、その補助資料としての利用されることを想定している。

目的とメリット

背景でも触れたが、本記事の目的は 「リバースプロキシ(nginx)を用いて、HTTPS・バーチャルホストの設定をした上で、AutoMuteUsを実行する知見の共有」 である。

これを行うことで、以下のようなメリットが得られる。

  • HTTPSなので安全
  • すでに設定されているnginxでワンストップに設定できるので管理ビリティが向上
  • バーチャルホストが設定できるので関係ないサブドメインのポートを汚染したりetcしたりしない

うーん、まあ、普通にnginx使ったらこうなるよ、という感じになる。

前提事項

この記事では、AutoMuteUsとそれに付帯するアプリケーションの以下のバージョンを利用するものとする。記事内での公式ドキュメントへのリンクも当該バージョンのコミットに紐づいたものを利用しているので注意されたい。

以下の知識や設定が準備済みであることも前提とする。

  • Linux
  • Docker および Docker Compose
  • リバースプロキシ
  • nginxでのHTTPS利用の知識一式と構築済みの環境
  • etc

要するに普通にオンプレでWebサーバを動かしてる人を想定している。

免責事項

本記事に記載された内容は、情報の提供のみを目的としています。 したがって、本記事を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。 これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。

設定方法

Docker上 で AutoMuteUsを実行する

とりあえず 公式ドキュメント を読みながら、

  1. Discord上でのBotの設定、Tokenの取得
  2. Docker Compose による実行

を一通り実行すればよい。

もし Docker 上で動かすのがためらわれるなら、 Docker Compose やその他のファイルをみながら redis や galactus を各自設定されたい。

ひとまず以下で、AutoMuteUsを走らせるときに参照すべきTipsを共有する。

Botの権限

公式ドキュメントには「全権限渡せ」とか書いてあるが、それはセキュリティ的によろしくない。

とりあえず以下の権限で動いた。 コードを読まずに感覚で設定したので、ゆるすぎかもしれないし、きつすぎかもしれない。

  • Manage Emojis
  • View Channels
  • Send Mesasges
  • Manage Messages
  • Embed Links
  • Attach Files
  • Read Mesasge History
  • Mention Everyone
  • Use External Emojis
  • Add Reaction
  • Mute Members
  • Deafen Members

あとはまあ、Public Botにはしない方がいい。 このアプリケーションは特定のサーバー上で動かすことを想定されているためである。

簡単のため、これらを含めたBotの招待用URLを以下に用意した。個々人のBotごとに変更して使ってほしい。

https://discord.com/oauth2/authorize?&client_id=APP_CLIENT_ID_HERE&scope=bot&permissions=1086843968

BotからDMを受け取る

.au new でBotからDMが発行されるが、これを受け取るためにはDiscord側で設定が必要。設定がうまく行ってない場合DMが届かず、AuteMuteUsのログを確認しにいくハメになる。

discord-enable-dm.png (63.0 kB)

「サーバーにいるメンバーからのダイレクトメッセージを許可する」 を有効にする。

なお、治安の悪いサーバーに所属しており、DMでスパムまがいのことに悩まされているユーザーは、この設定を変更したくないかもしれない。一応、特定のサーバーだけこの設定を有効にするといったこともできるようなので、必要に応じて設定してほしい。

.env の設定

ほとんどは sample.env そのままで動くのだが、設定が必要になる項目は以下。

AUTOMUTEUS_TAG=6.11.2
GALACTUS_TAG=2.4.1

DISCORD_BOT_TOKEN=xxxxx
GALACTUS_HOST=https://among.example.com
GALACTUS_EXTERNAL_PORT=8123

GALACTUS_HOST はグローバルから見えるホスト・ポートを指定し、 GALACTUS_EXTERNAL_PORT はローカルで何番のポートに galactus を立てるかを指定するためのもの。そのため、リバースプロキシを https://hoge.example.com:8080 、 galactus を :8888 で待ち受けさせる場合は以下のようにする。

GALACTUS_HOST=https://hoge.example.com:8080
GALACTUS_EXTERNAL_PORT=8888

nginxの設定をする

ここでは、HTTPSの証明書の取得、DNSの設定、iptablesその他の設定、nginxに関する設定は省略する。各自設定されたい。 それらの設定ができた前提で、 /etc/nginx/sites-available/ 下にバーチャルホスト向けの設定ファイルを書く体で、以下のようなファイルを用意する。証明書やポートなどは適宜変更して欲しい。

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 443 ssl http2;
    server_name among.example.com;

    ssl_certificate /etc/letsencrypt/xxxxx/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/xxxxx/privkey.pem;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://127.0.0.1:8123/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

見た目はわりと普通な感じだと思う。 ただし、 AutoMuteUs は WebSocket を喋るので、 Upgrade や Connection ヘッダーの設定を要する点には注意が必要だ。 これをしないと /socket.io/* へのリクエストに galactus が 404 を返してしまう。

ぼくは悪しきエンジニアなので適当にコピペして済ませてしまったが、真っ当な人は 公式ドキュメント を読んで欲しい。

あそぶ

これでリバースプロキシを介して AutoMuteUs を実行できたと思う。

あとは適当なバージョンの automuteus/amonguscapture をゲームを実行するWindows上に導入し、 .au new で遊びはじめればよい。一旦AutoMuteUsがまともに立てば、公式Bot同様、サーバー管理者以外でもゲームをホストできるはずだ。

automuteus/amonguscapture と AutoMuteUsの連携がうまくいかない場合

現行の automuteus/amonguscapture では、起動後に AutoMuteUs と連携しようとするとうまく接続できないバグがあるようだ。

それに類する挙動が見受けられた場合、 automuteus/amonguscapture を一旦消してから、リンクを踏んで勝手に起動するのを待つとちゃんと接続できるようになる。

おわりに

Enjoy!

グチ

galuctus 、 amonguscapture 、 AutoMuteUs のいずれも、特にログらしいログがない。 設定に際し役に立ったのは nginx のログとソースコードだった。 AutoMuteUs のトラブルシューティングには一定のしんどさがあるのである。 あとはなんか、WebSocketをnginxでプロキシしたことがなかったのでさらにしんどくしてしまった。

そんなこんなで、設定には3時間以上食った。 ほとほと nginx 力の低さ、トラブルシュートの経験値の低さを感じた。 長らくこうしたことを感じてはいるが、それは尽きることがない。 出来合いのものでこれなので、もっとたくさんのものを作り、使い、精進していかねばならないと感じる。