オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-10-02

Pumpkin を Cloud Foundry で動かす

「Cloud Foundry 百日行」第71日目、本日のアプリは Pumpkin 。これは Web サイトのコメントシステム。オンラインで Web サイトを紹介し、それに対して他人がコメントし、また評価する、というものです。

基本情報

手順の概要は以下の通りです。

  • 1) ソースコードの取得
  • 2) アプリのデプロイ
  • 3) 動作確認

1. ソースコードの取得

まずはソースコードを取得します。

~$ git clone https://github.com/fananta/Pumpkin
~$ cd Pumpkin/
~/Pumpkin$ ls
backend.js  index.html  jquery-1.9.0.min.js  lightpaperfibers.png  README.md  test_URLs.txt

2. アプリのデプロイ

参考資料の Pumpkin – ユーザモデレーション型のオープンなコメントシステム では、「Pumpkin は node 製で、backend.js を立ち上げれば使えます」とあります。
その通りにデプロイしてみましょう。

~/Pumpkin$ cf push pump -b nodejs_buildpack -c 'node backend.js'
Creating app pumpkin in org ueno / space test1 as ueno...
OK

Creating route pumpkin.10.244.0.34.xip.io...
OK

Binding pumpkin.10.244.0.34.xip.io to pumpkin...
OK

Uploading pumpkin...
Uploading app files from: /home/ueno/Pumpkin
Uploading 24.4K, 4 files
Done uploading               
OK

Starting app pumpkin in org ueno / space test1 as ueno...
-----> Downloaded app package (172K)
-------> Buildpack version 1.3.1
       Node.js Buildpack v64
-----> Reading application state
       package.json...
       build directory...
       cache directory...
       environment variables...
       Node engine range:   unspecified
       Npm engine:          unspecified
       Start mechanism:     none
       node_modules source: none
       node_modules cached: false
       NPM_CONFIG_PRODUCTION=true
       NODE_MODULES_CACHE=true
       Downloading and installing node 0.12.2...
       Using default npm version: 2.7.4
-----> Building dependencies
       Skipping dependencies (no source for node_modules)
-----> Checking startup method
       None found
cat: /tmp/staged/app/Procfile: No such file or directory
-----> Build failed
       WARNING: Node version not specified in package.json
       WARNING: No package.json found
       WARNING: No Procfile, package.json start script, or server.js file found
-----> Finalizing build
       Creating runtime environment
       Cleaning previous cache
       Caching results for future builds
-----> Build succeeded!
       /tmp/staged/app
       └── (empty)
       WARNING: Node version not specified in package.json
       WARNING: No package.json found
       WARNING: No Procfile, package.json start script, or server.js file found
-----> Uploading droplet (9.3M)

0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 down
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 down
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 starting
0 of 1 instances running, 1 down
0 of 1 instances running, 1 failing
FAILED
Start unsuccessful

TIP: use 'cf logs pumpkin --recent' for more information

アプリは起動しませんでした。

ログには、

2015-10-01T16:26:12.05+0900 [App/0]      OUT Server running at http://127.0.0.1:30925/
2015-10-01T16:27:12.02+0900 [DEA/0]      ERR Instance (index 0) failed to start accepting connections

と出ています。
サーバに接続できていない可能性がありますね。

デプロイ時に実行させる backend.js の中身を見てみましょう。


:

/* optionally set port using first command line arg, default=30925 */
var args = process.argv.splice(2);
var port = parseInt(args[0]);
if (isNaN(port)) port = 30925;

:

上記によると、 backend.js は第1引数で、listen するポートの情報を与えることになっているが、その指定が無いと、デフォルトのポート番号 30925 で処理されるようです。
それがエラーになっているので、ポートを動的に処理させる必要がありそうです。
そのため、PORT 環境変数を使って、 backend.js の引数で指定してデプロイしてみます。

~/Pumpkin$ cf push pumpkin -b nodejs_buildpack -c 'node backend.js $PORT'

:

-----> Uploading droplet (9.3M)

1 of 1 instances running

App started


OK

App pumpkin was started using this command `node backend.js $PORT`

Showing health and status for app pumpkin in org ueno / space test1 as ueno...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: pumpkin.10.244.0.34.xip.io
last uploaded: Thu Oct 1 09:14:16 UTC 2015
stack: cflinuxfs2
buildpack: nodejs_buildpack

     state     since                    cpu    memory          disk      details   
#0   running   2015-10-01 06:14:29 PM   0.0%   18.7M of 256M   0 of 1G   

アプリ起動しました。

3. 動作確認

ブラウザからアプリにアクセスします。

TextLink に入力して Submit
反映されました。
Web サイトを紹介して、その評価を求めます。

add reply をクリック、コメント入力すると、それも反映されます。

その表示されたコメントの左側に 印が付きますが、これは「いいね」ボタンのように、クリックすると、1票を投じることができるボタンになっています。
下記は、既に1票が入った状態で、 1 votes となっています。

Web サイトもコメントも複数登録できます。

まとめ

今回のアプリのデプロイは最初、Node のサーバへの接続ポートが合わず、アプリ起動に失敗しました。そして、PORT 環境変数を使って動的に対応させることでアプリが無事起動しました。環境変数を使った動的な対応というと、類似したものに DB 接続もありましたね。これらはクラウドのアプリに特有の事象です。つまり、オンプレの固定的環境ではなく、自らの使い方、あるいは、外的要因により環境に変化が生じるのがクラウドですから、その動的対応を間違わなければクラウドをうまく使いこなすことにつながります。これは Twelve-Factor App にもその一項目( III. 設定 )として謳われています。

さて、本日のアプリはオンラインの Web サイト紹介•コメントシステムでした。もちろん一般の Web サイトのレコメンドや評価がこのアプリでできますが、その他例えば、開発したアプリや Web のデザインを関係者間でレビューすることにも使えそうですね。

今回使用したソフトウェア