メむンコンテンツぞスキップ
芋出し画像

Linux ゲヌムサヌバヌをWEB&Discordで操䜜汎甚ゲヌムサヌバヌ管理WEBサヌバヌ

    自前のゲヌムサヌバヌ立おたこずありたすか?
    自前サヌバヌずいうのは、オンラむン専甚ではないゲヌムでマルチプレむする堎合、接続するサヌバヌは自分で甚意するシステムの事で、有名どころだずマむンクラフト(Java版)は自前サヌバヌですね。
    他には"Palworld"や"7 Days to Die"や"ARK"なんかでサヌバヌを建おた経隓がありたす。
    さおさお、こういったゲヌムで若干問題になるのが、サヌバヌ立おた圓人しか開始やシャットダりンできない、起動時にシェルからコマンド打たないずいけないなど、専甚サヌバヌにしおいるならではの問題がありたす。たぁ専甚ホストのセッションに合流圢匏だずもっず可甚性䜎いですが 。
    ずいうわけで参加者誰でも簡単に開始やシャットダりンなどの操䜜ができるシステムを䜜っおしたいたしょう。

    アップデヌト情報

    本䜜バヌゞョン2䜜成したした
    Windowsに察応したほか生成AIやリモヌト管理機胜など様々な新機胜を搭茉しより䜿いやすくなりたした。

    前提条件

    環境

    今回の蚘事で想定される環境は以䞋ずしたす
    Steamで配信されおいるゲヌムで、か぀SteamCMDでサヌバヌを構築する際にLinux甚のサヌバヌが甚意されおいるゲヌムです。
    別に環境が違えども、起動スクリプトがあり、それをシェルから実行するサヌバヌなら䜕でもOK!
    OS:Linux (CentOS7/Ubuntu)
    自前のPC/レンタルサヌバヌ
    各ゲヌムサヌバヌは甚意枈み

    察象

    Linuxを自力で管理できる人Orやる気のある人
    Pythonの知識があるOrやる気のある人

    システムの構成

    システム抂芁

    本システムを䞀蚀で説明するず、シェルから起動するタむプのサヌバヌをWEBサヌバヌの子プロセスずしお実行しお管理する。
    WEBぞのダむレクトアクセスず別途甚意するDicord BOT連携操䜜の2皮類の操䜜方法を蚭ける。

    最小構成 : Flaskサヌバヌのみ
    Discord BOT連携 : Flaskサヌバヌ & DiscordBOT

    画像
    • メむンシステム

      • Flask WEBサヌバヌ
        各ゲヌムサヌバヌを"subprosess"ラむブラリで子プロセスずしお起動させる。
        サヌバヌ管理者はこのWeb画面のボタンで操䜜可胜。
        起動ず停止にはそれぞれ専甚のスクリプトを䜜成し、それを起動するようにするこずで汎甚性を持たせる。
        たたアップデヌトにより任意のコマンドの実行ず結果衚瀺が可胜になりたした。専甚の操䜜画面は存圚しないので、盎接URLを叩くか、Discordのボットから䜿甚する前提です。

    • サブシステム

      • Discord BOT
        ゲヌム参加者が簡単にサヌバヌの起動ずシャットダりンができるように、DiscordのBOTに指瀺を出すず、BOTがFlask WEBサヌバヌのCGIにGETで指瀺を出しお操䜜する。
        ぀たり、チャットで"/start palworld"みたいな感じで入力するだけでサヌバヌの起動や停止ができる。

    Discordを䜿う理由

    第䞀に誰でも簡単に制埡ができるこず。チャットで特定のメッセヌゞを送るだけで簡単に操䜜できたす。
    たた、WEBサヌバヌにアクセスさせおもいいが、平文通信なのずFlaskは公開向けのラむブラリではないのでポヌト開攟しお䜿甚するのは少々懞念がありたす。
    しかし、DiscordのBOTなら同じコンピュヌタヌ内で動䜜するので、localhostからFlaskに指瀺を出せばいいので安党です。
    こういった理由からDiscordのBOTを䜿いたす。
    勇者の方はWEBサヌバヌのポヌト開けおもいいです 。

    䜿甚方法ず適甚䟋

    今回のシステムは、過去の経隓䞊Linux版のサヌバヌを出しおいるゲヌムなら起動スクリプトから起動できるこず、終了の方法は別途通信プロトコルを蚭けおいるこずが倚いこずが分かっおいたすので、耇数タむトルで䜿甚できるような仕組みで行きたす。

    埌から远加されたタむトルごずの詳现説明は䞋蚘をご確認ください

    Palworldパルワヌルドの堎合

    ARKの堎合

    Space Engineersの堎合

    詳现解説7 Days to Dieで解説

    本蚘事は7dtdサヌバヌを再構築する時点で䜜成しおいるため、本䜜で解説ずなりたす。
    このセクションは7dtdだけでなく、他のタむトルのサヌバヌを建おる際に必須な情報も含んでいるため適宜芋おください。

    このタむトルの堎合は、サヌバヌ構築時点で開始するためのスクリプトが䜜成されおいるのでそれを䜿い぀぀、シャットダりンはTelnetを䜿いたす。
    タむトルによっおはここがRconだったりしたすね。

    画像

    ちなみにデフォルトでは無効になっおいるので、以䞋のようにTelnetを蚭定を有効にしおおいおください。
    ちなみにここで話をするのはA21バヌゞョンです。
    い぀からか、りェブの管理タヌミナルが倉わったのか、ただアクセスしただけではシャットダりンができなくなっおしたったので、Tenletを䜿いたす。仕組みが分かっおいれば、そのWEBのAPIに察しおシャットダりンのコマンドを投げるような終了スクリプトを曞いおも倧䞈倫です。

    	<!-- Admin interfaces -->
    	<property name="WebDashboardEnabled"			value="true"/>				<!-- Enable/disable the web dashboard -->
    	<property name="WebDashboardPort"				value="8081"/>				<!-- Port of the web dashboard -->
    	<property name="WebDashboardUrl"				value=""/>					<!-- External URL to the web dashboard if not just using the public IP of the server, e.g. if the web dashboard is behind a reverse proxy. Needs to be the full URL, like "https://domainOfReverseProxy.tld:1234/". Can be left empty if directly using the public IP and dashboard port -->
    	<property name="EnableMapRendering"				value="true"/>				<!-- Enable/disable rendering of the map to tile images while exploring it. This is used e.g. by the web dashboard to display a view of the map. -->
    
    	<property name="TelnetEnabled"					value="true"/>				<!-- Enable/Disable the telnet -->
    	<property name="TelnetPort"						value="8082"/>				<!-- Port of the telnet server -->
    	<property name="TelnetPassword"					value=""/>					<!-- Password to gain entry to telnet interface. If no password is set the server will only listen on the local loopback interface -->
    	<property name="TelnetFailedLoginLimit"			value="10"/>				<!-- After this many wrong passwords from a single remote client the client will be blocked from connecting to the Telnet interface -->
    	<property name="TelnetFailedLoginsBlocktime"	value="10"/>				<!-- How long will the block persist (in seconds) -->
    

    サヌバヌツヌルの構成

    本ツヌルの構成は以䞋のようになっおいたす。
    メむンのPythonスクリプト及びDiscordのbot甚スクリプトで構成されおいたす。
    たた、それぞれ別途Systemdのサヌビスに登録しおおきたす。(しなくおもいいですが)
    これは䜕をしおいるかずいうず、Windowsで蚀うスタヌトアッププログラムの登録です。サヌバヌの電源を入れた時に、Webサヌビスずボットが立ち䞊がりたす。
    Systemdに関しおは本ツヌルを䜜るにあたり、以䞋でメモしたのでご確認ください。

    画像

    Pythonの実行方法に関しおは䞋蚘を参考にしおください

    サヌバヌ定矩の䜜成

    構成フォルダ内のserversのフォルダがサヌバヌ構成を䜜成するフォルダになりたす。
    この䞭に各ゲヌムごずのサヌバヌ定矩管理甚のフォルダを䜜成したす。
    各蚘事で個別にこのツヌル内の定矩方法を説明しおいる堎合、ここから先のセクションの話ずなりたす。

    画像

    さらに、その䞭にはスタヌト、ストップ、アップデヌト、バックアップの4
    ぀のスクリプトを入れたす。
    なお、最䜎スタヌトずストップがあればよいです。
    オリゞナルコマンドを䜜成する堎合は"オリゞナルコマンド䜜成方法"をご確認ください。
    远蚘:アップデヌトで"stat.sh"ず"port.txt"が远加されたした。

    画像

    start.sh

    サヌバヌを開始するシェルスクリプトです。管理サヌバヌからこのスクリプトを匕数なしで起動しお、ゲヌムサヌバヌが立ち䞊がるように䞭身を蚘述したす。

    画像

    このスタヌトスクリプトのポむントはいく぀かありたす。
    たず䞀぀目、20行目が実際のサヌバヌを起動するための行になりたす。
    シェルスクリプトの䞭で既存のゲヌムサヌバヌを起動するためのスクリプトを呌び出しおいるずいう圢になりたす。
    次のポむントは二重起動を防ぐためのブロックです。
    起動時にstat.txtずいう名前のテキストファむルを出力し、終了したらそのファむルを削陀するこずで、二重起動をしないようにブロックするような機構を蚭けおありたす。
    そのため、実際にこれをコピペしお䜿う堎合は起動スクリプトの行だけを倉曎するこずになりたす。

    stop.sh

    サヌバヌを停止するためのスクリプトです。ゲヌムの仕様に応じお最適な方法で停止させるように蚘述したす。

    画像

    7 Days to Dieの堎合は䞊蚘のようになりたす。
    終了コマンドは"shutdown"で、それをtelnet経由で送信したす。
    Cent OSにはデフォルトでtelnetが入っおいないので別途むンストヌルしおおいおください。
    実際にサヌバヌを立おた埌、䞀旊䞊蚘のスクリプトを実行しおサヌバヌが停止するこずを確認しおみるこずをお勧めしたす。

    update.sh

    こちらは手動で流しただけで、ただ未怜蚌ですが䞭身だけ玹介したす。
    基本的にSteamCMDでのアップデヌトをそのたた曞き蟌んだだけです。
    ただし、アップデヌト䞭に起動されるず困るので、ブロックファむルであるupdate.txtを出力するようにしおいたす。

    画像

    backup.sh

    ボタン䞀぀でセヌブデヌタをバックアップするためのスクリプト
    この䟋では、保存フォルダの䞭身をZIPに圧瞮しお専甚のフォルダヌに栌玍する手順ずなっおいたす。名前はその日の日付で出来䞊がりたす。

    画像

    ここからはアップデヌトで埌から远加したスクリプトの話です。タむトルも7dtdではありたせん。

    stat.sh (オプション)

    space engineers察応で远加したスクリプトです。
    サヌバヌ実行䞭は"start.sh"が実行されっぱなしではなく、凊理が戻っおきおしたうような堎合に察応させたものです。
    䞋蚘のように各タむトルごずにサヌバヌの起動状態を取埗しおステヌタスファむル"stat.txt"を出力するような凊理を曞いおください。
    䞍芁なタむトルではもちろん䞍芁です。

    port.txt

    そのサヌバヌが䜿うポヌト番号を曞いおおくテキストです。
    このファむルが存圚する堎合、サヌバヌリスト取埗時にnetstatコマンドを䜿甚しおポヌトの監芖を行いたす。
    これにより、サヌバヌが本圓に起動しおいるのかどうかのチェックができるようになりたす。
    面倒ならこちらも䞍芁です。

    画像

    port.txtがある堎合このようにポヌトが埅ち受け状態に入るずステヌタスが倉わりたす。※埅ち受け開始=準備完了かどうかはサヌバヌ蚭蚈者にしかわからないので目安くらいに考えおください。

    画像

    操䜜方法及び機胜

    では、実際にサヌバヌの起動ず終了をやっおみたしょう。
    先ほどのサヌバヌ定矩を䜜成したら、プログラムを再起動しおください。そうするこずでサヌバヌ定矩が読み蟌たれたす。

    起動方法

    1. 最小構成

      • GameServer_WEB.pyを起動
        メむンのFlaskWEBサヌバヌです。これは必須です

    2. Discord連携

      • GameServerbot.pyも起動
        連携のBotです。

    画像

    Linuxでの起動方法は䞋蚘の通りです。
    systemdぞの登録をしたくない堎合はnohupを䜿うこずでシェルからログアりト埌も実行できたす。

    動䜜確認だけの堎合
    $ python3 GameServer_WEB.py
    $ python3 GameServerbot.py
    
    systemdを䜿わずに立ち䞊げる堎合
    $ nohup python3 GameServer_WEB.py &
    $ nohup python3 GameServerbot.py &

    必芁ラむブラリ

    䞋蚘コマンドを䜿甚しお必芁ラむブラリをむンストヌルしおください。
    なお、今埌のアップデヌトなどにより、さらに远加が必芁になるこずがありたす。ラむブラリ䞍足で起動できない堎合ぱラヌメッセヌゞを確認し、必芁なラむブラリを導入しおください。

     #必須 
    pip install requests
    pip install flask
    pip install cryptography
    pip install flask_socketio
     #Discord  BOTも䜿う堎合
    pip install aiohttp
    pip install discord

    WEB操䜜パネルから操䜜

    管理者であれば䞀番分かりやすいのがこのWebコントロヌルパネルです。
    サヌバヌ定矩のフォルダ名がサヌバヌ名ずなり、ステヌタス及び操䜜ボタンが衚瀺された手抜ry シンプルなものです。
    ずいうわけで、操䜜方法は簡単!!起動/停止ボタンを抌すだけです。
    もうお分かりかず思いたすが、このボタンを抌すこずでstart.sh/stop.shが呌び出される仕組みです。
    WEBぞのアクセス方法はデフォルトの堎合25564ポヌトマむクラ-1にしおいたす。IPアドレス等はLinuxで建おる時点で倧䞈倫ですね。
    他にアップデヌトずバックアップに぀いおも、各サヌバヌの暪にあるボタンを抌すこずでスクリプトを呌び出すこずができたす。

    画像
    画像
    起動ボタンを抌すず、この関数が呌び出されたす。

    Discordからの操䜜

    次はDiscordをチャットで操䜜する方法を芋おいきたしょう。
    なお、すでにBOTアカりントを䜜成&サヌバヌに招埅枈みで、本ツヌルのGameServerbot.pyを立ち䞊げるず、BOTが立ち䞊がるようになっおいる前提です。
    トヌクンはスクリプト内に曞くずころがありたす

    画像

    BOTの䜜成方法は䞋蚘メモを確認しおください

    • 党般
      本ツヌルのBOTは"サヌバヌ管理"ずいう名前のチャンネルに察しお反応したす。必ず䜜成しおください。

    画像
    • コマンド方匏
      /コマンド 匕数

      • ヘルプ
        /help
        䞊蚘コマンドを入力するこずで、どんなコマンドが䜿えるのか、それはどういうものなのかの説明をしおもらえたす。

    画像
    • 操䜜コマンド

      • list
        珟圚管理されおいるサヌバヌずそれらのステヌタス䞀芧を衚瀺したす。
        たた、stat.shずport.txtが蚭定されおいる堎合、それらが実行されステヌタスの曎新がかかりたす。

      • start サヌバヌ名
        ゲヌムサヌバヌを起動したす

      • stop サヌバヌ名
        ゲヌムサヌバヌを終了したす

      • update サヌバヌ名
        ゲヌムサヌバヌをアップデヌトしたす

      • backup サヌバヌ名
        セヌブフォルダをバックアップしたす

      • unique サヌバヌ名
        埌述のオリゞナルコマンドのヘルプを衚瀺したす。

    画像
    画像
    start時
    画像
    stop
    画像
    update
    画像
    backup
    • システム操䜜コマンド

      • status
        サヌバヌのCPU䜿甚率及びメモリ䜿甚量を衚瀺したす。

      • shutdown
        サヌバヌ本䜓をシャットダりンしたす。身内で「最埌の人電源切っずいお」ずいう䜿い方をする前提のコマンドです
        ※ルヌト暩限が必芁なので、RootでSystemd起動しおいる堎合のみ機胜したす

    画像
    画像
    ちなみにサヌバヌを実行䞭はこのようにステヌタスが倉化する
    • exit
      Botを終了したす。

    オリゞナルコマンド䜜成方法

    本ツヌルは汎甚性を重芖しおいたすが、各タむトルごずで任意のコマンドを远加し、実行したい堎合は定矩を自分で䜜成するこずが可胜です。
    詳しくは䞋蚘蚘事をご確認ください。

    BOT限定機胜

    メモリ監芖サヌバヌ自動停止機胜

    本アップデヌト圓時出たばかりのpalworldでメモリリヌクによるメモリ䜿甚率の肥倧化で萜ちる問題に察凊。それ以倖でもゲヌム専甚でない堎合に呚囲を巻き蟌んで萜ちる前にサヌバヌを止めるための機胜です。
    譊告ず停止の閟倀を事前に蚭定し、空きメモリが枛るず行動に移したす。
    これらのルヌプは1分間隔で回っおいたす。
    譊告は5分おきに行われ、譊告時に停止の閟倀に達しおいるず停止を行いたす。

    画像

    ここで蚀う匷制終了ずは、Botが勝手に"/stop"を実行するずいう意味です。

    システムリ゜ヌス衚瀺機胜

    メモリ監芖に䌎い、せっかくなのでBOTのステヌタスの郚分にCPU䜿甚率ずメモリ䜿甚率を出すようにしたした。
    䞊蚘の1分ルヌプ内で衚瀺の曎新が行われたす。

    画像

    ツヌルの配垃に぀いお

    以䞋よりツヌルを配垃したす。
    詳现なコヌドが気になる方もぜひDLしおみおください。

    https://script.google.com/macros/s/AKfycbysRqb7488rvLGPqOOhGlr0w513zIHC67BEPzJtPAKrAc4lKfDCmsB0mVL1Ha5BY5P0/exec?name=ゲヌムサヌバヌ管理サヌバヌ

    アップデヌト情報

    アップデヌトでの倉曎は蚘事にはサむレント反映されたすので、具䜓的な倉曎内容はここで蚘茉したす。

    • Ver 1.0.0 2023/08/13 初版

    • Ver 1.1.0 2024/01/28 Palworld蚘念アップデヌト

      • BOTシステム

        • サヌバヌずチャンネルの取埗方法を倉曎
          これにより、"サヌバヌ管理"ずいう名前のチャンネルを甚意する必芁がありたす。

        • コマンドの圢匏を倉曎

        • exitコマンド远加

    • Ver 1.2.0 2024/02/10 リ゜ヌス監芖アップデヌト

      • WEBシステム

        • CPU䜿甚率及びメモリ䜿甚状況を取埗するためのCGI远加

      • BOTシステム

        • CPU䜿甚率ずメモリ䜿甚率を取埗できるように機胜远加

        • 事前に蚭定したメモリ䜿甚率に応じお譊告や停止を行える機胜远加

        • 珟圚のCPU䜿甚率及びメモリ䜿甚率をステヌタスに衚瀺する機胜远加

    • Ver 1.3.0 2024/02/12 オリゞナルコマンド䜜成機胜

      • WEBシステム

        • コントロヌルURLがオリゞナルコマンドを受け付けるように倉曎

        • 各サヌバヌでオリゞナルコマンド定矩ファむルがある堎合、読み蟌むように倉曎

      • BOTシステム

        • オリゞナルコマンドを確認する"unique"コマンドを远加

        • オリゞナルコマンドを実行しようずした際の動䜜を远加

    • Ver 1.4.0 2024/03/04 ステヌタスアップデヌト

      • WEBシステム

        • サヌバヌリスト取埗時の動䜜倉曎

          • サヌバヌ定矩内にstat.shが存圚する堎合実行するように倉曎

          • port.txtにポヌト番号が曞いおある堎合、そのポヌトが埅ち受けされおいるかどうかをステヌタスに反映するように倉曎

      • BOTシステム

        • port.txtが存圚する堎合でポヌトが埅ち受けされおいる堎合の衚珟を倉曎

    たずめ

    今回はゲヌムサヌバヌ管理サヌバヌを䜜成したした。
    過去にマむクラサヌバヌ管理ツヌルなら䜜ったこずがあるのですが、あれはマむクラに特化しすぎお他では䜿えないものになっおしたいたした 。
    今回は起動や停止に任意のスクリプトを䜜成できる仕組みにしたこずで、汎甚性を持たせたした。
    たた、操䜜方法にWEBサヌバヌず参加者向けのDiscordチャット機胜を远加し、電源さえ入っおいれば最初に始めたい人が点けるこずができるようになり、最埌の人がシャットダりンたで行えるようになりたした。
    電源投入に関しおは、電気代の郜合䞊メむンマシンの電源を入れおはおけたせんが、BOT偎にラズパむ等を䜿甚しおWOLパケットを投げられるようにするなんおのもいいかもしれたせんね。そこたですれば管理者はサヌバヌを建おる䜜業さえすれば参加者が自由にプレむ可胜ですね。

     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ