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





いいなと思ったら応援しよう!