つよつよミニPCを作ってサーバー機奴隷にしてみた

## はじめに
最初に注意書きですが、今回の記事はビビる程テキトーです。
~~流石に年明けてから2ヶ月弱記事書いてないのはマズいよな…と思って殴り書いただけ~~

最近とあるPCゲームにドハマりしています。
そのゲームは何かというと[こちら](https://store.steampowered.com/app/1623730/Palworld/?l=japanese)。

https://store.steampowered.com/app/1623730/Palworld/?l=japanese

Qiitaを見ると今や[マルチサーバー構築系の記事](https://qiita.com/naoya-i/items/e907a6b949e5da36d532)がわんさか出てくると思うのですが、僕もせっかくなら友達と大人数で遊びたいよね～となってサーバー運営に手を出すことになりました。
~~ちなみにゲーム用のサーバーを運用するのは小6の時にやったMinecraft振りです。老人世代…~~

## どうやってサーバー構築していくよ…問題
最初は普段作業やゲーム用で使っている自作PC(Windows)でサーバーを建てたのですが、サーバーを建てながら自分も参加すると動作がかなり重くなってしまい、どうしたものかと悩んでました。

特にパルワールドはメモリリークが酷く、定期的にサーバー再起動を実施しないと平気で32GBメモリを食い潰すという悲惨なことに…。

そこで最初はVPSでやろうかな～とかって悩んでたんですが、月試算で万単位の金が持っていかれるのは割と笑えないなって話になって秒速でやめました。

VPSの個人的おススメはVultrかな。Minecraftのサーバー建てた際お世話になってました。

https://www.vultr.com/

そこで別PCで運用したいな～と考え、以下のような構成で実現できるのでは？と考えました。~~これが沼の始まりです。~~

- OSはLinux(Ubuntu)にする
    - WSL2を普段から使っているのでCUIにあまり抵抗がない
    - 軽い(たぶん
- ミニPCを購入し、サーバー機運用する
    - 置き場所に困らない、シンプルに邪魔にならない
    - ベアボーンで本体の値段を極力抑えて、メモリやストレージに余り金をツッパしたい
- メモリはとりあえず64GB積んでおく
    - いつメモリリーク改善されるか分からないから…

ということで人生初ミニPCサーバー運用を始めることとなったのです。いぇ～い:clap:

## 買ったモノたち

まず予算はトータルで6万円台に抑えてェ～～と思ってました。普通に金欠だったので出費が痛すぎるんだい。

とはいえ色々探せばあるもんですね…。普通に6万円台でおさまったのビックリ。

### ミニPC
- **ren5000(Ryzen7 5825U)** **31,999円**

https://www.amazon.co.jp/GZBOX%E3%83%9F%E3%83%8BPC-%E3%83%9F%E3%83%8B%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3USB3-0-2%E3%83%BBHDMI2-0-GPU%E3%83%BBWiFi6%E3%83%BBBT5-2%E3%83%BBRJ45-1000M%E3%83%9F%E3%83%8B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC/dp/B0CQVJBHY3/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1NL3QUULBOSRT&keywords=%E3%83%9F%E3%83%8BPC%2BOS%E3%81%AA%E3%81%97&qid=1706186570&s=computers&sprefix=%E3%83%9F%E3%83%8Bpc%2Bos%E3%81%AA%E3%81%97%2Ccomputers%2C187&sr=1-4&th=1

今回ミニPCとして選んだのはGZBOXでした。ren5000というモデルのベアボーンになります。

スペック的にはRyzen7 5825Uを積んだベアボーンでなんと31,999円。安すぎる…:innocent:
8コア16スレッドあるので、コア数や性能部分もパルワールドのサーバーを開く要件を満たしています。

https://tech.palworldgame.com/ja/getting-started/requirements

最速でポチッた後、再入荷表示になっていました（笑）

現在半月ほど運用していますが、目立った問題などは一切出ていないのでだいぶ助かっています。あとはどれくらい持つかなあ…。

### メモリ

- **CORSAIR DDR4-64GB VENGANCE SO-DIMM 64GB(32GB×2)** **20,784円**

https://www.amazon.co.jp/gp/product/B09DTG3BD7/ref=ppx_od_dt_b_asin_title_s00?ie=UTF8&th=1

メモリはノートPC用のSO-DIMMになります。

配送日が当日中のメモリで、ある程度ブランドイメージが備わっている所なら何でも良いや…ってことでコルセアにしました。

クルーシャルでも良かったんですけど、値段が変わらないってのでスルーしました。
~~あと配送日が翌日だったのでめんどくせとなり蹴った。~~

https://www.amazon.co.jp/Crucial-%E3%83%8E%E3%83%BC%E3%83%88PC%E7%94%A8%E5%A2%97%E8%A8%AD%E3%83%A1%E3%83%A2%E3%83%AA-32GBx2%E6%9E%9A-PC4-25600-CT2K32G4SFD832A/dp/B07ZLCVKPV/ref=sr_1_6?crid=2PYD733UV7C9I&dib=eyJ2IjoiMSJ9.kX710IhGLpEvRCzrhNQlx9-kYFRffLYVlT18CXGx3n1tbl9azZiACx3P7tsVCT-1HeuHD4p9NX63WVL2gVevDE_x-cJAO9zhX0wGZM4uslJFUsSyKfbo6m9Pj6PqjSuZPAukqkAAhfrpUua02LNJ2lwvInNZ_AbaAz54Akab9Ooy0DarU0oqrCqKSONMRm6KJtZdzfjjLoV0STAhp8iymrqszJ8tQ-6rckGxtJH8pmWoQjuelG1lsDfYlTKBJdBBUcc6VbsccV6-GtdjfNT_u9SzE8LmJdnxdwblLTVeswg.Kr9FS2Z75LbJIj3MIPFWz7jtDTWfaZ_fVWChmvtwtxw&dib_tag=se&keywords=sodimm+ddr4+64gb&qid=1708398017&sprefix=SO%3DDIMM%2Caps%2C183&sr=8-6

### SSD

- **KIOXIA NVMe M.2 Type 2280 PCIe Gen 3.0×4 1TB** **8,580円**

https://www.amazon.co.jp/gp/product/B09KZG6PQV/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1

SSDは512GB or 1TBのどちらを積むかギリギリまで悩んだのですが、ゲーム用途以外にも使うだろうとのことで1TBにしました。

ゆくゆくはMinIOみたいなオブジェクトストレージを持たせるとき用のためって感じ。

https://min.io/

またRyzen7 5825Uはどうやら[Gen4.0に未対応(ちょい痛)](https://www.amd.com/en/product/11601)らしく、いくら互換性があるとはいえ高いGen4.0を積む理由が見当たらなかったのでGen3.0のNVMe M.2 SSDにしました。5,000円くらい安いから…。

あとキオクシアが日本製ブランドというのも購入の決め手となりました。元は確か東芝メモリさんで、ブランド名をキオクシアに刷新したとのことです。

耐久値的なところも日本製なら安心かな～という感じですね。

### 合計
**61,363円**

やっすゥ……。

## Ubuntu Serverを入れる
ここら辺は以下の記事を参考にさせて頂きました。

https://zenn.dev/mesgory/articles/ffe5cc73fe5650

https://zenn.dev/hatotk/articles/install-ubuntu-server-20-04-lts

Ubuntu Serverのセットアップが完了したら、あとはSteamCMDによるサーバー構築を行えば完了です！

https://tech.palworldgame.com/ja/getting-started/deploy-dedicated-server


## 自動再起動スクリプトをcronで定時実行する
余談ですが、ARRCONというRCONを組み合わせることでサーバーの自動再起動を実現することができます。

https://github.com/radj307/ARRCON

自分の場合はSteamCMDをルートディレクトリに配置(インストール先を特に指定せず)したので、`Steam`ディレクトリ内にパルワールド系のデータが格納されています。

ディレクトリ構成は以下のような形になります。
```
.
├── ARRCON
├── PalWorldServerDataBackup
├── ScriptFolder
└── Steam
```

まず`ARRCON`ディレクトリ内にダウンロードしたARRCONのファイルを配置します。

```terminal:terminal
[your UserName]@ubuntuserver:~/ARRCON$ ls
ARRCON
```

次に`ScriptFolder`内に`ServerRestart.sh`を作成し、以下の内容を記述します。
適当な文字を当てている箇所は、適宜ご自身の環境に読み替えて設定してください！

```bash:ScriptFolder/ServerRestart.sh
#!/bin/bash

# RCONによるサーバー再起動処理
cd /home/[your UserName]/ARRCON
./ARRCON -H 192.168.10.xxx -P yyy -p yourPassword "Save"
./ARRCON -H 192.168.10.xxx -P yyy -p yourPassword "Shutdown 5 5secAfterServerRestart"
./ARRCON -H 192.168.10.xxx -P yyy -p yourPassword "exit"

# 処理遅延用待機処理
sleep 10

# 操作するディレクトリを設定
target_directory="/home/[your UserName]/PalWorldServerDataBackup"

# サブディレクトリを削除
cd "$target_directory"
find . -mindepth 1 -type d -exec rm -rf {} +

# バックアップファイルのコピー
cp -r /home/[your UserName]/Steam/steamapps/common/PalServer/Pal/Saved/ /home/[your UserName]/PalWorldServerDataBackup/Backup_`date "+%Y%m%d_%H%M"`

# サーバー再起動
cd /home/[your UserName]/Steam/steamapps/common/PalServer
nohup ./PalServer.sh -port=xxxx > nohup.out 2>&1 &
```

上記のスクリプトはざっくり以下のような動きになります。

- ゲーム内管理者コマンドで`Save`を実施
- ゲーム内管理者コマンドで`Shutdown`を実施
    - 5秒後にシャットダウンするよ～というメッセージ付
- `PalWorldServerDataBackup`にバックアップデータをコピー
    - `Backup_YYYYmmdd_HHmm`のディレクトリ名で保存
- バックグラウンドでサーバー起動

となっています。やってること自体は意外とシンプル。

最後に`cron`で定時実行されるように設定します。

```terminal:terminal
[your UserName]@ubuntuserver:~/ARRCON$ crontab -e
```

最下行に以下の記述を追加します。

```terminal:crontab
0 0,6,12,18 * * * /home/[your UserName]/ScriptFolder/ServerRestart.sh
```

これで6時間毎に先程のスクリプトが自動で実行されるようになりました。
再起動の時間を変えたい場合は、`crontab`の記述内容を弄るだけで済むので楽ですね！

## おわりに
自作PCを作ったことがある方は意外と取っ掛かりやすいイメージです。

ただ自作未経験の方も基本的にはネジ回しが1本あれば誰でも作れるので、VPSを借りる or おうちサーバーを建てる で悩んでいる方はこちらの記事を参考にして頂けると嬉しいです。

おうちサーバーは沼です。終わり。:angel: