LLD(石鍋試験鯖)の内側

この記事は Roguelike Advent Calendar 2015 の9日目の記事です。

そもそも何それ?

石鍋試験鯖はDungeon Crawl Stone Soup(以下DCSS)というローグライクゲームをブラウザ上でオンラインプレイ、観戦、プレイ履歴管理などを行うために動いているサーバのうちの一つです。
DCSS公式オンラインサーバに参加しており、ここでの略称としてLLD(lazy-life.ddo.jp)と呼ばれています。

まずはアクセスしてみましょう。ユーザ登録をしなくても(誰かがプレイしていれば)観戦は可能です。*1

Games currently running欄のユーザ名をクリックすると観戦スタートです。ESCキーで抜けます。

サーバについて

さくらのVPS 1Gプラン(HDD)を使用しています。
最小限動作させたいだけなら512プランでもよさそうですが、ttyrecを保存しておくならディスク容量20Gは厳しいです。

OSはUbuntu Server 12.04 LTSを選択し使っています。開発チームのサーバがdebian系のようなので、ドキュメントを参考にするにもはまりが少なさそうです。
12.04 LTSもそろそろサポート終了が近づいてきましたので(LTSは5年サポートです)いずれ14.04か16.04に更新する予定です。

サーバプログラムについて

DCSSは公式の配布物にサーバプログラムが含まれ、ユーザ管理、ゲームプレイ、観戦といった基本機能が備わっています。
とはいえそれだけでは不便なので、石鍋試験鯖ではサーバを改造して独自機能を実装しています。現在の所、以下の機能があります。

  • 最新版以外の別バージョンの起動
  • ダンプテキスト(中断/クリア/死亡時のプレイヤー情報)の表示機能
  • バージョン別ローカルスコアランキング画面
  • サーバを停めない形でのお知らせ欄の更新

ゲーム本体には改造を加えていないため、難易度への影響はありません。
また、変更履歴はGithubで公開しています。*2

Apache

公式サーバに参加しているため、定期的にクローラによりプレイ状況がcrawl.akrasiac.orgに反映されています。
しかし、順次追記されていくプレイ結果ログ(trunkのログで現在12Mあります)を毎回全部読み込むのは得策ではないため、クローラではRange-Requestによる差分閲覧機能が用いられています。
ゲームサーバ側でこれを実装するのは少々面倒だったため、既にWebサイト用に動いているApacheに処理を丸投げしています。

クローラ用にプレイング情報を公開しているURLはこちら。

ゲームディレクトリ 〜trunk編〜

最新バージョン*3を追いかけるリポジトリは3つ置いています。

  1. ゲームサーバ用(改造内容をgit管理)
  2. 現行バージョン用(サーバ上で動いてるのはこちら)
  3. 更新バージョン用(更新時にバックグラウンドでコンパイルを行い、更新時に2. と切り替える)

最新バージョンは普段のプレイ人口が一番多く、コンパイル時に5〜10分程度プレイできない時間が発生するためこのような運用にしています。

ディレクトリ構成はこのような感じです。

/path/to/repositories/crawl/crawl-ref/source/ ……サーバプログラム用

/path/to/repositories/crawl/@dcss-git ……ゲーム用
                               └――┐(シンボリックリンク)
/path/to/repositories/dcss-trunk1/crawl-ref/source

/path/to/repositories/crawl/@dcss-backyard ……バックグラウンド更新用
                               └――┐(シンボリックリンク)
/path/to/repositories/dcss-trunk2/crawl-ref/source

更新時はバックグラウンドでのコンパイルが終わった後でdcss-gitの参照先をdcss-backyardが指している先(ここではdcss-trunk2)に変更し、dcss-backyardの参照先をさっきdcss-gitが指していた方(ここではdcss-trunk1)に移します。

ゲームディレクトリ 〜過去バージョン編〜

石鍋試験鯖では最新バージョンのほか、0.13、0.14、0.15、0.16、0.17の過去バージョンも選択して遊べるようにしています。

バージョンそれぞれにブランチを切り替えたディレクトリを用意し、シンボリックリンクを張ってサーバプログラムから参照できるようにしています。

/path/to/repositories/crawl/@dcss-0.17 (stone-soup_0.17ブランチ)
                                └-┐
/path/to/repositories/dcss-0.17/crawl-ref/source/
     :
     :

リリース済のバージョンではゲーム用ファイルの構成が変わることはほぼないため、更新時もそのままコンパイルすればよく、ゲーム開始できない時間は発生しません。

設定ファイル・セーブファイルディレクト

設定ファイル・ttyrecファイル群は通常/path/to/repositories/crawl/crawl-ref/source/rcs、セーブデータは/path/to/repositories/crawl/crawl-ref/source/savesに置かれます。
しかしttyrecファイル群は総容量が大きいため直下に置くと差分バックアップ/ダウンロードが時間がかかるのと、セーブデータも各バージョンごとに散らばっているとデイリーバックアップが面倒なためそれぞれ別ディレクトリに置いてシンボリックリンクを張っています。
以下のような感じです。

/path/to/repositories/crawl/crawl-ref/source/@rcs
                          ┌―――――――――┘
/path/to/backup/rcs/dcss-git-rcs/

/path/to/repositories/dcss-0.17/crawl-ref/source/@rcs
                          ┌―――――――――――┘
/path/to/backup/rcs/dcss-0.17-rcs/
     :
     :

/path/to/repositories/crawl/crawl-ref/source/@saves
                           ┌―――――――――┘
/path/to/backup/saves/dcss-git-saves/

/path/to/repositories/dcss-0.17/crawl-ref/source/@saves
                           ┌―――――――――┘
/path/to/backup/saves/dcss-0.17-saves/
     :
     :

お知らせ機能

ロビーの文面を変えるのは通常ではサーバを再起動する必要がありますが、お知らせ欄だけ変えるのにサーバを再起動するのもなんなので、ローカルのファイル内容をjQuery経由で読み取って更新するように改造しました。ロビーを開きっぱなしでも5分ごとに更新されます。

サーバの立て方およびトラブルシューティング

試験鯖運用のためのメモがあるため以下のリンクを読んでください。

最後に

石鍋試験鯖は今後も無料で利用可能で、広告等の利用も現在の所予定しておりませんが、カンパによる支援を募集しております。
下記のサイトで15円から手数料無料でカンパを送付することができます。

カンパいただけることで今後の励みになります。よろしくお願いします。


明日の記事はargrath氏による「NetHack 3.6.0を3.5.0(仮)と較べてみる」です。


*1:チャット機能はユーザ登録してログインしないと使えません

*2:現在の所最新を反映していません。あとで更新します

*3:正確には最新ではなく、直近でchangelog更新されたリビジョン