2015-07-13

Lockee を Cloud Foundry で動かす

「Cloud Foundry 百日行」第28日目は、 Lockee です。
こちらはWeb上でコインロッカー風にファイルを保存できるアプリケーションになります。

基本情報

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

  • 1) ソースコードの取得
  • 2) コードの修正
  • 3) Cloud Foundry 環境へのプッシュ
  • 4) 動作確認

1. ソースコードの取得

まずはいつも通りコードを取得しましょう。

$ git clone https://github.com/hbons/Lockee
$ cd Lockee
Lockee$ ls
config.json  covers.json  LICENSE.txt  lockee.service  package.json  public  README.md  server.js  tests  views

NodeJS製のアプリですね。

2. コードの修正

LockeeのReadme によるとこのアプリ、コードを取得してしまえば後は npm install npm start の2つのコマンドで起動できてしまうそうです。
実際にCloud Foundry上での起動時の手続自体はそう難しいものではありませんでした。

しかし、今回のアプリは正常に動かすために少しだけコードに手を加える必要があったため、まずはそれを片付けてしまいましょう。

正しいバージョンのNodeを指定

今回のアプリは、動かすためのNodeのバージョンに指定があるためまずはそれを指定しましょう。
NodeJSのアプリケーションではお馴染みの package.json ファイルの編集によって指定ができます。

Lockee$ vi package.json
{
  "name": "Lockee",
  "version": "1.0.0",
  "description": "Temporary encrypted file lockers on the web.",
  "repository": {
    "type": "git",
    "url": "https://github.com/hbons/Lockee"
  },
  "main": "server.js",
  "author": "Hylke Bons",
  "contributors": [
    {
      "name": "Hylke Bons",
      "email": "hi@planetpeanut.uk"
    }
  ],
  "license": "AGPLv3",
  "engines": {
    "node": "0.10.33"
  },
  "dependencies": {
    "express": "~4.12.2",
    "jade": "~1.9.2",
    "sqlite3": "~2.1.1",
    "body-parser": "~1.12.0",
    "compression": "~1.4.3",
    "node-sass": "~3.0.0-alpha.0",
    "async": "~0.9.0",
    "helmet": "~0.7.1",
    "node-schedule": "~0.2.6"
  },
  "scripts": {
    "clean": "rm ./blobs.db && rm -Rf ./blobs/"
  }
}
Lockee$ git diff
diff --git a/package.json b/package.json
index 41b7ec9..bcc348e 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,9 @@
     }
   ],
   "license": "AGPLv3",
+  "engines": {
+    "node": "0.10.33"
+  },
   "dependencies": {
     "express": "~4.12.2",
     "jade": "~1.9.2",

これでNodeのバージョンの指定は完了です。

Cloud Foundry上でのHOST名、PORT名を取得するための設定

まずは説明の前にコードの修正から行います。

Lockee$ vi server.js
(一部略)
// Server
var port = process.env.PORT || process.env.OPENSHIFT_NODEJS_PORT || config.server.port
var ip   = process.env.VCAP_APP_HOST || process.env.OPENSHIFT_NODEJS_IP   || '127.0.0.1'
(一部略)
Lockee$ git diff
diff --git a/server.js b/server.js
index 1d228f9..c662fca 100644
--- a/server.js
+++ b/server.js
@@ -387,8 +387,8 @@ function getCover(hash) {
 
 
 // Server
-var port = process.env.OPENSHIFT_NODEJS_PORT || config.server.port
-var ip   = process.env.OPENSHIFT_NODEJS_IP   || '127.0.0.1'
+var port = process.env.PORT || process.env.OPENSHIFT_NODEJS_PORT || config.server.port
+var ip   = process.env.VCAP_APP_HOST || process.env.OPENSHIFT_NODEJS_IP   || '127.0.0.1'
 
 if (config.server.ssl.enabled) {
     var credentials = {

この修正で何を行ったかというと・・・
元々のコードでは、

  • PORT番号 → OPENSHIFTで動かす時のPORT、なかったらconfigファイルから取得(3000番)
  • IPアドレス → OPENSHIFTで動かす時のIP、なかったらlocalhost

となっています。
しかしこのアプリをCloud Foundry上で動かしたい場合、実はPORT番号やIPアドレスは事前に決め打ちできるものでもなく、もちろん process.env.OPENSHIFT~~~ で取得できるものでもありません。
やっていることはOPENSHIFTで動かすときの環境変数の取得方法とそう変わらないのですが、Cloud Foundry上のアプリの環境変数を取得できるコードを書き加え、

  • PORT番号 → Cloud Foundryで動かすときのPORT、なかったらOPENSHIFTで動かす時のPORT、なかったらconfigファイルから取得(3000番)
  • IPアドレス → Cloud Foundryで動かすときのIP、なかったらOPENSHIFTで動かす時のIP、なかったらlocalhost

のように変更を行いました。

(おまけ)Domain名の変更

これはアプリを起動する上ではあまり影響のない箇所ですが、起動したアプリと関係のないドメイン名が随所に表示されていると少し格好が悪いので変更しておきましょう。

Lockee$ vi config.json 
{
    "server": {
        "production": false,
        "domain":     "lockee.10.244.0.34.xip.io",
        "port":       3000,
        "ssl": {
            "enabled":     false,
            "port":        3001,
            "privateKey":  "ssl/server.key",
            "certificate": "ssl/server.crt"
        },
        "admin": {
            "name":         "Hylke Bons",
            "contact_info": "https://www.twitter.com/hbons"
        }
    },
    "locker": {
        "location":   "./blobs/",
        "database":   "blobs.db",
        "size_limit": "20mb",
        "time_limit": 86400,
        "covers":     "/images/covers/"
   }
}
Lockee$ git diff
diff --git a/config.json b/config.json
index e2ae9e5..87db9e4 100644
--- a/config.json
+++ b/config.json
@@ -1,7 +1,7 @@
 {
     "server": {
         "production": false,
-        "domain":     "lockee.me",
+        "domain":     "lockee.10.244.0.34.xip.io",
         "port":       3000,
         "ssl": {
             "enabled":     false,

3. Cloud Foundry 環境へのプッシュ

それでは、Cloud FoundryにアプリをPushしましょう。

Lockee$ cf push lockee
(一部略)

-----> Uploading droplet (20M)

1 of 1 instances running

App started


OK

App lockee was started using this command `node server.js`

Showing health and status for app lockee in org ukaji / space default as ukaji...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: lockee.10.244.0.34.xip.io
last uploaded: Fri Jul 10 08:32:37 UTC 2015
stack: cflinuxfs2
buildpack: Node.js

     state     since                    cpu    memory          disk      details   
#0   running   2015-07-10 05:34:27 PM   0.0%   51.3M of 256M   0 of 1G 

無事起動しました。

4. 動作確認

それでは、動作確認を行います。
URLにアクセスをして、画面下のGO TO LOCKERから適当な名前のロッカーを作ってみましょう。

こちらがロッカー画面。
中々にお洒落な感じです。
試しに適当なファイルを放り込んでみると・・・

Passphraseを決めてファイルにロックを掛けましょう。

ロックが掛かったファイルは24時間有効のようです。
取り出すときはもちろん先ほどのPassphraseで。

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