2023年12月7日木曜日

クラフト系ゲーム環境とサーバーと猫の話

mhidakaが建立した Advent Calendar 2023 7日目です。

近況としては数年前に転職していわゆる技術の最前線からはやや距離は置いているものの、新しい事業を作るというところで割と真面目に働いています。コードは普通にガチャガチャ書いてます。

プライベートではクラフト系だったりPvEのゲームとかは好きなので、ゲーミングPCを自作したり、ゲーム用サーバーを建てたりとかあれこれやってます。

デスクまわりはこんな感じです。机の下にキューブ型ケースの自作用PC2台を積んで置いていて、それぞれゲーム用PCとサーバー用PCです。


ゲーム用PCがどんなんか

構成はよく変えるけど、だいたいAMD系であることが多いです(純粋に好みとして)。
キーボードはゲーミングキーボード的なのを何度か買おうと考えたけど、結局ストロークの浅いのが好みなのでThinkPadキーボードをずっと使ってます。
マウスは超軽量という評判に惹かれて買ったHyperX Pulsefire Haste 2を愛用してます。
クラフト系ゲームをやっていると左手が忙しいのでRazer Tartarus V2も併用している。
インディーズゲームとかを遊ぶときに、ダウンロード元を何処まで信用できるかに懸念があるので、他のPCとは独立させています。
ここ数年で長くプレイしたゲームはこの辺り。
  • Icarus | The Future of Survival
  • Valheim
  • 地球防衛軍5
  • Empyrion
  • ARK
  • Watch Dogsシリーズ
  • Minecraft
Valheimで建築した出雲大社の巨大神殿

Icarusで火事で焼け落ちる拠点を呆然と眺める姿


サーバー機にしてるPC

数人でクラフト系のゲームをやってるとホスト(サーバー)を誰がやるかが課題に挙がります。自分がプラッと建築とかしたくても、ホスト役の人がゲームを起動してないとワールドに入れないのは都合が悪いんですよね。レンタルサーバーを使うのもいいけど、建てっぱなしにするのはお金が継続的に掛かるし勿体ない。なのでサーバーを建てることに。

以前はDeskMiniという流行りのMini PCにDebian Linuxを入れてそれにLinuxGSMというサーバーを建てるのを便利にするのをいれて運用していました。


ただ、ゲームの数が増えてくると1個のPCで管理すると別のゲームに影響しそうなので、ゲームごとに分けたくなり、だからといって物理的にPCを増やすのは面倒なので、仮想化環境を構築することにしました。
それが今のサーバ機にしているPCで、Proxmox VEで中に複数のサーバーが動いています。こだわりどころで言えば、クラフト系のゲームのサーバーって結構メモリを食うので、メモリを128GB積んでいること。さらにECCメモリなので、動かしっぱなしにしても謎なエラーを気にしなくて良いと言うのがあります。


また、Proxmox VEにはPCI(e) Passthroughの機能があり、仮想マシンに物理のGPUを接続できます。なので勉強がてら仮想マシンのUbuntuでJupyter NotebookStable Diffusionとか動かしてみたりとかにも使っています。ただ、MircoATX用の小さい筐体にあれこれ詰め込んだ結果、中身が地獄みたいになっているのはご愛嬌です。

詰め込みすぎたサーバー機の中身

ネットワークのお話

仮想マシンとしてサーバーをたくさん建てるのは良いけど、外からのアクセスを考えるとルーティングをちゃんとしないといけません。罠になりそうなのが2つあります。1つは契約してるインターネットプロバイダがそもそも外から繋げられるようになってるかです。もう1つは使っているルーターのポート開放の挙動です。ポート開放がなかなかの曲者で、一般向けのルーターだとポート開放の機能がオマケ程度になっていて、アクセス元が内側か外側かで挙動が変わって、動いたり動かなかったりするケースがあるからです。なのでこの辺りで嵌ったら正式にサポートしているルーターを使うことをオススメします。僕はメルカリで購入したYAMAHA RTX830を使っています。


余談:猫用定点観測カメラ&給餌器

自宅に猫が2匹いますが、飼い主の朝が遅いため、朝御飯はタイマー付きの給餌器に任せています。ただちゃんとご飯を食べられているかの確認(黒白さんが灰錆さんのご飯を強奪するんですよ、、、)に録画用のRaspberry PIを設置しています。

仕組み的にはRasplerry PiにインストールしたDebian Linux上でこんな感じのシェルスクリプトをcronで決まった時間に実行しているだけです。(ついでに録画されたファイルはnginx経由でローカルネットワークからのみ閲覧できるようにしてます。)

#!/bin/sh

OUT_DIR=/var/www/html/movies
FILE_NAME=`/bin/date "+%Y%m%d-%H%M%S"`.mp4

# USBをオンにしてLEDライトを点灯
/usr/sbin/uhubctl -a on -p 2

# カメラの設定
/usr/bin/v4l2-ctl \
  --set-fmt-video=width=320,height=240,pixelformat=YUYV \
  -d /dev/video0
# ffmpegで録画
/usr/bin/ffmpeg \
  -f video4linux2 \
  -s 320x240 \
  -t 600 \
  -i /dev/video0 \
  -r 10 \
  -c libx264 \
  -threads 4 \
  $OUT_DIR/$FILE_NAME

# USBをオフにしてLEDライトを点灯
/usr/sbin/uhubctl -a off -p 2

ご飯の時間になるとこれによって録画されるという寸法です。

給餌器と録画用Raspberry Piの配置

撮影された動画

なお、晩御飯は人間が手であげているのですが、ご飯時になるとこういう感じで圧を掛けてきます。
飼い主に御飯の圧を掛ける2匹


来年とかに思うところ

コロナ禍も落ち着いてきて、物理イベントも増え始めたので、物理的に何か作りたいと思う今日この頃です。