極力安く・極力楽にNS運営してみた!

はじめに

皆さんこんにちは。AhozuraNS主催者の師岡霞(M_Kasumi)と申します。

昨年発足した我々AhozuraNSは、2021年2月現在 3期目に突入しております。

この記事では、私が人生で初めてNS (Net Simutrans) を運営してみて、苦労したポイントやその解決策、所感などを無造作に綴っております。

技術的な側面よりも運営者としての苦労などに重点を置いた内容になっております。これからサーバを建ててみたいという方の参考になれば幸いです。

それでは、少し長くなってしまったのですが、お付き合いいただければと思います。

AhozuraNS あらまし

現在、AhozuraNSは私がサーバを運営しておりますが、1期は京津三条氏の自宅で、2期は笠岡氷霞氏の自宅で、それぞれサーバを建てていました。

2期までの私はあくまでも「メンバーを集めただけの人」という立場だったのですが、3期目からはとうとう名実ともにAhozuraNSの主となったわけでした。

さて、我が家ではセキュリティー上の理由からポートを開放することができず、自宅でサーバを建てることはできません。

そこで今回は、格安VPSサービスと契約することにしました。

VPSとは、簡単に言うとコンピュータを借りることができるサービスです。大きな土地が1つの大きなコンピュータだとすると、それを区画ごとに区切って貸し出す不動産屋がVPSサービス……という喩えでわかってくださる方は凄いと思います。まあVPSの何たるかはそこまで重要ではありません。要はコンピュータを借りることができるサービスです。

また、1期・2期とNetSimutransを行ったうえで、以下のような課題が浮上していました。

  • セーブされていない状態でサーバが落ちると、作業が水の泡になることがある。
  • サーバ主の不在時にサーバが落ちることがある。
  • アドオンの追加作業が面倒。

今回サーバを運営するにあたっては、これらの課題も解決し、より安定的にNSを運営できるようにしました。

VPS契約から稼働開始まで

格安VPS

今回私が契約したのは「Vultr」というVPSサービスです。Vultrは海外のサービスですが、東京のサーバを借りることができるため人気があります。

そして、何と言ってもVultrは安い!

Vultrでいちばんスペックの低いVPSを借りる場合、日本で一番メジャーな「さくらVPS」で同程度のものを借りた場合の半額以下で済みます。

具体的には、RAM1GBで5ドル/月。現代のコンピュータとしては貧弱ですが、Simutransのサーバ程度なら難なくこなしてくれます。(※途中からこなせなくなりました。詳しくは後述)

入金後、サーバの立地とOSとスペックを選べばすぐにでもサーバを建てることができます。

OSはUbuntu18.04を選択。おそらくSimutrans本体の問題だと思うのですが(未検証)、最新版のUbuntuではSimutransが動かなかったため、一世代前になっています。

サーバを契約すると、IPアドレスが発行されます。サーバに接続するときに必要となる情報ですので、控えておきましょう。

本体のビルド

ダウンロード後すぐに遊べるWindows版と違い、UbuntuなどのLinuxでSimutransを動かすためには、動かせるようにするための作業(ビルド)を自分で行わなければなりません

今回は、以下の記事を参考にさせていただきました。非常に詳細に書かれていますので、ビルドの仕方についてはこちらをお読みください。

ちなみに、うちのサーバではOTRPを使用しています。とはいえ、やり方は基本的に一緒です。

aliasの登録

Simutransの起動は以下のコマンドで行います。(****の部分は任意のパスワード)

./simutrans -server 13353 -server_admin_pw **** -objects pak128japan

長いっすね。

aliasに登録して、一発で叩き起こせるようにしましょう。

aliasとは、予めコマンドとその短縮形を登録しておくことでコマンドを短縮することができる、Linuxの機能です。

alias自体は、以下のコマンドで簡単に登録することができます。

alias start='/home/なんたらかんたら/simutrans/simutrans -server 13353 -server_admin_pw **** -objects pak128japan'

Simutransのファイル名はフルパスで書く必要があることに注意。なんたらかんたらのとこです。以下、本記事内に登場する「なんたらかんたら」は、ご自分のフルパスに置き換えてお考え下さい

これで、「start」というコマンドでSimutransのサーバを稼働することができるようになりました。

ただし、このままではサーバを再起動するとaliasが消えてしまいます。

なので、「bashrc」を編集していきます。「bashrc」は「ログインするたびに読み込まれるファイル」とでも思えばとりあえずOKです。

まずは、以下のコマンドを実行し、bashrcを編集します。

vim ~/.bashrc

誰ですか、emacsを使えとか言ったのは

以下の文章をbashrcに追記します。

alias start='/home/なんたらかんたら/simutrans/simutrans -server 13353 -server_admin_pw **** -objects pak128japan'

これを保存すれば、とりあえずはオッケーです。

ターミナルから「start」を叩けば、サーバが稼働を開始します。

先ほど控えたIPアドレスに「:13353」をつけたアドレスで、ゲームに接続することができるようになりました。

自動セーブ・バックアップの実装

先述した問題「セーブされていない状態でサーバが落ちると作業が水の泡になることがある」を解決するために、一定間隔で自動的にセーブが行われるようにしたいと思います。

あと、Simutransでは極稀に「セーブデータがぶっ壊れて開けなくなる」なんてことがあります。考えただけでも恐ろしいですね。

これを防ぐためにも、セーブが終わったらそのセーブデータを別の場所へバックアップしておきたいと思います。こうすれば、仮に最新のデータがぶっ壊れたとしても、壊れる直前の無事なデータが残るため、被害を最小限に抑えることができます。

Linuxの便利機能の一つ、「cron」を使って実装していきます。cronとは、指定したコマンドを定期的に実行できる機能です。

もうお分かりですね?cronに、「Simutransをセーブさせるコマンド」を定期的に実行させればいいのです。

nettoolについて

セーブ機能を実装する上で欠かせないのが、「nettool」です。nettoolとは、Simutransに付属している、ネットゲーム制御用のプログラムです。

詳しくは以下のサイトをご覧ください。

nettoolを使うと、Simutransをセーブしたり、接続している人の一覧を取得したりすることができます。この機能を利用して、自動セーブを実装していきたいと思います。

自動セーブ用のコマンド

nettoolを利用してセーブを実行するコマンドは以下の通り。****は起動の時に使ったパスワードです。

/home/なんたらかんたら/simutrans/nettool -p "****" force-sync

これを実行すると、simutransディレクトリの直下に「server13353-network.sve」というセーブデータが保存されます。

このセーブデータを、バックアップのためにsimutransディレクトリ内の「save」フォルダにコピーするコマンドは以下の通り。名前が重複しないよう、ファイル名にタイムスタンプをつけてコピーしています。

cp -f /home/なんたらかんたら/simutrans/server13353-network.sve /home/なんたらかんたら/simutrans/save/server13353-network-`date "+%Y%m%d%H%M%S"`.sve

次に、上記2つのコマンドをまとめます。

「autosave.sh」というファイルを作り、以下の内容を書き込みます。

/home/なんたらかんたら/simutrans/nettool -p "****" force-sync
wait
sleep 10
cp -f /home/なんたらかんたら/simutrans/server13353-network.sve /home/なんたらかんたら/simutrans/save/server13353-network-`date "+%Y%m%d%H%M%S"`.sve

先程の2種類のコマンドのほかに「wait」「sleep 10」が入っています。セーブに時間がかかることを想定して、10秒間待ってからバックアップを実行するためのコマンドです。スペックが低いVPS上で稼働している関係上、たまにセーブが完了するより先にコピーが始まってしまうことがあり、これを回避するねらいです。経験上、10秒も待てば大丈夫です。

cronに登録

先程作ったautosave.shをcronに登録していきます。

crontab -e

というコマンドを実行します。

エディタ画面が出てきますので、15分おきに自動セーブを行う場合は、

*/15 * * * * /home/なんたらかんたら/autosave.sh 

と登録します。

もし15分おきではない間隔で自動セーブを行う場合は、「*/15」の部分を、30分おきなら「*/30」にするなど、お好きな間隔に変えてください。

但し、これは個人的な経験則ですが、15分間隔ぐらいがちょうどいいと思います。

これで自動でセーブとバックアップが実行されるようになりました。

NS支援Discord botを作る

Simutransの再起動機能

ここまで書いてきたような状態で運営していたところ、しばらくは安定的に稼働できていたのですが、やはり何回か落ちてしまうことがありました。

管理者(私)がいる時なら手動で再起動すればいいのですが、バイトなどで不在時にサーバが落ちてしまうと、その間NSのメンバーは遊ぶことができないということになります。

そこで、メンバー同士でのコミュニケーションに使っているSNS「Discord」にbotを常駐させ、そのbotにSimutransの再起動をさせればいいのでは?という考えに至りました。

ということで、さっそくbotを作ることに。

botの作業の流れは以下の通り。

①Discord上でメンバーから「再起動」のコマンドを受け取る。

②VPSと通信し、Simutransの稼働状態を確認。

③Simutransが落ちていれば起動する。

botの作成にはPythonのライブラリ「discord.py」を使用。

VPS上ではメモリが足りずbotを動かせなかったため、botは自宅のRaspberryPi上で動かし、必要に応じてVPSと通信させることにしました。VPSとのSSH接続には「paramiko」を利用しました。

注意すべき点として、PythonのプログラムでSSH接続を行った状態で普通にSimutransを起動しただけでは、SSH接続が切れた時点でSimutransも終了してしまいます。そのため、「nohup」というコマンドを使って以下のように実行する必要がありました。

import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.WarningPolicy())
ssh_client.connect("114.514.364.364",username="なんたら",password="****", timeout=10.0)
stdin, stdout, stderr = ssh_client.exec_command('nohup /home/なんたらかんたら/simutrans -server 13353 -server_admin_pw **** -objects pak128japan > simutrans.log &')

botの稼働は、以前私のブログで紹介した方法で行っています。

実際に稼働させてみた状況はこんな感じ。

Discord botからSimutransを再起動する様子

「^reboot」というコマンドを受け取ったbotが、サーバを再稼働させることに成功しました。(スクリーンショットだけではわかりませんが、実際に再起動に成功しています)

もちろん、サーバの管理人以外でも再起動を行うことができます。

アドオン追加支援機能

これで再起動の問題はひとまず解決しました。ですが、せっかくならもっと運営を楽にしたい!ということで、もう一つ機能を追加することにしました。

NetSimutransでは、参加者とサーバ側の全員が同じアドオンを過不足なく入れている必要があります。そのため、新しいアドオンを追加する際は、サーバ管理者がアドオンを取りまとめ、サーバにアドオンを追加するタイミングでメンバー全員が一斉に追加作業を行います。

AhozuraNSでは、アドオンを制作する人が多いということもあり、割と頻繁にまとまった量の追加作業が発生します。その追加希望の受付はこれまで、Discord上でこのように行っていました。

従来はこれを手作業で取りまとめていた

サーバ管理者は、こうやって思い思いに投げられたアドオンを1個1個ダウンロードしてサーバに転送するわけです。めんどくさい!

ここで、ひらめくわけです。

アドオン追加用チャンネルに投げられたアドオンを、botに取りまとめさせたらラクじゃね?」と。

というわけで、先ほどのbotに機能を追加しました。

botの行う作業はいたってシンプルで、以下の通り。

①「追加用」チャンネルにアドオンが投げられたことを確認。

②アドオン以外なら無視。アドオンファイルなら、ファイルが重複していないことを確認しダウンロードする。アドオンをキューに追加する。

実際に稼働している様子が以下の通り。

アドオン追加支援機能が稼働している様子

これで、私の手間は殆どなくなりました。私のやることは、「キューにある程度アドオンが溜まった頃合いを見計らって、溜まったアドオンをzipにして配布すること」だけになりました。

参加者のやることは今までとまったく同じで済む、というのも良い点だったかなと思います。

その他の機能

そのほか、接続先IPアドレスの確認やpakセットダウンロードURLの確認など、NSをやっているうえでたまに話題に上るような機能を実装しました。

全貌は以下の通り。

機能の全貌

幸い、これらの機能はAhozuraNSのメンバーに定着し、有効に活用してもらえています。

その他の苦悩

VPSのスペックが足りなくなった!

当初、RAM1GBのプランで稼働していたAhozuraNSですが、街の数が増えるにつれて動作が不安定になり、2021年2月、ついに1ランク上のスペックに上げることとなりました。

以前現在
RAM1GB2GB
1ヶ月あたり価格5ドル10ドル

月あたり500円ぐらい持ち出しが増えました。悲しいなあ……

Vultrならスペック上げても安いのでまだ助かっているんですけどね。

で、メンバーにふざけて口座番号を開示して寄付を募ったところ、匿名の2名から合計501円の寄付がありました。誰?

ドカドカ街を作るとこうなるようなので、安く安定したサーバ運営をされたい方は、街の数に制限を設けるなどを検討されるとよろしいかと思われます。

おわりに

いかがでしたか?だいぶ駆け足になってしまったかと思いますが、参考になれば幸いです。

なお、botのコードなどを所望される方がいらっしゃいましたら、私のTwitterまでお声かけいただければ、数日で対応できると思います。

それでは、よいSimutransライフを。

参考になりそうな記事

本文で紹介したもののまとめです。

コメント

  1. […] 極力安く・極力楽にNS運営してみた! – AhozuraNS Simutrans Laboratory […]

タイトルとURLをコピーしました