【配布】汎用PCゲームサーバー管理ツール Ver2作成 ~Discordでみんなで操作 AIでノーコマンド化 Windows/Linux対応 複数PCをリモートで管理~ palworldでの適用例有 ARK 7dtd等人気タイトルに対応
こんにちは、Rcatです。
今回は1年前くらいに紹介した、汎用PCゲームサーバー管理ツールのバージョン2を作成しましたので紹介と使い方及び配布を行います。
最初に簡単な説明を行った後、導入方法をおよびパルワールドの適用方法の解説を行います。
前作はこちら(軽く目を通しておくと分かりやすいかもしれません)
概要
本作はPCゲームでよくあるシェルから起動するタイプのゲームサーバーの管理を行うためのツールです。
制作した理由ですが、こんな経験はありませんか?
いちいちシェルにログインして起動が面倒。管理者がいないと起動と停止ができない。管理者はみんなが終わるまで寝られない。etc…。こんな状況、セッション参加型と何が違うのでしょうか?サーバーの意味ありますか?
というわけでそれらを丸っと解決するために制作したのが本作です。コンセプトは"参加者だれでも管理できるツール"です。
DiscordのBOTを使用することでメッセージを使ったサーバー管理を行います。
また、本作は"汎用"を目的としており、タイトル毎に仕様に沿った起動スクリプトと停止スクリプト及びステータス確認スクリプトを作成することで、どんなタイトルでも使える可能性を秘めています。
いくつかのタイトルはスクリプトの例を公開しています。
機能と変更内容
機能及び仕様
簡単な機能説明と旧作からの変更点をまとめます。
大きな変更としては対応OSの追加、リモート管理機能、生成AIによる指示と実行があります。
対象OS
Linux
Windows
前作では非対応だったWindowsに対応させました。
Windowsではタスクスケジューラを使うことでログイン無しで起動できます。
ゲームサーバー管理機能
サーバーの起動
サーバーの停止
サーバーのステータス表示
管理中の全サーバーの状態を確認ユーザーコマンド実行機能
任意のスクリプトを作成し、標準出力をコマンドの出力として使用できる機能です。例えばサーバーの参加者一覧を表示するコマンドを作るなどが可能。
リモートサーバー操作機能
リモートサーバー管理機能
PCが複数台ある場合、他のPCでも本ツールを実行することで、メインのPCからリモートで指示を受け付けます。電源管理機能
リモートPCの電源操作を行えます。Wake on LANによるリモートPCの電源投入
本ツールによるシャットダウンコマンドの実行
Discord BOTによる操作
ボットアカウントに指示を出すことで操作を行います。指定されたメンバーが指示可能
サーバー管理者以外のメンバーも操作に参加できます。
(サーバー管理者が寝る→「最後の人電源切っといて」などが可能)AI搭載で楽々指示
一字一句正確に打たないと使用できないコマンドの時代は終わりました。「OOのサーバー起動」や「サーバー一覧」などの指示をAIが理解して実行します。音声入力対応
アプリの”長押しして記録”機能でボイスメッセージを送信し、音声認識を使用してコマンド認識します。時限実行機能
時間や時刻を前もって指定しておいてコマンド実行が可能。
「1時間後にサーバー止めて」のような使い方ができる。
システム構成
本作のシステム構成は以下のようになっています。
具体的には次のような要素が含まれています。
クライアント
サーバーの起動や停止などの指示を出す部分です。Discord
チャットボット
本システム付属のチャットボットを使用し、サーバー管理ボットとしてログインします。
私たちはこのbotに対して指示を出します。
Dify
様々な生成AIサービスに対応したAIツール作成ツールです。
Discordのbotに組み込むことで、AI BOTにします。Gemini
Googleの生成AIです。無料でも十分な利用枠があるので活用しています。Gemini1.5 Flashを使用。
サーバー管理ツール
本作のメインです。最終的にこのツールのAPIを叩くことで、ゲームサーバーの管理を行います。パソコンN Or サーバーN
複数のパソコンで起動することでリモートで操作が可能です。
例えばOSが違うパソコンで起動することで、どちらのOSでも対応することができたり、リソースが必要なゲームをやるときだけ消費電力の大きいパソコンを使用したりできます。
Rcatの使用構成
私がどういう構成で使用しているのか説明しておきます。
今回は2機を使い分ける形で使用しています。
本ツールのメインはミニPCの方に入っており、関連ツールなどもすべてこちらです。
理由としては元々24H稼働用に買ったものなのでBOTを運用するのにちょうどよかったというのもあります。
palworldサーバーもレイドアプデ前までは稼働できました。最近は性能足りないのか安定しませんね…。まぁ軽いサーバーならOKというレベルです。
もう一基、リモートでメインの作業用PCにも導入します。
そもそもWindowsしかないゲームのサーバーや、重くなってきたサーバーはこちらを使います。本ツールには電源を入れる機能もあるので私がいない間にメンバーが起動することもできます。
参考記事
DiscordBOTのテンプレートプログラム
時限実行の詳しい内容についてはこちらを参照してください
長押しして記録で音声認識
導入方法
前提条件などがあるので、上から順に行ってください。
※以降の説明のソースコードなどでモザイクをかけてある箇所は、他の記事で有料などにしている箇所です。間違っても公開しないように注意してください。
ファイルのダウンロード
本記事末尾でデータの配布を行っています。
手順に則りデータを取得してください。
データの内容は次のようになっています。
それぞれの使い方はこれから先で説明していきます。
サーバー管理ツール本体
Discordボット本体
AIチャットボットデータ
Linuxサービスファイル
Discord BOTアカウントの用意
まず、最初にDiscordのボットアカウントを作成します。
以下のメモを参考にBOTの作成とトークンをメモしてください。
また、管理用のサーバーを作成しボットを招待しておいてください。
記事の"Discordpy 2.0以降で"discord.Intents.all()"でログインできない事象"セクションで紹介されているスイッチは必ずオンにしてください。
Difyの導入
DifyはオリジナルAIツールを作れるツールです。
Discord BOTのAI認識にはこちらを使用していますので導入が必要です。
以下を参考にローカルに導入するか、アカウントを作ってください。
AIサービスはGeminiを使う前提です。ChatGPTでもいいかもしれませんが試していないので意図しない回答により動作不良を起こす可能性があります。
別のAIで試した方がいればぜひ結果をコメントしてください。
Difyの導入が済んだら、アプリを作成するの中の一番下dslファイルをインポートを押して、配布しているymlファイルを読み込んでください。
読み込むとチャットボットが作成されるので、左側のAPIアクセスをクリックし、画面を移動します。
次に右上のAPIキーを押し、ポップアップしたウィンドウで新しいシークレットキーを作成してコピーしてください。
※ローカルの場合はキーが漏洩しても問題ありませんが、オンラインで作成した場合は絶対に流出しないようにしてください。
ツールの導入準備
ツール本体とDiscord botのプログラムを導入します。
まずはいくつか書き換えなければならない部分があるので、その部分を解説します。
ツール本体の導入準備
まずはサーバー管理ツール本体の変更内容です。
ポート番号の設定
デフォルトでは25564番になっています。すでにバッティングしているという方は変更してください。ちなみにリモートでも同じ番号を使うという前提になっているので、後から変更する場合注意してください。
ブロードキャストアドレス
遠隔で電源を入れる機能を使わない場合は無視してOKです。
だいぶ下の方に遠隔でPCの電源を入れるためのWake on LAN関数があります。rcatの自宅環境で書いてあるので、ブロードキャストアドレスが違う場合、適切に変更しておいてください。
BOTの導入準備
次にボット側の変更です。こちらはそれなりに多いです。
上から順に説明していきます。
管理ツールのアドレス
ボットとサーバー管理ツールを同じパソコンで実行する場合、ここは変更しなくて大丈夫です。コマンドの実行権限グループ
この後詳しく解説しますが、全てのメンバーがボットへの指示ができるわけではありません。権限を設けることができます。本作ではユーザーをまとめたグループという単位で権限を管理しています。
一番上の"admin"は管理者という意味です。自分のDiscord IDを入れてください。他にも全コマンドの実行を許可する場合は、ここにIDを入れてください。
それより下は任意の名前で好きなだけ定義することができます。
ユーザーIDはDiscordで右クリックしてコピーできます
Difyのサーバー
Difyを実行しているコンピューターのIPアドレスです。オンラインで登録している場合や、ローカルホストでうまく接続できない場合、直接IPアドレスを入れてください。DifyのAPIキー
Difyの導入でメモしたAPIキーをここに貼り付けてください。
コマンドの実行権限
さらに下の方に行くとコマンドの定義がずらっと書いてあります。
この中の"permission"という部分が上で説明した権限のグループ名になっているのにお気づきでしょうか?
この辺りのコマンド実行権限を与える場合、グループ名を入れるというやり方をします。ちなみに管理者は省略可能です。
難しければ上で説明したグループのところは特に変更せず、自分のDiscord IDを入れるだけに留めれば問題なく使用できます。友人などはmemberに入れといてください。
上から順に
ゲームサーバーの起動と停止を行うコマンド。
サーバー本体の電源管理を行うコマンド
ユーザー定義コマンドを実行するコマンド
ゲームサーバーの一覧表を行うコマンド
電源管理に関するコマンドだけ注意といったところでしょうか?
トークンの設定
ボット作成の手順でコピーしたトークンをtoken.iniに貼り付けます。
プログラムの環境構築と起動
準備が整ったら、いよいよ環境構築と実行を行います。
Pythonの環境構築自体がまだという方は下記を参考にPythonを導入をしてください。
本作は完全自動環境構築対応です。
Pythonの実行環境が整っている場合は、OSに応じて以下のファイルを実行してください。
このファイルを実行することで、仮想環境(venv)の作成とライブラリのインストールプログラムの実行まで自動で行います。
順番としては先にツール本体を立ち上げてからボットを立ち上げてください。
問題なく立ち上がったら一旦閉じて終了してください。
Discordのボッドは起動すると以下のような動作をします。
gamesカテゴリーがない場合自動作成。サーバー管理チャンネルがない場合自動作成。
システムカテゴリがない場合自動作成。log,systemチャンネルがない場合自動作成。
今後botに対して指示を出すのはこの"サーバー管理"チャンネルになります。
システム的に作られるだけで、実際はボットの稼働通知しか来ません。
ゲームサーバー定義の作成
ここまででツールを使う準備は完了です。
次にゲームサーバーの管理に必要なデータを作成していきます。
サーバー定義を作成後、ツールを再起動することで利用可能になります。
サーバー定義とは
各タイトルの起動、停止、ステータス確認を行うスクリプトのセットをサーバー定義と呼びます。
サーバー定義は次のようなデータ構成になっています。
本ツールと同じ階層に"servers"フォルダーを作成し、その中に各サーバーの定義を入れるフォルダを作成します。
上記の例ではバルワールドのサーバーが2つあります。
上の方がツールが起動しているパソコンでゲームサーバーを実行する場合の定義。こちらが通常の方法。
下の方は別のパソコンでゲームサーバーを実行する場合の定義になります。
リモートについては別のセクションで詳しく解説します。
サーバー定義の中には以下のファイルが入っています。
スクリプトの内容については別セクションで具体的に説明します。
開始スクリプト
サーバーを起動するのに必要なスクリプトを書いて格納します。
この例ではWindowsLinux、両方とも格納しています。
OSで自動判別するので両方入れっぱなしでOKです。停止スクリプト
サーバーをシャットダウンするために必要なスクリプトを格納します。
例えばRconでコマンドを送ったりtaskkillしたりなど…。ステータス確認スクリプト
サーバーの実行状態を終了コードとして返すスクリプトです。
サーバーが停止している場合は0。稼働中は1。SteamCMDが起動している場合は2を返すように書きます。
配布しているものを参考に書き換えてもらえれば結構です。サーバー情報
サーバーの説明と電源管理のパラメータを書いておきます。ユーザー定義コマンド (任意)
usercmdフォルダを作成し、その中にユーザー定義コマンドとしてスクリプトを入れることができます。今回の例ではログインしているプレイヤー一覧を取得するコマンドが入っています。
パルワールドの例
今年の大人気タイトルPalworldのサーバー定義を例として解説していきます。
開始スクリプト
まずは開始スクリプトの紹介です。
動作手順としては二重起動防止のためステータスを確認後、起動していなければ先に進みます。
steamcmdを起動してアップデートをかけます。省略してもいいですが、自動的にアップデートがかかるので書いておくと楽です。
最後にサーバーの実行です。各タイトルごとに適切な引数を渡して本体を起動しましょう。
このスクリプトをそのまま使う場合は、ご自身の環境にパスだけ書き換えればOKです。
停止スクリプト
停止スクリプトは次の通りです。
パルワールドはRCONに対応しているので、そこに対して停止コマンドを投げるスクリプトです。
事前にPalworld側の設定でRCONを有効にしないと機能しません。
このスクリプトではRCONを使うためにPythonを起動しています。そのため、Pythonの呼び出し方がWindowsとLinuxで異なっている程度でしょうか。
ここに載せる時気づきましたが、Linuxだけセーブのコマンドも投げてます。
絶対に必要なのはシャットダウンだけなので、そのコマンドを投げられればOKです。
最近はhttpでも受け付けるらしいので、そっちでもいいかもしれませんね。
ステータス確認スクリプト
ステータス確認スクリプトは以下の通りです。
説明した通り、サーバーの起動状態を0,1,2の数字で返せればOKです。
今回の例では特定の名前のタスクがあるかどうかで判別しています。
Windowsの場合はtasklist、Linux場合はpsコマンドでプロセスの確認を行い、該当する名前があるかどうかで、サーバーの起動状態を判定します。
また、サーバーがアップデート中に二重起動しても困るので、steamcmdも見ています。
言語は異なりますが、書いている内容は全く一緒です。行数まで一致していますね。
サーバー情報
サーバーの情報が記述されたファイルです。
具体的には、このサーバーは何のサーバーなのかの説明と、マシンの電源操作の受け付けるかどうかのフラグです。
JSONファイルなので上記のようなフォーマットです。
一番上のdescriptionはAIに判別させるために使います。ここでちゃんとした説明を書かないと「パルワールド起動して」のような言い方で判定できません。
その下はサーバーが動いているパソコンの電源を入れたり、切ったりするコマンドを受け付けるかどうかです。
絶対に止めてはいけないパソコンであればシャットダウンの方を無効にしたり、電気代食うから勝手につけて欲しくないのは電源オンを無効にしたりといった使い方ができます。
なお、電源の投入はリモートのパソコン前提でかつWake on LANに対応している必要があります。
Wake on LANの具体的な設定方法については下記記事で紹介しています。
パルワールド(リモートの場合)の例
次にリモートの場合の定義方法です。
リモートの場合は、メインの管理ツールには以下の2つのファイルを入れます。
最初の"server.json"は、先ほど説明したサーバー情報と同じファイルです。
リモートで特徴的なのは以下の"remote.json"のデータです。
こちらもサーバー情報のファイルと同じようにJSONデータです。
中身にはリモートコンピューターのIPアドレスとイーサネットのMACアドレスが書いてあります。
IPアドレスはリモートでステータスを取得したり、指示を出したりするのに必要です。
MACアドレスは Wake on LANでリモートで電源を投入する場合に必要です。使用しない場合は空白で大丈夫です。
リモートサーバーの構成は以下の通りです。
メインのコンピューターでリモートコンピューターに対する定義を行ったら、リモート側のコンピューターでは同じようにツールを導入し、サーバー起動の定義を作成しておきます。
この時、サーバーのフォルダ名と格納する詳細ファイルは同じにしてください。フォルダ名が一致することで、リモートサーバーとして認識されます。
ユーザー定義コマンドの作成方法
本作は汎用性を重視しているため、全てのサーバーに共通する起動や停止以外の操作は持っていません。
しかし、サーバー管理ツールなのである程度サーバー管理コマンドを叩けた方がいいと思うので、ユーザー定義コマンドを機能を搭載しています。
今回はログインしているユーザーの一覧を表示するコマンドを定義しています。
ユーザー定義コマンドは、スクリプトのフォルダの中に"usercmd"フォルダーを作成し、その中にスクリプトとして作成します。
具体的な中身は以下の通りです。
ユーザー定義コマンドにはルールがあります。
3行目にechoコマンドで、コマンドを説明を書くこと
ユーザー定義コマンドをAIが認識するために必要です。きちんと説明を書いてAIに分かってもらいましょう。
Linux/Windowsでプログラム側の処理が同じなので、3行目に固定されています。行を間違えるとAIへ正しく指示が伝わりません。文字コードはUTF-8とすること
上記と同じでプログラムの処理がOS関係なく同じです。そのため、文字コードはUTF-8固定です。Windowsの場合、メモ帳で開いて右下が以下のようになっていればUTF-8になってます。
ちなみにWindowsのコマンドプロンプトはデフォルトだとUTF-8非対応なのでchcpコマンドを挟んでます。その影響で説明が3行目にずれ込んでいるというわけです。
実行内容は4行目以降に書くこと
上で説明したように、最初の3行はシステムで使用するので固定です。配布しているスクリプトを流用してください。実行結果は標準出力に出力すること
ユーザー定義コマンドの結果は標準出力を持って出力とします。
例えば、上記のプレイヤー一覧の場合、Python側でprintを使って表示しています。その表示がキャプチャされるため、プレイヤー一覧が出力されるという仕組みです。
操作方法
準備が出来たらツールとBOTを再起動します
※画像の内容は撮影時期により異なりますので一貫性はありません
サーバー一覧を確認する
まず、定義されたサーバーが認識されているか確認しましょう。
"サーバー管理"チャンネルにサーバー一覧を表示するように指示を出します。
一覧表示にはコンパクト表示と詳細表示があり、デフォルトではコンパクトなのでより詳しい情報が欲しい場合は"詳細"などの付け加えてください。
サーバーの起動と停止
基本的にどんな指示もAIがわかるように入力すればOKです。
停止の場合はこんな感じです。
基本的に停止という言葉を使う方がいいでしょう
気をつけたいのが電源を落とすコマンドにシャットダウンという言葉を使っているので、”サーバーシャットダウン”という入力すると電源を落とすコマンドと認識される可能性があります。
コンピューターの電源管理
サーバーパラメータで電源管理が有効になっている場合、次のコマンドが使用できます。
電源を入れる場合
Wake on LANが正常に機能していれば、これで電源が入るはずです。
友人に試してみてもらったところ、WindowsPCの電源を入れることができました。LinuxPCの電源を入れられることも確認済み。
電源を落とす場合
"シャットダウン"だと電源の方で認識されます。
なんかパルワールドじゃないんですけど、ちゃんと認識してるっぽい?
Windows及びLinuxで電源を落とせることを確認済み。
ユーザー定義コマンド実行
ユーザー定義コマンドの説明をきちんと書いていれば、その説明にのっとり反応します。
時間を指定してコマンドを実行する
AIが有効になっている場合に限り、時間を指定してコマンドを実行することができます。
例えば、タイマーは管理者だけが使えるようにすれば、強制的に2時間後にサーバーを終了させるといったこともできます。
この例では3分後にプレイヤー一覧表示コマンドをタイマー設定しています。実際に時刻が来ると実行されます。
具体的な指示の仕方や対応している指示については、以下の記事をご覧ください。タイマーは追加するだけではなく、繰り返しや削除、今すぐ実行などが行えます。
AIが使えない時は?
AIが使えない場合はコマンドを直に入力することで実行可能です。
コマンドは以下のように考えます。
通常はAIが何ていうコマンドを認識したのか、引数は何だったのかという情報を出力します。この情報を読み解き、コマンドとして組み立て直せばOKです。
フォーマットとしては"コマンド名 引数名=値"です。コマンド入力の場合は一字一句間違えずに入力する必要があります。
バックグラウンドで常時起動するには?
本ツールには遠隔で電源を入れる機能がありますが、電源を入れた後リモート側の本ツールが起動しなければ意味がありません。
パソコン起動時に本ツールが自動で起動するように設定する方法を紹介します。
Windows
Windowsではタスクスケジューラーを使用します。
以下の記事で"タスクスケジューラーに登録する"手順以降をご確認いただき、本ツールの"start.bat"を登録してください。
Linux
Linuxではsystemdを使います。
systemdを使用したスタートアッププログラムの登録方法については、以下で詳しく説明していますので、参考にしてください。
私が登録に使ったユニットファイルは同封しておくので、よろしければご利用ください。
今後のアップデートについて
ひとまず使える段階になったので公開しますが、一部前作から引き継げていない機能などもあります。
そういった機能の追加は今後行っていく予定です。追加が行われた際は記事を更新しますので、スキして待っていただけると幸いです。
配布情報
最後に本作の配布を行います。
配布URL
以下のURLより配布しています。
利用規約に同意の上ダウンロードしてください。
配布キーワード
本記事をお買い上げいただくことで、ダウンロード用のキーワードを入手できます。
ここから先は
情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。