AmoungUs用BotのAutoMuteUsをGCPで無料でホストする

公開:2020/12/19
更新:2020/12/19
5 min読了の目安(約4600字TECH技術記事

AmongUs を Discord で VC を介してプレイする際に、ゲーム状況に応じて自動で参加メンバーの音声 ON/OFF を制御してくれるAutoMuteUsという超便利 Bot があります。
こちら、README にある通りパブリック公開されている DiscordBot をサーバーに招待することで簡単に利用できます。

が、AmongUs 自体が人気なためか、または日本からのアクセスになるためか、時間帯によって動作が非常に遅く遊びづらいことがあります。
それを解決するため、GCP 上に自分専用の AutoMuteUs Bot を無料でホスティングしたので、今回はその方法メモです。

事前の準備

  • AutoMuteUs の README に沿って、適切な権限を持った DiscordBot トークンを取得しておきます
    • ※Bot は 2 つ作成して、Token も 2 つあると便利です。後述しますが BOT を 2 つ設定することで音声 ON/OFF 操作が高速になります。
  • 上記の Bot を Discord サーバーに招待しておく
  • gcloud コマンドが使えること

1. GCP のインスタンスを構築する

GCP の仮想マシンサービスである ComputeEngine は、特定のリージョン、スペックだと無期限で無料になるため、それを利用します。

ポイント

  • 無料リージョンに立てる
    • 自分は us-west1 に設定して快適に遊べています。
  • マシンタイプは無料対象である シリーズ N1 の f1-micro を選びます。
  • HTTP トラフィックを許可する にチェックを入れます。

イメージ:
GCPインスタンスリージョン設定イメージ
GCPインスタンスファイアウォール設定イメージ

2. GCP インスタンス上でBotプログラムを設定する

Docker をインストールする

docker-compose を利用したいので、Docker 公式を参考にインストールします。(多分デフォルトだと debian なのでリンク先は debian 手順)

AutoMuteUs のソースコードを取得する

これを任意の場所におきます。自分は /opt/automuteus に配置しています。
(以降、本記事も /opt/automuteus に配置されている前提の記載となります。)

.env ファイルを作成する。

このあたりは AutoMuteUs の README にも記載されている内容なので困ったらそちらへ。

cp sample.env .env

で .env ファイルを作成し、以下のあたりを編集します。

.env
AUTOMUTEUS_TAG=6.5.5
GALACTUS_TAG=2.4.1

DISCORD_BOT_TOKEN=事前準備で作成したDiscordBotTokenその1
GALACTUS_HOST=http://GCPインスタンスの外部IPアドレス (※後で書き変えます)
GALACTUS_EXTERNAL_PORT=80

WORKER_BOT_TOKENS=事前準備で作成したDiscordBotTokenその2

AUTOMUTEUS_TAGGALACTUS_TAGAutoMuteUs の ReleasesGalactus の Tags から任意のもの(基本最新で良さそう)を指定します。(記載してるのは自分の設定です)
WORKER_BOT_TOKENSは空でも実行できますが、1つ以上あった方がBotの動作が軽快になります。

実行

設定がうまくできていれば、docker-compose up コマンドで起動できます。
起動すると、事前準備で作成した Bot を招待している Discord サーバーに、Bot がオンラインになります。(WORKER_BOT_TOKENSをセットしていれば合計 2 つの Bot)

あとは、 .au help でヘルプを見るなり、AutoMuteUs でググると出てくる他のわかりやすいサイトの使い方通りに利用できます。

3. Bot をサービス化する

ところで、このままだとインスタンスを起動し直すたびに ssh で接続して Bot を起動する必要があります。
また、GCP インスタンスの IP アドレスは起動のたびに変更される可能性があるので .env も修正の手間があります。

以下の手順で、サービス化を試みます。(もっといいやり方もあると思います!一例です。)

systemd でサービス化

単純に docker-compose コマンドの実行をサービス化するだけです。

GCP インスタンス上で、以下のような automuteus.service ファイルを作成して

/opt/automuteus/ に配置されてる前提

automuteus.service
[Unit]
Description=AutoMuteUs

[Service]
EnvironmentFile=/opt/automuteus/.env
ExecStart=/usr/local/bin/docker-compose -p automuteus -f /opt/automuteus/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -p automuteus -f /opt/automuteus/docker-compose.yml down
ExecReload=/usr/local/bin/docker-compose -p automuteus -f /opt/automuteus/docker-compose.yml restart
Restart=always

Type=simple

[Install]
WantedBy=multi-user.target

/etc/systemd/system ディレクトリにぶち込みます。

sudo cp automuteus.service /etc/systemd/system

あとはサービスを有効化してあげます。

sudo systemctl daemon-reload
sudo systemctl enable automuteus

# 確認

## start
sudo systemctl start automuteus

## stop
sudo systemctl stop automuteus

## restart
sudo systemctl restart automuteus

この時点でインスタンスを起動すると Bot が自動で起動するようになっていると思います。

インスタンス起動時に IP アドレスを .env に記入する

次に、起動時にインスタンス自身の外部 IP アドレスを取得して .env に書き出すようにします。
IP アドレスを固定してもいいのですが、そうすると多少料金が発生してしまうのでがんばります。

IP アドレスは GALACTUS_HOST に記載する必要があるので、これを置換するようなスクリプトを書きます。

startup-script.sh
#!/bin/bash

envfile=/opt/automuteus/.env

external_ip=$(curl -H "Metadata-Flavor: Google" 'http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip')
envfile_new_row="GALACTUS_HOST=http:\/\/${external_ip}"

sed -e "s/^GALACTUS_HOST=.*/${envfile_new_row}/" ${envfile} >.env.tmp && mv .env.tmp ${envfile}

# Restart after envfile replaced.
systemctl restart automuteus

スクリプトが書けたら、インスタンスの起動スクリプトとして設定してあげます。

↓ 3箇所変更が必要なので注意

gcloud compute instances add-metadata インスタンス名 \
    --metadata-from-file startup-script=./startup-script.sh \
    --project=GCPプロジェクト名 --zone=インスタンスのzone(us-west1-bとか)

おわり

全部の手順が完了できたら、インスタンスを停止→起動するたびに

  • Discord サーバーに 2 つの Bot が起動する
  • .au new コマンドを叩くと、インスタンスの外部 IP が正しく設定された「URL」が DM で送られてくる

という形になると思います。

一度設定すればあまり変更する必要はないと思うので、快適に AmongUs を楽しみましょう!