UE5のdedicated serverをdockerで動かす~リバプロを添えて


2024/12/10

この記事はUnreal Engine (UE) Advent Calendar 2024 10日目の記事です。

初めに

この記事ではサーバーの実際の処理やLinuxへの書き出し、及びエンジンのソースからのビルドについては最低限しか触れません。ここはできる前提で行きます。
正し、UE5.4及び5.5ではネットワークチェックサムが一致が一致しないエラーによりdedicated serverが機能しないので、今回はUE5.3.2を使用しています。詳しくは記事をご覧ください。
頑張れば修正できるらしいです。

環境

clinet : Windows11
server : Ubuntu Server 24.04 LTS (on Proxmox VE)

UE5.3.2
ThirdPerson Templateを使用

BPのセットアップ

BP_ThirdPersonCharacterでローカル環境にいる場合にUIを出すようにします

最低限のUIだけ作ります。

書き出し

サーバーのデフォルトマップで任意のレベルを選択しておいてください。
その後Linux serverとWindows clientに向けて書きだします。

dockerfileの作成

先にDocker Desktopをインストールしてください。その後

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y \
    build-essential \
    git \
    python3 \
    python3-pip \
    curl \
    wget \
    libssl-dev \
    libffi-dev \
    libsqlite3-dev \
    zlib1g-dev \
    xdg-user-dirs \
    && rm -rf /var/lib/apt/lists/*

RUN useradd -m gameuser
WORKDIR /game

COPY Engine/ /game/Engine/
COPY QiitaDemo/ /game/QiitaDemo/
COPY QiitaDemo.sh /game/
RUN mkdir -p /game/QiitaDemo && \
    touch /game/QiitaDemo/QiitaDemo.uproject && \
    chown -R gameuser:gameuser /game && \
    chmod +x /game/QiitaDemo.sh

USER gameuser
EXPOSE 7777/udp
CMD ["./QiitaDemo.sh"]

こんな感じのファイルを作成します。(インターネットの情報を元に、何度もエラーを修正して結果これで動いたので、これが正しいかの保証はできません。)

その後dockerfileがある階層で、

docker build -t ue5-server .

を実行します。

多分10分位かかります。

完了したら

docker run -p 7777:7777/udp ue5-server

で起動します。

Docker Desktopで起動しているのも確認できます。

接続

ローカル環境で接続ができるのを確認しました。

サーバーへ乗せる

まずイメージファイルを書きだします

docker save ue5-server > ue5-server.tar

次に適当なサーバーにsshします。今回はubuntu24.04のサーバーに載せます。
scpコマンドで送るなりファイルサーバー経由で送るなりでどうにかしてイメージを転送します

mizuame@mizuame:~/unreal$ ls
ue5-server.tar

送れました。

docker load < ue5-server.tar
mizuame@mizuame:~/unreal$ docker load < ue5-server.tar
2573e0d81582: Loading layer  29.54MB/29.54MB
14d452bc0e99: Loading layer  140.5MB/140.5MB
18c399aafd06: Loading layer  4.333kB/4.333kB
35e12b31d72b: Loading layer      94B/94B
5305b85d8c6f: Loading layer  762.4MB/762.4MB
8556ee88e44d: Loading layer  14.02MB/14.02MB
5b26d4c2733c: Loading layer     307B/307B
4e1436c95e0e: Loading layer  776.4MB/776.4MB

ロードします。

できたら

docker run -p 7777:7777/udp ue5-server

起動します。

UDP Reverse Proxyを張る

ゲームサーバーとは基本UDPで通信すると思いますが、これのProxyをしてくれるサービスはなかなかりません。例えばCloudflare TunnelであればTCPの転送はやってくれるのですがUDPはできません。
こうなるとVPSを借りてWireGuard等でVPNを張り、Port Forwardingをするのが有力に思えます。
しかし探したところ、Localtonetというサービスがあり、これならUDPの転送もしてくれるみたいです。今回はこれを使用しました。
ほとんど使用感はCloudflaredと同じでした。
(無課金でも使用でき、毎月1GBの転送まで無料でそれを超えると止まるらしいです。詳しくは公式サイトを見てください。)

Localtonetのセットアップ

UDPを選択し、サーバーをTokyo,Portを7777にします。

wget https://localtonet.com/download/localtonet-linux-x64.zip
sudo apt install unzip
unzip localtonet-linux-x64.zip
chmod 777 localtonet
./localtonet

最初にTokenを聞かれるので、WebのMy Tokensからデフォルトのやつを張り付けます。

接続出来たらConnectedになっていると思います。
もうこれでUDP Reverse Proxyをしてくれている状態なので、接続してみましょう。
先ほどのトンネル作成画面にURL及びPortが出ていると思うので、それをコピーします。

接続

接続を確認できました。

配布

果たして需要があるのか謎ですが、コンテナイメージとクライアントを配布します。Windows10,11+DockerDesktop環境があれば動かせると思います。

Windowsクライアント
Dockerイメージ

まとめ

今回は実際にインターネット経由でdedicated serverに接続できるのを確認しました。実際の運用時はk8sの上で動かすことになると思いますが、オンプレでサーバーを動かせれば大きなコストカットになるため、有力な選択肢になると思います。

ホーム