はじめに

趣味でやっている Valheim というゲームをローカルからEC2に移行してみる。

↓これです。

環境

1
2
3
4
Windows 10 Professional
AWS
Docker Version: 20.10.17
Docker Compose version v2.4.1

サーバの構築

EC2インスタンスの作成

  1. AWS -> EC2からダッシュボードを開く。
  2. 左メニューバーの「インスタンス」を選択しインスタンス一覧を開く。
  3. 右上の「インスタンスを起動」をクリックする。
  4. インスタンスの設定を行う。 インスタンスの設定は下記の通り。
1
2
3
4
5
インスタンスタイプ: t3.medium (2vCPU, 4GBメモリ)
セキュリティグループ:
SSH 自分のIP
2456/UDP, 2457/UDP を 0.0.0.0/0 からアクセス可能にする。
ディスク: 8GB (移行するデータによっては変更したほうが良い。)
setting-ec2-instance
  1. 「インスタンスを起動」を押し、インスタンスを起動させる。

ElasticIPの付与

AWSの場合、このままだと停止→起動した際にIPアドレスが変わってしまうので、固定のグローバルIPアドレスをつけたい。
そのために、ElasticIPを付与する。

  1. 左メニューバーのネットワーク&セキュリティにある「Elastic IP」を選択する。
  2. ElasticIPのページにある、右上の「Elasitc IPアドレスを割り当てる」を選択する。
    attach-eip-1
  3. 一覧にElastic IPアドレスが出てくるので、選択した状態で右上の「アクション」→「Elastic IP アドレスの関連付け」を押す。
  4. 関連付けを行うページが出てくるので、インスタンスから先程起動したインスタンスを選択する。
    attach-eip-2
  5. 確認のために、左メニュー「インスタンス」を選択し一覧を開く。その後、一覧から先程起動したインスタンスを選択すると、パブリックIPv4アドレスが割当したEIPになっている。

ここまででサーバの構築は終了
この後は、サーバ内にSSHで入り、必要なパッケージを入れていく。

パッケージのインストール

Gitのインストール

1
$ sudo yum install -y git

Dockerのインストール

1
$ sudo yum install -y docker

Docker composeのインストール

1
2
3
$ sudo mkdir -p /usr/local/lib/docker/cli-plugins
$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
$ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

参考: https://matsuand.github.io/docs.docker.jp.onthefly/compose/install/

インストールできたかの確認

1
$ docker compose version

サービスの起動/自動起動設定

1
2
# Dockerサービスの起動
$ sudo systemctl start docker
1
2
# システム起動時にDockerサービスが起動するように設定
$ sudo systemctl enable docker

dockerグループの作成

1
2
3
$ sudo groupadd docker (ある場合は groupadd: group 'docker' already existsと出る。)
$ sudo usermod -a -G docker ec2-user
$ sudo chgrp docker /var/run/docker.sock

設定を反映する。

1
$ sudo systemctl restart docker

一回 ec2-user はログアウトし、再接続する。

UTC->JSTへの変更

1
2
3
4
$ sudo timedatectl set-timezone Asia/Tokyo

[ec2-user@ip-172-31-47-217 ~]$ date
Tue Mar 21 09:35:59 JST 2023

valheimサーバの構築

イメージ構築のための設定

リポジトリをクローンする

1
2
$ git clone https://github.com/katsuobushiFPGA/valheim-server-ec2.git
$ cd valheim-server-ec2/

クローン後、 README.md に従い、下記の手順を実施する。 .env.exampleをコピー

1
$ cp .env.example .env

.envの設定 DockerHub(https://hub.docker.com/r/lloesche/valheim-server)に記載されている「Environment Variables」を参考に設定する。 設定例は下記の通り。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SERVER_NAME=soloserver
SERVER_PASS=secret
SERVER_PUBLIC=false
WORLD_NAME=soloworld
TZ=Asia/Tokyo
BACKUPS_DIRECTORY=/backup
BACKUPS_MAX_COUNT=3

DATA_PATH=$HOME/valheim-server-ec2/data
CONFIG_PATH=$HOME/valheim-server-ec2/config

ローカルから移行する場合については、WORLD_NAME に ローカルで名前をつけているワールド名にすること。
今回自分のローカルでは、 soloworld と名前をつけているのでその名前にしている。

イメージのビルド

1
$ docker compose up -d

Started でコンテナが開始していればOK

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ docker compose up -d
[+] Building 12.0s (5/5) FINISHED                                                                                                
 => [internal] load build definition from Dockerfile                                                                             
 => => transferring dockerfile: 128B                                                                                             
 => [internal] load .dockerignore                                                                                                
 => => transferring context: 2B                                                                                                  
 => [internal] load metadata for docker.io/lloesche/valheim-server:latest                                                        
 => [1/1] FROM docker.io/lloesche/valheim-server:latest@sha256:fd71df67215a3fceaa98d298074dbf7865a3cbbacb9e1bcc1b365f314d15e2ee  
 => => resolve docker.io/lloesche/valheim-server:latest@sha256:fd71df67215a3fceaa98d298074dbf7865a3cbbacb9e1bcc1b365f314d15e2ee  
 => => sha256:fd71df67215a3fceaa98d298074dbf7865a3cbbacb9e1bcc1b365f314d15e2ee 856B / 856B                                       
 => => sha256:3f9582a2cbe7197f39185419c0ced2c986389f8fc6aa805e1f5c090eea6511e0 31.41MB / 31.41MB                                 
 => => sha256:c6468f85b03ef97c1dd2dcf1ca34d49a0c756dce200eaaf747e65e50da36af5f 2.22MB / 2.22MB                                   
 => => sha256:61c35feee7040e130ff8c4e9d6863efe66d751e3fc51e3a74ee1802ae135de53 1.63kB / 1.63kB                                   
 => => sha256:2436c0d17130c9326f0231078da9d16c80e43fe29302794af50d4a8196be9592 7.22kB / 7.22kB                                   
 => => sha256:870c408e40e7786466785d2f9d121646dc42c6ca043688ff93039f7cebcb62d8 87.55kB / 87.55kB                                 
 => => sha256:83e8299376ba94add8c34d3e8d18691ed2231ba4373ed09d4b61fe26ee895bce 5.12MB / 5.12MB                                   
 => => extracting sha256:3f9582a2cbe7197f39185419c0ced2c986389f8fc6aa805e1f5c090eea6511e0                                        
 => => sha256:8d243f5f819e83964a7ec9fe65a14fb8656e7e243b94e38fc31a23ce9b70a74a 24.98MB / 24.98MB                                 
 => => sha256:28e2b74a91a74fbdf12d92172337fd5b52c8350f813a82db6003866f79a5ddea 596B / 596B                                       
 => => sha256:94e16f233544db964f30b2de9e00beec52e7966ab379589b2f07d55fdef7ccbf 203.43MB / 203.43MB                               
 => => extracting sha256:c6468f85b03ef97c1dd2dcf1ca34d49a0c756dce200eaaf747e65e50da36af5f                                        
 => => extracting sha256:870c408e40e7786466785d2f9d121646dc42c6ca043688ff93039f7cebcb62d8                                        
 => => extracting sha256:83e8299376ba94add8c34d3e8d18691ed2231ba4373ed09d4b61fe26ee895bce                                        
 => => extracting sha256:8d243f5f819e83964a7ec9fe65a14fb8656e7e243b94e38fc31a23ce9b70a74a                                        
 => => extracting sha256:28e2b74a91a74fbdf12d92172337fd5b52c8350f813a82db6003866f79a5ddea                                        
 => => extracting sha256:94e16f233544db964f30b2de9e00beec52e7966ab379589b2f07d55fdef7ccbf                                        
 => exporting to image                                                                                                           
 => => exporting layers                                                                                                          
 => => writing image sha256:e5049e0e92b2ff2e1553aae669ad262f48ecc424276d41ef6a3f7c307b08ee0a                                     
 => => naming to docker.io/library/valheim-server-ec2_valheim                                                                    
[+] Running 2/2
 ⠿ Network valheim-server-ec2_default      Created                                                                               
 ⠿ Container valheim-server-ec2-valheim-1  Started                                                                               
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ 

プロセスを確認

1
$ docker compose ps

↓下記のように、2456, 2457のUDPポートが開放されていればOK

1
2
3
4
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ docker compose ps
NAME                           COMMAND                  SERVICE             STATUS              PORTS
valheim-server-ec2-valheim-1   "/usr/local/sbin/boo…"   valheim             running             0.0.0.0:2456-2457->2456-2457/udp, :::2456-2457->2456-2457/udp
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ 

既にアクセスできる状態ですが…一旦止めます。

コンテナを停止し、移行データを入れる。

コンテナを停止。

1
$ docker compose down

移行データについては、 .db, .fwl を入れる必要があるので2ファイルを用意しておく。
C:\Program Files (x86)\Steam\userdata\[スチームID]\[ゲームID]\remote\worlds にあるとのこと
db_fwl_file

まずは、移行データをSFTPで転送し、 /home/ec2-user配下においておく。

こんな感じ↓ db_fwl_file-2

移行データをサーバに入れる。
.envCONFIG_PATHの場所に、ワールドデータが存在するのでそこにデータを移動する。
今回、 CONFIG_PATH=$HOME/valheim-server-ec2/config となっているので確認する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ ll $HOME/valheim-server-ec2/config/

[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ ll $HOME/valheim-server-ec2/config
total 16
-rw-r--r-- 1 root root  39 Mar 21 00:23 adminlist.txt
-rw-r--r-- 1 root root  40 Mar 21 00:23 bannedlist.txt
-rw-r--r-- 1 root root  42 Mar 21 00:23 permittedlist.txt
-rw-r--r-- 1 root root 270 Mar 21 00:25 prefs
drwxr-xr-x 2 root root 120 Mar 21 00:25 worlds_local

こんな感じになっているが、ワールドデータはないので、worlds_localを見てみる。

$ ll $HOME/valheim-server-ec2/config/worlds_local
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ ll $HOME/valheim-server-ec2/config/worlds_local
total 300
-rw-r--r-- 1 root root     45 Mar 21 00:23 soloworld_backup_auto-20230321092348.fwl
-rw-r--r-- 1 root root 293013 Mar 21 00:25 soloworld.db
-rw-r--r-- 1 root root     45 Mar 21 00:25 soloworld.fwl
-rw-r--r-- 1 root root     45 Mar 21 00:23 soloworld.fwl.old

これですね。

データのコピー

1
2
$ cd ~
$ sudo cp soloworld* $HOME/valheim-server-ec2/config/worlds_local

これでOKです。

再度起動して確認をする。

1
2
cd ~/valheim-server-ec2/
docker compose up -d

※ちなみにメモリはこんな感じ

1
2
3
4
5
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3862         218        1119           0        2524        3425
Swap:             0           0           0
[ec2-user@ip-172-31-47-217 valheim-server-ec2]$ 

起動の確認

ValheimをSteamから起動する。
キャラクターを選んで…IPアドレスとポートを入力する…! valheim-login

パスワード入力がきたぞ…!
valheim-login-2

無事ログインできましたと…
今回は新キャラで入っているので、地図情報無いのと祭壇から始まっているが、エイクスュルが倒せているので移行できている!
valheim-login-3

というわけで移行完了です!

おまけ: 料金について

https://calculator.aws/ で計算できる。

t3.medium の場合、どうなるか cost
毎月 39.71USD !!なかなかっすね。
別でも運用するとかであれば Savings Planで割安になるけどそうでもないからな~。
平日 18~28時+土日祝日起動とかだとどうなるのか気になるところ。 10 * 5 + 24 * 2 (98) / 24 * 7 (168) 位の割合? 58.3%くらい。
なので、 上記の運用であれば 23USD くらいにはなるのか。それにしてもまあ高いな。
個人の趣味でやるにはまあまあ出費になりそう。

おわりに

ゲームのサーバって Minecraft 以来建てたことなかったけど、最近は Docker で環境汚さずにできるから本当に良いよね。
特に VPSとかだと環境汚したくないので、(AWSなどと違って気軽にインスタンス削除みたいなことができないから)かなり使えると思う。