AmongUs カスタムサーバーの建て方
2024/01/06 更新
0.背景
もともと結構作るの簡単だったカスタムサーバーが、どんどん面倒くさくなったので、わかる人にはわかるレベルで記載することにした。
非常に不親切な記事だと思うが、DDNSとかDockerとか説明しだすと記事一つでは足りないので、頑張って補完してほしい。
1.どこに建てるか
AmongUsはPingの値が残念だとゲーム性が失われるゲームなので、個人的にはGCPやOCI等のクラウド上が最上だと思っている。
自宅のマシンで建てる人も100msを超えるようであれば、クラウド無料枠で実行したほうが、誰も不幸にならない。
2.どう動かすか
Nativeで動かすか、Dockerで動かすか、この記事ではDockerを選択する。
ベースマシンへのDocker Installについては腐るほど記事がありそうなので、最新のDockerのInstall方法はそちらに譲ることにする。
また、Portainerを利用するとGUIで楽なので、そちらも推奨したい。
ベースマシン:クラウドだとVMだったり、自宅だと物理マシンだったり、ようはサーバーを動かしたいマシンのこと
3.公開IPアドレスとDDNS
自宅にせよクラウドにせよ、接続先のIPを提供しないといけない。
有料オプションで固定IPを持っている人はそのIPをそのまま使えばよいが、無料オプションや、自宅で使用しているプロバイダによってはIPが変わってしまうことは日常茶飯事のこと。
そのため、適当な無料のDDNSと、DDNSクライアントを利用して公開用のFQDNをベースマシンにセットアップすることが、今後も困らない一番楽な方法です。
Dockerを動かしているWindows/LinuxであればDDNSクライアントや無料DDNSの設定方法は腐るほど記事がありそうなので、DDNSとDDNSクライアントの設定方法はそちらに譲ることにする。
4.ポートの開放
クラウドのFirewall、または自宅のルーター等ではPort転送を用いて、外からのアクセスをベースマシンへ通す必要がある。
ポート番号 tcp/udp 22023 を通せば十分。
設定方法は環境によって異なるので、頑張って検索してほしい。
5.Dockerにカスタムサーバーを建てる
AmongUsのカスタムサーバーは、2つあったが、現状1つしか選択肢がない。
Impostorサーバーを利用する方法でこのnoteは記載する。
https://github.com/Impostor/Impostor
version: "3.9"
services:
impostor:
image: aeonlucid/impostor:nightly
container_name: impostor
restart: always
ports:
- 22023:22023/udp
- 22023:22023/tcp
entrypoint:
sh -c "./Impostor.Server"
environment:
- DOTNET_RUNNING_IN_CONTAINER=true
- DOTNET_VERSION=7.0.1
- IMPOSTOR_AntiCheat__BanIpFromGame=false
- IMPOSTOR_AntiCheat__Enabled=false
- IMPOSTOR_Compatibility__AllowFutureGameVersions=true
- IMPOSTOR_Server__PublicIp=<*FQDNorIP*>
- IMPOSTOR_Server__PublicPort=22023
- IMPOSTOR_Server__ListenIp=0.0.0.0
- IMPOSTOR_Server__ListenPort=22023
- IMPOSTOR_PluginLoader__LibraryPaths="/usr/share/dotnet/shared/Microsoft.AspNetCore.App/7.0.1"
- IMPOSTOR_HTTP_ListenIp=<*FQDNorIP*>
- IMPOSTOR_HTTP_ListenPort=22023
- IMPOSTOR_HTTP_UseHttps=false
- DOTNET_RUNNING_IN_CONTAINER=true
note記載時点では、nightlyビルドが最新なのでnightlyで記載している。うまくいかなかったら、latestに書き換えて試してほしい。
ベースマシンで適当な名前のフォルダを作って、そこにcdで移動する
上記のコードをベースマシンに" docker-compose.yml "という名前のテキストにしてコピペする。
次に、<*FQDNorIP*>のところに、DDNSで取得したFQDN(URL)をいれて保存する。(2か所あるので気を付けて)
sudo docker compose up を入力すれば、しばらくするとサーバーが立ち上がる。
sudo docker compose down を入力すれば、サーバーは動作しなくなる。
Portainerを使っている場合は、Stackから上記コードをコピペすれば楽。
6.接続を確認する
最後に、AmongUsから接続確認を行う。
Modであればカスタムを選択し、IPのところにFQDNを、ポートを22000にすれば接続できるようになる。
※一時期は22000でないと接続できなかったが、また22023で接続できるようになった
また、AmongUsのメニューで選択できるようにするには、以下のScriptのOptionにサーバーを追加する項目があるので、それを利用するか、自力でAmongUsのRegion Infoを書き換える必要がある。
今のままではAndroid/iOSからは接続できない(HTTPSにしないといけないため)のでPCからの接続に限られることに注意されたし
RegionInfoの書き換えには、以下サイトを使う方法もあります。
7.Optional SSL化したい人。
自分のドメインを持っててproxyでHTTPS化したい、という人向け。
SSL化はさらに説明が面倒なので、参考となるコードと注意点を記載します。
このコードではLet'sEncryptで証明書を取得、自動更新して、nginx-proxyで受け渡す方式。watchtowerはコンテナの生死を判断してるらしい。
ちなみに自分はGCPとOCIでGoogle DomainのDDNSを利用して運用している。
注意点:Firewallに443と80を追加で開ける必要がある
version: "3.9"
services:
watchtower:
image: containrrr/watchtower:latest
container_name: nginx-watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 30 --cleanup
proxy:
image: nginxproxy/nginx-proxy:latest
container_name: nginx-proxy
restart: always
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- conf:/etc/nginx/conf.d
- dhparam:/etc/nginx/dhparam
labels:
- com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
environment:
- ENABLE_IPV6=false
- HSTS=on
networks:
- egress
letsencrypt:
image: nginxproxy/acme-companion:latest
container_name: nginx-letsencrypt
restart: always
depends_on:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- acme:/etc/acme.sh
- certs:/etc/nginx/certs
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- conf:/etc/nginx/conf.d
- dhparam:/etc/nginx/dhparam
environment:
- DEFAULT_EMAIL=<*EMAIL*>
- NGINX_PROXY_CONTAINER=nginx-proxy
impostor:
image: aeonlucid/impostor:nightly
container_name: impostor
restart: always
ports:
- 22023:22023/udp
- 22023:22023/tcp
entrypoint:
sh -c "./Impostor.Server"
environment:
- DOTNET_RUNNING_IN_CONTAINER=true
- DOTNET_VERSION=7.0.1
- IMPOSTOR_AntiCheat__BanIpFromGame=false
- IMPOSTOR_AntiCheat__Enabled=false
- IMPOSTOR_Compatibility__AllowFutureGameVersions=true
- IMPOSTOR_Server__PublicIp=<*FQDN*>
- IMPOSTOR_Server__PublicPort=22023
- IMPOSTOR_Server__ListenIp=0.0.0.0
- IMPOSTOR_Server__ListenPort=22023
- IMPOSTOR_PluginLoader__LibraryPaths="/usr/share/dotnet/shared/Microsoft.AspNetCore.App/7.0.1"
- IMPOSTOR_HTTP_ListenIp=<*FQDN*>
- IMPOSTOR_HTTP_ListenPort=22023
- IMPOSTOR_HTTP_UseHttps=false
- VIRTUAL_HOST=<*FQDN*>
- VIRTUAL_PORT=22023
- LETSENCRYPT_HOST=<*FQDN*>
- DOTNET_RUNNING_IN_CONTAINER=true
networks:
- egress
volumes:
vhost:
html:
acme:
conf:
certs:
dhparam:
networks:
egress:
8.Optional Impostorの他のプラグインをDockerで使いたい人
Volumesを指定し、そこにPluginを配置することでPluginを読み込ませることが可能
matchmaker 用のimpostor.http pluginは本体にマージされたので、もう必要ない
■Boot.codes
ロビーのコードを任意のリストから選ばれるようにするプラグイン
https://github.com/miniduikboot/Boot.Codes
■Reactor plugin
Modで接続するのに利用される
https://github.com/NuclearPowered/Reactor.Impostor
version: "3.9"
services:
impostor:
image: aeonlucid/impostor:nightly
container_name: impostor
restart: always
ports:
- 22023:22023/udp
- 22023:22023/tcp
volumes:
- bootcode:/app/Boot.Codes
- plugins:/app/plugins
entrypoint:
./Impostor.Server
environment:
- DOTNET_RUNNING_IN_CONTAINER=true
- DOTNET_VERSION=7.0.1
- IMPOSTOR_AntiCheat__BanIpFromGame=false
- IMPOSTOR_AntiCheat__Enabled=false
- IMPOSTOR_Compatibility__AllowFutureGameVersions=true
- IMPOSTOR_Compatibility__AllowVersionMixing=false
- IMPOSTOR_Serilog__MinimumLevel=Verbose
- IMPOSTOR_Server__PublicIp=<*FQDN*>
- IMPOSTOR_Server__PublicPort=22023
- IMPOSTOR_Server__ListenIp=0.0.0.0
- IMPOSTOR_Server__ListenPort=22023
- IMPOSTOR_PluginLoader__LibraryPaths="/usr/share/dotnet/shared/Microsoft.AspNetCore.App/7.0.1"
- IMPOSTOR_HTTP_HttpServer__ListenIp=0.0.0.0
- IMPOSTOR_HTTP_HttpServer__ListenPort=22023
- IMPOSTOR_HTTP_HttpServer__UseHttps=false
- VIRTUAL_HOST=imposter.kenko.land
- VIRTUAL_PORT=22023
- LETSENCRYPT_HOST=<*FQDN*>
- DOTNET_RUNNING_IN_CONTAINER=true
networks:
- egress
volumes:
bootcode:
plugins:
networks:
egress:
external: true