AutoMuteUs最新版をWindowsPC1台でセルフホストする【AmongUs】

※2023/08/31追記
この記事を久しくほったらかしていた間にAutoMuteUsが8.1.8までバージョンアップしていた。
近日中に各種の確認をして情報を更新するのでご容赦ください……。



# はじめに
大人気ゲームAmongUsのゲーム進行をサポートしてくれるAutoMuteUs。公式サービスをそのまま利用しても十分便利なのだが、同時利用数の制限を受けたり、あるいはメンテナンスの影響で使えなかったりする。そこで、セルフホストすることによってそういった問題を気にせず使ってしまおうというのがセルフホストだ。

かつてはWindwos版が配信されていたので難なくセルフホストできていたのだが、最新のバージョンはDockerを使わないといけないので複雑。色々とやり方を調べていて、AutoMuteUsの6.15.1をセルフホストする方法までは見つけたのだが、それでは7.0以降のバージョンが使えなくて少し不便なので、それに合わせてこの記事を書いているという次第である。実は私はプログラミングのことなどほとんどわからない人間なので、先達の知見をお借りしながらまとめるくらいしかできないのだが。

私の備忘録のような感じでもあるので読みづらい部分もあるかと思うが、最後までお読みいただければ幸いである。

さて、見つけた記事が非常にわかりやすかったので、執筆時点のAutoMuteUs等のバージョンによって変わった部分をまとめる感じにしておく。

前提条件として、
①Windows 10以降(そのほか細かい条件あり)
②メモリ16GB以上(Dockerを起動した状態でAmongUsをプレイすると8GBでは足りない)
が求められる。①については、1.のリンク先を読んで詳細を確認していただければと思う。

必要な手順はおおまかにわけると次の3つ。
1. Docker for Windowsの導入
2. Discord Botの準備
3. AutoMuteUsの導入と運用

それでは、本題に入ろう。


# 1. Docker for Windowsの導入
これに関しては、先達の知恵をありがたくお借りすることにしたい。
環境構築とか全くわからない私でも難なくできたので、安心して作業してほしい。

https://qiita.com/yukuduri/items/370c966864901e1429ef

# 2. Discord Botの準備
次にDiscord Botアプリケーションを作成し、自分のサーバーに追加する。
これに関しても、先達の知恵をお借りすることにしたい。この記事を見て作業すれば概ね大丈夫だ。

https://qiita.com/yukuduri/items/d852d5e361f71109302d

※2022/07/24追記：
　ただし、botの権限については、最新の情報が[公式のドキュメント](https://github.com/automuteus/deploy/blob/main/BOT_README.md)に掲載されているのでこちらで確認してほしい。
　権限が不足していると正しく作動しないし、過剰だと万が一の時に面倒だ。

# 3. AutoMuteUsの運用と導入
先ほど紹介した記事は6.15.1時点のものだったが、7.0以降では環境の構成が一部変化しているので、そこを詳しく書いていく。

## 3.1 ファイルの準備
ここがお世話になっている記事からの最大の変更点。
バージョン7.0以降、動作環境が変わったからだ。

### 3.1.1 下準備
PC内のどこでもいいので、「AutoMuteUs」などわかりやすい名前のフォルダを作る。
後から任意の場所に移動させればいいので、この段階ではデスクトップでも問題ない。
次の作業で必要なので、ファイルの拡張子が表示されるように設定を変えておこう。

### 3.1.2 ファイル作成
AutoMuteUsを利用するために、2つのファイルを用意する必要がある。
テキストが打ち込めればいいので、メモ帳の利用が一番楽だと思う。もちろん、他のテキストエディタを使っても何も問題ない。

右クリック→メニューから「新規作成」→「テキスト ドキュメント」でテキストファイルを2つ作成。
それぞれ「`docker-compose.yml.txt`」と「`.env.txt`」というファイル名に変更する。
(この段階ではまだ`.txt`形式のまま。)

まずは`.env.txt`を開く。
以下を全て（「# Please refer to ~」から「POSTGRES_ADDR= ~」まで）コピーして貼り付ける。
```:.env
# Please refer to the latest stable versions of Galactus and AutoMuteUs when specifying these versions.
# Note, using versions that are not SemVer format (x.y.z) is NOT recommended, as these can be experimental or unsupported
AUTOMUTEUS_TAG=7.2.4
GALACTUS_TAG=3.1.0

# Automuteus: https://github.com/automuteus/automuteus/releases
# or https://hub.docker.com/r/automuteus/automuteus/tags
# Galactus: https://github.com/automuteus/galactus/releases
# or https://hub.docker.com/r/automuteus/galactus/tags

# change these, but see comment block down below about HOST/PORT
DISCORD_BOT_TOKEN=（※ここは本記事に従って書き換える！！！）
GALACTUS_HOST=http://localhost:8123
GALACTUS_EXTERNAL_PORT=8123
# GALACTUS_HOST can include the port or not. If you don't include the port,
# it will default to :80/:443 depending on http:// v https://
# **Make sure that GALACTUS_EXTERNAL_PORT matches the Port for the above host, UNLESS you use a reverse proxy/nginx!!!**
# Ex: if GALACTUS_HOST=http://localhost, then GALACTUS_EXTERNAL_PORT should be 80 (HTTP)
# Ex: if GALACTUS_HOST=https://localhost, then GALACTUS_EXTERNAL_PORT should be 443 (HTTPS)
# Ex: if GALACTUS_HOST=http://localhost:8123, then GALACTUS_EXTERNAL_PORT should be 8123
# If you use a reverse proxy, then GALACTUS_HOST should have the port of your reverse proxy, and it should proxy to the
# GALACTUS_EXTERNAL_PORT (ex 443 -> 8123)

# recommend changing these to something more secure
POSTGRES_USER=postgres
POSTGRES_PASS=putsomesecretpasswordhere

# Optional, leave alone by default
EMOJI_GUILD_ID=
BASE_MAP_URL=
# comma-separated
WORKER_BOT_TOKENS=
CAPTURE_TIMEOUT=
AUTOMUTEUS_LISTENING=
AUTOMUTEUS_GLOBAL_PREFIX=
# comma-separated
SLASH_COMMAND_GUILD_IDS=
STOP_GRACE_PERIOD=

# DO NOT change these unless you really know what you're doing
BROKER_PORT=8123
GALACTUS_PORT=5858
GALACTUS_REDIS_ADDR=redis:6379
AUTOMUTEUS_REDIS_ADDR=redis:6379
GALACTUS_ADDR=http://galactus:5858
POSTGRES_ADDR=postgres:5432
```
貼り付けたら、一旦上書き保存しておこう。

※2022/07/24追記：
　現時点ではAutoMuteUs 7.2.6までリリースされているが、このままでも問題ない。
　検証はしていないが、上記コードの`AUTOMUTEUS_TAG=`に続く数字をいじれば最新版が利用できるはず。
　記事タイトルと矛盾するようで申し訳ないが、今後は大幅アップデート等に合わせて記事を更新する予定。
　その際に改めてご確認いただければ幸いである。

そして、[Discord開発者ポータル](https://discord.com/developers/applications)を開く。
上記2.で作成したBotアプリケーションを選択し、「TOKEN」の下にある「`Copy`」をクリックする。
トークンがコピーされるので、先ほどの`.env.txt`の中の
```
DISCORD_BOT_TOKEN=（※ここは本記事に従って書き換える！！！）
```
の行を探し、「（※ここは本記事に従って書き換える！！！）」を削除してトークンを貼り付ける。
終わったら、上書き保存してファイルを閉じる。

次に、「`docker-compose.yml.txt`」を開く。
以下を全て（「version: "3"」から「 postgres-data:」まで）コピーして貼り付ける。
```
version: "3"

services:
  automuteus:
    # Either:
    # - Use a prebuilt image
    image: automuteus/automuteus:${AUTOMUTEUS_TAG:?err}
    # - Use an old prebuilt image (prior to 6.16.1)
    #image: denverquane/amongusdiscord:${AUTOMUTEUS_TAG:?err}
    # - Build image from local source
    #build: ../automuteus
    # - Build image from github directly
    #build: https://github.com/automuteus/automuteus.git

    restart: always
    ports:
      # 5000 is the default service port
      # Format is HostPort:ContainerPort
      - ${SERVICE_PORT:-5000}:5000
    environment:
      # These are required and will fail if not present
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}
      - HOST=${GALACTUS_HOST:?err}
      - POSTGRES_USER=${POSTGRES_USER:?err}
      - POSTGRES_PASS=${POSTGRES_PASS:?err}

      # These Variables are optional
      - EMOJI_GUILD_ID=${EMOJI_GUILD_ID:-}
      - CAPTURE_TIMEOUT=${CAPTURE_TIMEOUT:-}
      - AUTOMUTEUS_LISTENING=${AUTOMUTEUS_LISTENING:-}
      - AUTOMUTEUS_GLOBAL_PREFIX=${AUTOMUTEUS_GLOBAL_PREFIX:-}
      - BASE_MAP_URL=${BASE_MAP_URL:-}
      - SLASH_COMMAND_GUILD_IDS=${SLASH_COMMAND_GUILD_IDS:-}

      # Do **NOT** change this
      - REDIS_ADDR=${AUTOMUTEUS_REDIS_ADDR}
      - GALACTUS_ADDR=${GALACTUS_ADDR}
      - POSTGRES_ADDR=${POSTGRES_ADDR}
    stop_grace_period: ${STOP_GRACE_PERIOD:-2m}
    depends_on:
      - redis
      - galactus
      - postgres
    volumes:
      - "bot-logs:/app/logs"
  galactus:
    ports:
      # See sample.env for details, but in general, match the GALACTUS_EXTERNAL_PORT w/ the GALACTUS_HOST's port
      - ${GALACTUS_EXTERNAL_PORT:-8123}:${BROKER_PORT}
    image: automuteus/galactus:${GALACTUS_TAG:?err}
    restart: always
    environment:
      # This Variable is optional
      - WORKER_BOT_TOKENS=${WORKER_BOT_TOKENS:-}

      # Do **NOT** change these
      - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:?err}
      - BROKER_PORT=${BROKER_PORT}
      - REDIS_ADDR=${GALACTUS_REDIS_ADDR}
      - GALACTUS_PORT=${GALACTUS_PORT}
    depends_on:
      - redis

  redis:
    image: redis:alpine
    restart: always
    volumes:
      - "redis-data:/data"

  postgres:
    image: postgres:12-alpine
    restart: always
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASS}
    volumes:
      - "postgres-data:/var/lib/postgresql/data"

volumes:
  bot-logs:
  redis-data:
  postgres-data:
```
これは何も書き換える必要がない。保存して閉じてしまおう。

そして、それぞれのファイルの拡張子を変更する。
エクスプローラーで「`.env.txt`」を一度クリックで選択した状態で、右クリック→「名前の変更」で「`.txt`」を削除し「`.env`」だけにする。
「Enter」キーを押すと、以下のような警告メッセージが出るが、無視して「`はい`」を押す。

>拡張子を変更すると、ファイルが使えなくなる可能性があります。
変更しますか？

同様にして、「`docker-compose.yml.txt`」の`.txt`を削除し「`docker-compose.yml`」にする。
これで準備は終わり。

## 3.2 AutoMuteUsの導入
ここは以前と変わっていない。該当箇所に飛べるようにリンクを設定しておいたので、そちらを参照してほしい。

https://qiita.com/yukuduri/items/d852d5e361f71109302d#:~:text=%E5%B8%B3%E3%81%A7%E3%82%82%E5%A4%A7%E4%B8%88%E5%A4%AB%EF%BC%89%E3%80%82-,3.2.%20%E3%80%8CAutoMuteUs%E3%80%8D%E3%81%AE%E5%B0%8E%E5%85%A5,-%E3%81%93%E3%81%AE%E5%85%88%E3%81%AE%E6%89%8B%E9%A0%86

なお、次でもこの記事をそのまま参照する。

## 3.3 AutoMuteUsの運用

### 3.3.1~3.3.2
基本的には先ほどの記事と同じ。執筆時点ではAmongUsCapture(以下AUCaptureと表記)の最新版は4.2.0になっていた。
`.NET`のインストールが必要な場合には、下のリンクを押せばインストールできる。
[.NET Desktop Runtime 5.0.1](https://download.visualstudio.microsoft.com/download/pr/c6a74d6b-576c-4ab0-bf55-d46d45610730/f70d2252c9f452c2eb679b8041846466/windowsdesktop-runtime-5.0.1-win-x64.exe)

### 3.3.3 Discordとの連携～ゲーム開始
7.0以降では、プレフィックス形式のコマンドからスラッシュコマンドに変更されているので、それに伴ってこの節を書いておく。

①DockerからAutoMuteUsを起動したうえで、Discordを開く。
②AmongUsの際に使うDiscordサーバーのボイスチャットに入り、Botがオンライン表示されているテキストチャンネルを開く。
③テキストチャンネルの入力欄に`/`を入力すると様々なスラッシュコマンドが表示されるので、`/new`を**選択して**送信する
。
④すぐにAutoMuteUsがメッセージを送ってくるので、その中の「`aucapture://localhost:8123/`」で始まるリンクをクリックする。
⑤AUCaptureが起動するので、真ん中のボタンをクリックしてAmongUsを起動する。
⑥ゲームをプレイする全員がボイスチャンネルとゲームのロビーに入れば、基本的に自動で連携できる。
⑦連携できていない人がいれば、Discordで色を選んでもらうか、テキストチャンネルに「`/link`」を入力してプレイヤーとゲーム内カラーを指定し送信する。
⑧あとは通常通りゲームを開始すれば、各プレイヤーの生存・死亡に合わせてBotが自動でミュート・アンミュートしてくれる。
⑨プレイを終えてAutoMuteUsを閉じるには、スラッシュコマンド「`/end`」を送信する。その後、AmongUsやAUCaptureを手動で閉じる。DockerでAutoMuteUsも停止しておこう。

### 3.3.4 ミュート・アンミュート高速化bot
ゲーム開始直後やディスカッションの開始・終了時など、同時に多数のプレイヤのミュート・アンミュートが必要なシーンで、実際にミュート・アンミュートされるまでにプレイヤ間でラグが生じることがある。技術的な説明は省略するが、11人以上ゲームに参加しているとこのラグが生じやすくなるようである。
そこで、これまでの作業のついでにAutoMuteUsのミュート・アンミュートを補助するbotを作成し、導入する方法を紹介する。

まず、[Discord開発者ポータル](https://discord.com/developers/applications)で新しくbotを作成し、トークンを取得する。
[公式のドキュメント](https://github.com/automuteus/deploy/blob/main/BOT_README.md)の通り権限を付与してサーバーに招待する。
そして、AUCaptureの設定画面（画像参照）にトークンを入力すればOK。
![image-235.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670296/b663d75d-2fcf-26f9-b7c5-258796c76b0f.png)

AUCaptureを利用しているので、一度設定してしまえば、あとは毎回勝手に作動してくれる。
大人数で遊ぶ機会が多い人は、ぜひ導入してほしい。

# 4. お役立ち情報
本文中では紹介していない様々なお役立ち情報が載っているので、ぜひ参照してほしい。
特に、最初の記事にあるミュートの高速化は、大人数でのプレイ時に非常に役に立つはずだ。

[AutoMuteUsの便利な機能](https://blog.kurokobo.com/archives/3730)
[AutoMuteUs 7.0での変更点など](https://blog.kurokobo.com/archives/4233)
[スラッシュコマンドの公式ヘルプ](https://automute.us/commands)

# 5. おわりに
ほとんど先達の業績をパクっただけじゃないか！と多方面からお𠮟りを受けそうだが、普段はプログラミングなどと縁のないただの一般大学生が空き時間にやっただけなので大目に見ていただけると幸いである。

もし不備があれば、コメントでお知らせください。
可能な限り速やかに対処します。

本記事で何度も参照させていただいた記事の執筆者[@yukuduri](https://qiita.com/yukuduri)様に、厚く御礼申し上げます。

最後までお読みいただき、ありがとうございました。