2022年6月10日金曜日

CentOS7.9.2009でDon't Starve Together Dedicated Serverを立ててみた

前振りです。

セールで66%引きの\503だったのでDon't Starve Togetherというゲームを買いました。
でも全然やる気が出ませんでした。

折角買ったのにつまらないな、と思っていると、なにやら独立してサーバが立てられるそうなので、CentOS7でやってみました。そういう手間が好きなので。
実際にやってみると、そこらへんに出回っている情報が古くて、そこかしこで齟齬が生じていることが分かりましたので、現時点(具体的な日付は当ブログの日時をご覧ください)での設置方法をメモしておく次第です。

今回使用したOS及びアプリのバージョンは以下の通りです。

Don't Starve Together Dedicated Serverのバージョン: 510124 LINUX 64-bit版
CentOSのバージョン: 7.9.2009

CentOSはGUIが無効にされています。

なお、現時点でも接続確認のみでゲームはプレイしていません。我ながら馬鹿です。

前準備その1 steamユーザを準備する

ValveさんとKLeiさんを絶対的に信用していない場合は、システムにsteamユーザを追加してください。

# useradd steam -d /home/steam

steamユーザになる
# su - steam

以下の記事は、上記を行っているものとして記述しております。

前準備その2 SteamCMD をインストールする

手順は以下の通りです。

1
2
3
4
5
6
7
$ mkdir /home/steam/steamcmd
$ cd /home/steam/steamcmd
$ wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz -O steamcmd_linux.tar.gz
 
$ tar zxvf steamcmd_linux.tar.gz
$ cd linux32
$ ./steamcmd

前準備その3 cluster_tokenを取得する

ゲームクライアントを起動してコンソールから次のコマンドを入力してください。ゲームクライアントはWindowsでも何でもいいです(Linuxである必要はありません)。

TheNet:GenerateClusterToken()

すると、Windows版クライアントの場合、 cluster_token.txt というファイルが以下のディレクトリに生成されます。

C:\Users\<ユーザ名>\Documents\Klei\DoNotStarveTogether\<数字の羅列>\

Documents\Klei\DoNotStarveTogetherの直下ではない点にご注意ください。

またはホームページから取得する方法もあるようですがやったことないので知りません。

以上で前準備は整いましたのでいよいよDedicatedサーバをインストールします。

手順その1 Don't Starve Together Dedicated Serverをインストールする

1
2
$ cd  /home/steam
$ ~/steamcmd/steamcmd.sh +@ShutdownOnFailedCommand 1 +@NoPromptForPassword 1 +force_install_dir dont_starve_together_dedicated_server +login anonymous +app_update 343050 validate +quit

※多くのサンプルでは上記の+loginよりも+force_install_dirを先に記述していますが、その場合は警告が出るので+force_install_dirを先に指定してください。

手順その2 一度起動してディレクトリのひな形を作成する

以下のスクリプトを~/start_servers.shとして保存、実行してください。
スクリプト中でリダイレクトしているテキストはサーバプロセスが出力しているファイルと同様なので不要なら/dev/nullに捨てて構わないでしょう。

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
35
36
37
38
39
40
41
42
43
44
#!/bin/env bash
pushd . >/dev/null
STEAMHOME=/home/steam
DSTSVRDIR=$STEAMHOME/dont_starve_together_dedicated_server
DSTSVR_BINDIR=$DSTSVRDIR/bin64
DSTSVR_LIBDIR=$DSTSVR_BINDIR/lib64
PERSISTENT_STORAGE_ROOT=$DSTSVRDIR
CONF_DIR=conf
CLUSTERNAME=Cluster_1
LOGDIR=$PERSISTENT_STORAGE_ROOT/$CONF_DIR/$CLUSTERNAME/log
SVRPROC=dontstarve_dedicated_server_nullrenderer_x64
SVRPROCOPT=" -persistent_storage_root $PERSISTENT_STORAGE_ROOT -conf_dir $CONF_DIR -cluster $CLUSTERNAME"
 
if [ ! -e $DSTSVRDIR ]; then
  echo サーバがインストールされていない
  exit 1
fi
if [ ! -e $LOGDIR ]; then
  mkdir -p $LOGDIR
fi
 
cd $DSTSVRDIR
# サーバプログラムの更新を確認する
# dedicated_server_mods_setup.luaが上書きされるのを防ぐため、+app_updateオプションに対してvalidateを指定していない
$STEAMHOME/steamcmd/steamcmd.sh \
  +@ShutdownOnFailedCommand 1 \
  +@NoPromptForPassword 1 \
  +force_install_dir $DSTSVRDIR \
  +login anonymous \
  +app_update 343050 \
  +quit > $LOGDIR/app_update.log 2>&1
 
if [ ! -e $DSTSVR_LIBDIR ]; then
  mkdir -p $DSTSVR_LIBDIR
fi
if [ ! -e $DSTSVR_LIBDIR/libcurl-gnutls.so.4 ]; then
  # CentOS7にはlibcurl-gnutls.so.4が用意されていないためlibcurl.so.4を使用する
  ln -s /usr/lib64/libcurl.so.4 $DSTSVR_LIBDIR/libcurl-gnutls.so.4
fi
 
# メインと洞窟サーバを起動する
nohup ./$SVRPROC $SVRPROCOPT -shard Master > $LOGDIR/Master.log 2>&1&
nohup ./$SVRPROC $SVRPROCOPT -shard Caves > $LOGDIR/Caves.log 2>&1&
popd >/dev/null

手順その3 Dedicatedサーバを停止する

10秒くらい経ったら、以下のコマンドで停止してください。

 killall dontstarve_dedicated_server_nullrenderer_x64

正確を期すなら、Master.logを監視して、cluster_tokenがないので起動できないというメッセージを確認してから停止してください。

この一行のコマンドをstop_servers.shとして保存しておくと便利と思います。

手順その4 生成されたひな形に肉付けする

以下のディレクトリが生成されていますので、それぞれのディレクトリに必要な設定を行います。

肉付けが必要なファイルの説明は次のURLが詳しいです。
https://steamcommunity.com/sharedfiles/filedetails/?id=635281092

  1. ~/dont_starve_together_dedicated_server/conf/Cluster_1
    このディレクトリには先ほど取得したcluster_token.txtを配置してください。
    また、cluster.iniを生成して配置してください。
    cluster.iniの内容は以下の通りです。
    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
    [GAMEPLAY]
    game_mode = endless
    max_players = 16
    pvp = false
    pause_when_empty = true
    vote_enabled = true
     
    [NETWORK]
    cluster_name = クライアントから見えるサーバー名を設定してください
    cluster_description = 何か夢とか希望とか書いてください
    cluster_intention = social
    autosaver_enabled = true
    offline_cluster = false
    lan_only_cluster = false
     
    [MISC]
    console_enabled = true
    ; サーバ用日本語modをインストールする予定なのでjapaneseと指定
    language_code = japanese
     
    [SHARD]
    shard_enabled = true
    bind_ip = 127.0.0.1
    master_ip = 127.0.0.1
    cluster_key = Cluster_1_tokuni_imi_ha_nai
  2. ~/dont_starve_together_dedicated_server/conf/Cluster_1/Master
    このディレクトリにはserver.iniというファイル名で以下の内容を記述してください。
    1
    2
    3
    4
    5
    6
    [ACCOUNT]
    encode_user_path = true
     
    [SHARD]
    is_master = true
    name = Master
  3. ~/dont_starve_together_dedicateCavesd_server/conf/Cluster_1/Caves
    このディレクトリにもserver.iniというファイル名で以下の内容を記述してください。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [ACCOUNT]
    encode_user_path = true
     
    [SHARD]
    is_master = false
    name = Caves
     
    [NETWORK]
    server_port = 10998

    また、 worldgenoverride.lua というファイル名で、中身が下記のファイルを作成してください。
    このファイルでDST_CAVEを指定して初めて洞窟とみなされますので、このファイルを忘れると森が二つあるサーバとなります。ただし、私はゲームとしては遊んだことがないので、それがどういう動作につながるのかまではわかりません。
    1
    2
    3
    4
    5
    6
    7
    return {
      override_enabled = true,
      preset = "DST_CAVE",
      overrides = {
        start_location = "default",
      },
    }
  4. MastarとCavesディレクトリの両方にmodoverrides.luaというファイル名で以下を記述してください。
    1
    2
    3
    return {
    ["workshop-1636779445"] = { enabled = true } -- 日本語化
    }
  5. ~/dont_starve_together_dedicated_server/mods
    このディレクトリには dedicated_server_mods_setup.lua というファイルがあるはずなので、以下の行を追記してください。ファイルがない場合は、どうせもともとコメントしかないファイルなので自分で作って構いません。
    なお、このファイルはSteamCMDで本サーバアプリをvalidateすると消されてしまいますのでそのあたりは別途コピーを保管しておくなりして料簡してください。
    1
    ServerModSetup("1636779445") --日本語化mod
  6. ここまでで設定はおおむね完了したので、~/start_servers.shでDedicatedサーバを起動してください。
    ゲームクライアントを起動し、オンラインにしてから clustar.iniで定義したcluster_name でサーバを検索すれば接続できる状態になっているはずです。
あとはsystemdで起動できるようにしたりファイアウォールやルータの設定(udp,10999)、logrotateの設定などを行えばおしまいです。

以上、だれの参考にもならない文章ですが、それでもここまでお読みいただいてありがとうございました。