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つ置いています。
最新バージョンは普段のプレイ人口が一番多く、コンパイル時に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(仮)と較べてみる」です。