「Cloud Foundry 百日行」第79日目は、Node.jsで動く多人数参加型ゲーム、 WizardWarz です。
基本情報
今回の手順の概要は以下の通りです。
- 1) ソースコードの入手
- 2) ソースコードの修正
- 3) Cloud Foundryへのデプロイ
- 4) 動作検証
なお、今回のアプリケーションにはWebSocketが使われています。
Proxyを跨いだ先にCloud Foundryの環境を構築している方は今回のアプリケーションが正常に動作しない可能性がありますので、ご了承下さい。
1. ソースコードの入手
githubからcloneしてきます。
$ git clone https://github.com/lallassu/wizardwarz
~
$ cd wizardwarz
wizardwarz$ ls
css fonts icons images index.html js LICENSE models promo.png README.md
Githubの README を見てみると、Node.jsのアプリケーションのようです。
2. ソースコードの修正
では、Cloud Foundry上で動作するようにソースコードの修正を行っていきます。
修正済みのコードも こちら に用意しておきましたので、これを用いれば手順3までスキップできます。適宜ご利用下さい。
package.jsonファイルの作成
Cloud Foundryにデプロイする際に「このアプリはNode.jsのアプリである」と認識させるために、 package.json
ファイルを作っておきましょう。
これは本来Node.jsのパッケージ管理ツールであるnpmの設定ファイルに当たるものですが、今回は特に管理する必要のあるパッケージは存在しないので、 npm init
の後Enterキー連打でOKです。
wizardwarz$ npm init
~
wizardwarz$ ls
css fonts icons images index.html js LICENSE models package.json promo.png README.md server sounds textures
起動ポート番号の指定
さて、次にアプリが起動する際のポート番号を正しく取得できるように指定します。
現在の起動ポート番号は 8080
の固定値になっているので、Cloud Foundry上で起動した際の数値を環境変数 PORT
から取れるようにしてみましょう。
wizardwarz$ vi server/server.js
~
//======================================================
// Configuration
//======================================================
var version = "0.1";
var port = process.env.PORT || 8080;
~
wizardwarz$ git diff --no-prefix server/server.js
diff --git server/server.js server/server.js
index 94f1a64..11a8e03 100644
--- server/server.js
+++ server/server.js
@@ -10,7 +10,7 @@
// Configuration
//======================================================
var version = "0.1";
-var port = 8080;
+var port = process.env.PORT || 8080;
//======================================================
// Initialization
環境変数 PORT
がある場合はそこから値を取得、無い場合は従来通り8080を利用、という変更です。
自身を指定するアドレスの変更
さらにコードを読んでみると、 localhost:8080
を呼び出している箇所があります。
ここの値もデフォルトのままではアプリが正しく動かないので、修正します。
wizardwarz$ vi js/game.js
~
var net = new Net();
//net.Initialize("http://192.168.1.124:8080");
//net.Initialize("http://192.168.1.137:8080");
//net.Initialize("http://nergal.ipeer.se:8080");
//net.Initialize("http://nergal.se:80");
//net.Initialize("http://192.168.1.137:80");
//net.Initialize("http://localhost:8080");
net.Initialize(location.host);
~
wizardwarz$ git diff --no-prefix js/game.js
diff --git js/game.js js/game.js
index 56c94de..a4d6d79 100644
--- js/game.js
+++ js/game.js
@@ -43,7 +43,8 @@ var net = new Net();
//net.Initialize("http://nergal.ipeer.se:8080");
//net.Initialize("http://nergal.se:80");
//net.Initialize("http://192.168.1.137:80");
-net.Initialize("http://localhost:8080");
+//net.Initialize("http://localhost:8080");
+net.Initialize(location.host);
//$('#song').prop("volume", 0.8);
ちなみに、この js/game.js
というファイルはNode.jsのサーバーを構成するものではなく、アプリのユーザが動かすブラウザ上の index.html
から呼び出されるファイルなので、 アプリの環境変数 process.env
から取ってくる値は用いないことに注意して下さい。
Buildpack周りの修正
今回はNode.jsのアプリなのでNode.jsのBuildpackで動いてくれそうなものですが、Node.jsのBuildpackだけだとどうしても、sqlite3関連のライブラリが一部足りないというエラーを吐いてアプリが起動しない、という現象を回避できませんでした。
そこで今回は、好きなaptパッケージをインストールすることができる heroku-buildpack-apt というBuildpackを一緒に動かすことでデプロイを行いました。
これらの2つのBuildpackを同時に使うためにはこれまでの記事にも何度か登場した heroku-buildpack-multi を使います。
まずは heroku-buildpack-multi
で呼び出したいBuildpackを .buildpacks
ファイル内に記載します。
wizardwarz$ vi .buildpacks
https://github.com/ddollar/heroku-buildpack-apt#7954acd0aa932201377187402d8a0794f535c738
https://github.com/cloudfoundry/nodejs-buildpack#eaf93a153ccb1c7780457ca611c45311d95a6259
バージョンを固定するためにhashで指定をしています。
次に heroku-buildpack-apt
にapt-getしてきて欲しいパッケージ名を Aptfile
内に記載します。
wizardwarz$ vi Aptfile
sqlite3
libsqlite3-dev
これでOKです。
ちなみにNode.jsのBuildpackは package.json
ファイルを用意してあるので自動的に動いてくれます。
manifestファイルの作成
最後に manifest.yml
ファイルも作っておきます。
wizardwarz$ vi manifest.yml
---
applications:
- name: wizardwarz
buildpack: https://github.com/ddollar/heroku-buildpack-multi#c41ef671cc9c8ff7d5cc7ad412654fbf9cffbce5
command: cd server; node server.js;
3. Cloud Foundryへのデプロイ
ではCloud Foundry上へPushしてみましょう。
wizardwarz$ cf push
(一部略)
-----> Uploading droplet (54M)
1 of 1 instances running
App started
OK
App wizardwarz was started using this command `cd server; node server.js;`
Showing health and status for app wizardwarz in org ukaji / space default as ukaji...
OK
requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: wizardwarz.10.244.0.34.xip.io
last uploaded: Sat Oct 10 04:21:08 UTC 2015
stack: cflinuxfs2
buildpack: https://github.com/ddollar/heroku-buildpack-multi
state since cpu memory disk details
#0 running 2015-10-10 01:22:03 PM 0.1% 61.2M of 256M 0 of 1G
起動はOKです。
4. 動作検証
では払いだされたURLにブラウザでアクセスしてみます。
メイン画面はこちら。
NEWPLAYER
からプレイヤーを作ってログインしてみます。
遊び方は
- マウスカーソルで視点移動
- WSADでキャラクターを前後左右へ移動
- Mapに落ちているアイテムを拾って画面上の対応する数字キーで各種呪文を選択、マウスクリックで発動
といった感じのようです。
今回使用したソフトウェア
- cf-release (v211)
https://github.com/cloudfoundry/cf-release/tree/v211
( https://github.com/cloudfoundry/cf-release/tree/2121dc6405e0f036efa4dba963f7f49b07e76ffa ) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/552dc6869600c5350eb7ffb4fb9c9c5e79e3889d - CF CLI (v6.12.0-8c65bbd-2015-06-30T00:10:31+00:00)
https://github.com/cloudfoundry/cli/releases/tag/v6.12.0 - WizardWarz
https://github.com/Lallassu/wizardwarz/tree/fc5451c980c61698f59c11319e581cf8e43ee028 - heroku-buildpack-multi
https://github.com/ddollar/heroku-buildpack-multi/tree/c41ef671cc9c8ff7d5cc7ad412654fbf9cffbce5 - heroku-buildpack-apt
https://github.com/ddollar/heroku-buildpack-apt/tree/7954acd0aa932201377187402d8a0794f535c738 - nodejs-buildpack
https://github.com/cloudfoundry/nodejs-buildpack/tree/eaf93a153ccb1c7780457ca611c45311d95a6259