dotcloudにnodeslideをデプロイしてみた。

f:id:yosuke_furukawa:20120403001621p:image

HTML5 + Node on ninja

DotcloudでWebsocketが対応されたという話が上がっています。
dotCloud Announces Native Support for WebSockets - dotCloud blog
dotCloud で WebSocket - Block Rockin’ Codes

徐々にWebsocketに対応するPaaSが増えてきて良い兆候になっていますね。
この調子でHerokuも対応してくれると嬉しいんですが。

という訳でDotcloudにnodeslideをデプロイしてみました。
その経緯を追っていきます。

Dotcloudアプリケーションを作る


まずはDotcloudアプリケーションを作成します。
以下のコマンドを実行します。

dotcloud create nodeslide

ちなみにdotcloudのCLIは下記からインストールしておいてください。
dotCloud - Installing the CLI

次にファイル構成。Dotcloudにデプロイするためには以下のような構成にしておく必要があります。

├── dotcloud.yml
└── nodeslide
    ├── package.json
    ├── server.js
    ├── supervisord.conf

dotcloud.yml

www:
  type: nodejs
  approot: nodeslide
data:
  type: mongodb

typeはnodejsに。approotはtreeのrootフォルダを指すので、nodeslideにしておきます。
また、mongodbを使っているので、それに対しても指定をしておきます。

supervisord.conf

[program:node]
command = node server.js
directory = /home/dotcloud/current

ここにはアプリケーションの起動方法を書きます。
ひとまずチュートリアル通りのnode server.jsで。
server.jsじゃなくすることも、アプリケーションルート直下以外にserver.jsを置くことも
directoryとcommandを変更することで対応できます。
一応、dotcloudによれば、server.jsにすることはgood practiceみたいですけどね。

package.json


どうもdotcloudのnode.jsは古いようで、最新のmongooseとか入れようとすると、npmがエラーを吐くので以下の設定にしています。

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.5.0"
    , "jade": ">= 0.0.1"
    , "socket.io": "0.8.7"
    , "mongoose": "2.3.11"
  }
}

server.js


注意しなきゃいけないポイントは以下の2点です。
・8080ポートでアクセスできるようにしておくこと。
・mongodbのURLを変更する。

8080ポートでのアクセス

app.listen(8080);

expressのデフォルトが3000なので、3000にしている人が多いかもしれませんが、8080にしておく必要があります。
おそらくリバースプロキシ方式で接続する際に8080にしているのでしょう。

mongodbのURL変更は多少時間がかかるので、次セクションで説明します。

mongodbへの接続


自分はここに一番時間がかかりました。
デフォルトのまま使おうとしてもURLがわからないので、そこを下記の方法で調べます。

dotcloud info nodeslide.data

実行すると以下のようなメッセージが返ってきます。

config:
mongodb_noprealloc: true
mongodb_nopreallocj: true
mongodb_oplog_size: 256
mongodb_password: XXXXXXXXXX
mongodb_replset: nodeslide.data
mongodb_smallfiles: true
created_at: 1333288725.436986
datacenter: Amazon-us-east-1b
image_version: c60aa2f91b10 (latest)
instances:
nodeslide.data.0:
state: PRIMARY
ports:

url: ssh://mongodb@nodeslide-yosuke_furukawa-data-0.dotcloud.com:11111

  • name: mongodb

url: mongodb://root:XXXXXXXXXX@nodeslide-yosuke_furukawa-data-0.dotcloud.com:11112
state: running
type: mongodb

このurlに書かれている部分をmongooseを使っている人であればそのまま設定すればOKなはずです。

var mongoUri = mongodb://root:XXXXXXXXXX@nodeslide-yosuke_furukawa-data-0.dotcloud.com:11112/admin
mongoose.connect(mongoUri);

でもこのままだとroot権限でアクセスすることになってしまい、好ましくありません。
また、admin用のデータに更新しているので、それも好ましくありません。
できれば、新しくユーザーを作って参照、更新させつつ、新しいデータ領域にアクセスする方が良いでしょう。
以下のように設定していきます。

以下のコマンドを実行して、mongoを実行し、ユーザーとデータを作成します。

$ dotcloud run nodeslide.data mongo
# mongo
MongoDB shell version: 2.0.2
connecting to: data
nodeslide.data:PRIMARY> use data
switched to db data
nodeslide.data:PRIMARY> db.getSisterDB("admin").auth("root", "XXXXXXXXXX");
1
nodeslide.data:PRIMARY> db.addUser("slideUser", "slidePassword");

コレを実行した後、ユーザー、パスワード、データベースの箇所のURLを変更します。

var mongoUri = mongodb://slideUser:slidePassword@nodeslide-yosuke_furukawa-data-0.dotcloud.com:11112/data
mongoose.connect(mongoUri);

最終的な変更ポイントも含めてdotcloud用のnodeslideをgithubに上げておきます。
yosuke-furukawa/nodeslide4dotcloud · GitHub

一応、dotcloud用とnodeninja用両方リンクを貼っておきます。
地理的な要因からか、nodeninjaの方が安定している気がしますね。

nodeslide dotcloud
nodeslide nodeninja
この辺りの性能測定も次回実行してみます。