ひよっこ。

I want to…

今更だけどDotcloud上にnode.js環境をデプロイしてみる(1)

Posted by hikaruworld : 2011 7月 27

今更ですが、node.jsを使ってdotcloud0.4上に環境を構築してみました。

ちなみにローカル環境はMacOSX10.6.7(SnowLeopard)です。
この辺りを参考にしていたんですが、6/22にdotcloud0.4がリリースされて
ちょこっと変わったらしく、結局公式ドキュメントを読んでやりました。

1.DotCloudのアカウント登録

何はともあれ、dotcloudにアカウントを登録してAPIKey(あとで必要になります)を取得可能な状態にしておきます。

2. ローカル環境にDotCloudのCLIツールをインストール

DotCloudにログインすると、右上からDashboardやsettingにアクセス可能になります。

このDashboardにアクセスしてみると…
Start deploying by INstalling the CLI.とな。

まだないようです(ー。そのうちGUIが提供されるのでしょう〜。

というわけでリンク先にあるようにDotCloudを操作するために
dotcloudというコマンドをローカルマシンにインストールします。
python製ですので、easy_installなりpipで行うのですが、公式サイトのリファレンスでは

sudo easy_install pip && pip install dotcloud

とのことなのでpipでインストールしておきましょう。

※最初easy_installでインストールしてしまったのですが、
easy_installはアンインストールを手動で行う必要があるので、pipの方が楽チンですョネ。

3. dotcloudのセットアップ

dotcloudのインストールが終わったら、dotcloudコマンドのセットアップを行うために、以下のコマンドを実行します。

dotcloud setup

以下のように聞かれるので、

Enter your api key (You can find it at http://www.dotcloud.com/accounts/settings):

settingsに記述されているAPIKeyを入力します。

このコマンドを実行すると、設定したキー情報が~/.dotcloud以下に格納されます。

.dotcloud/
├── dotcloud.conf
└── dotcloud.key

4. アプリの登録

今回は冒頭にあるようにNode.jsでアプリを作っていきます。
DotCloud上にNode.jsで構築する方法は公式ドキュメントに詳しく書いてあります。

まず、DotCloud上で利用するアプリケーション名を登録します。
このアプリケーション名は自身のアプリケーション内で一意である必要があります。
ここではとりあえずhelloNodeというアプリケーション名にしてみます。
というわけで、以下を実行します。

dotcloud create hellonode

無事作成出来るとこんな感じに出力されます。

Created application “helloNode”

dotcloud上への登録はこれだけです。

5. アプリの作成

次に登録するアプリの実体を作成していきます。
任意のディレクトリを切ってそこで作業します。私の場合は~/programs/dotcloud/helloNodeとしました。

$ mkdir -p ~/programs/dotcloud/helloNode
$ cd ~/programs/dotcloud/helloNode

dotcloud.ymlの作成

次にdotcloud.ymlというビルドファイルを作成します。
これはYAML形式でアーキテクチャやプログラミングコードの設定を行うことが可能です。
今回はDBを利用しないので、こんな感じになります。

www:
    type: nodejs
    approot: helloNode

wwwという風につけたserviceをnodejsのプログラミング言語を使ってルート以下のhelloNode以下に作成するという意味になります。
wwwはあくまでもサービスの名前なので後で変更可能です。
typeは利用するプログラム言語、
approotとは、ルートディレクトリからの指定でこの指定されたディレクトリ以下が設定された対象になります。複数のサービスを定義する場合にはdbやbatchと行った感じで設定を増やすことが可能です。

これをふまえて現在のディレクトリ構造はこんな感じになっています。

helloNode/
├── dotcloud.yml
└── helloNode

supervisord.confの作成

起動用の設定ファイルとしてsupervisord.confを作成します。

$ cd helloNode
$ vim supoervisord.conf

こんな感じでチュートリアルと同じ設定を書いておきます。

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

commandには実行するnodeコマンドを書きます。
directoryはDotCloud環境上にUPされる場所が/home/dotcloud/currentとのこと(変更可能?)。

server.jsの作成

これは通常のnode.jsのファイルになります。
とりあえずこんな感じに書いておきます

var http = require('http');

var server = http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"})
    var output = "Hello World!\n";
    response.end(output);
});

server.listen(8080)

ま、いわゆるHelloWorldですね。
listenしているportは8080ですが、これはセキュリティ上の理由からだそうです。
実際のURLは80でアクセスできるとのこと。

なお、この時点でのディレクトリ構造はこんな感じになっています。

helloNode/
├── dotcloud.yml
└── helloNode/
    ├── server.js
    └── supervisord.conf

6.クラウド環境へのデプロイ

作ったアプリの動作確認をしたら、クラウド環境へのデプロイをpushコマンドで行います。

dotcloud push helloNode ~/programs/dotcloud/helloNode

デプロイ => 起動までが無事完了するとこんなログが流れます。

# upload helloNode/ ssh://dotcloud@uploader.dotcloud.com:21122/hellonode
# rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added ‘[uploader.dotcloud.com]:21122,[XXX.XX.XX.XX]:21122’ (RSA) to the list of known hosts.
building file list … done
./
dotcloud.yml
helloNode/
helloNode/server.js
helloNode/supervisord.conf

sent 594 bytes received 98 bytes 106.46 bytes/sec
total size is 352 speedup is 0.51
Deployment for “hellonode” triggered. Will be available in a few seconds.
2011-07-26 11:27:12 [api] Waiting for the build. (It may take a few minutes)
2011-07-26 11:27:12 [www.0] Deploying…
2011-07-26 11:27:34 [www.0] Service booted
2011-07-26 11:27:34 [api] All the services are ready. Beginning the build.
2011-07-26 11:27:34 [www.0] The build started
2011-07-26 11:27:35 [www.0] Fetched code revision rsync-1311679630.79
2011-07-26 11:27:39 [www.0] node: stopped
2011-07-26 11:27:39 [www.0] node: started
2011-07-26 11:27:39 [www.0] The build finished successfully
2011-07-26 11:27:39 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://6634c12a.dotcloud.com/

おまけ:ignoreの設定

当然分散バージョン管理使っている訳で、バージョン管理ファイルやデプロイしたくないファイルがある訳ですが、
DotCloudさんはその辺はまだ対応していないようです。
現在これを実現したい場合はGitかHgでバージョン管理を行い、リポジトリからデプロイするようにしなければいけないとのこと。そうした場合gitやhgのignoreを反映してくれるそうです。

bzrは???(涙)…bzr-hgとかbzr-git使えってことですね。はい。

7.動作確認

6.で表示されたURLにアクセスすることで該当環境にアクセスできます。
早速やってみましょう。
http://6634c12a.dotcloud.com/へアクセスします(今はつながりません)。
HelloWorldと表示されました。

8.npmの依存関係解決

node.jsでプログラミングする以上パッケージ管理のnpmは使いたいところです。

DotCloudではnpmの依存関係もpackage.jsonを用意しておくことで自動でダウンロード及び参照してくれます。

ここではexpress(とjade)のテンプレートをdotcloud上で動かしてみます。
なお、expressとjadeは既にグローバルインストール(npm install express -gd)されているものとします。

まずは4.と5.でやったようにアプリを登録して、デプロイ用のディレクトリを作成します。

dotcloud create hexp
mkdir hello-express
cd  hello-express

expressコマンドを使って(パスが通っている前提)、ひな形のアプリケーションを作成します。

express create app

グローバルにインストルしたnpmのモジュールを紐つけます。

npm link express jade

この時点でディレクトリ構成はこんな感じになります。

hello-express/
├── app
│   ├── app.js
│   ├── node_modules
│   │   ├── express -> ~/.nave/installed/0.4.9/lib/node_modules/express
│   │   └── jade -> ~/.nave/installed/0.4.9/lib/node_modules/jade
│   ├── package.json
│   ├── public
│   │   ├── images
│   │   ├── javascripts
│   │   └── stylesheets
│   │       └── style.css
│   └── views
│       ├── index.jade
│       └── layout.jade
└── dotcloud.yml

dotcloud上に必要な設定を書いていきます。
まずはdotcloud.ymlを既存の構成にあわせて書き直します。

www:
  type: nodejs
  approot: app

package.jsonを修正します。
既にテンプレートインストール済みですので、しなくても大丈夫ですが…どうせなのでnameを変更しておきます。

{
    "name": "hello-express"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.4.3"
    , "jade": ">= 0.0.1"
  }
}

app.jsのlistenするポートを変更します。

//app.listen(3000);
app.listen(8080);

app以下にsupervisord.confを作成します。

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

dotcloud上にデプロイします。

dotcloud push hexp hello-express

長いのでログは省略しますが、一部だけ。

ignoring unsafe symlink “/home/dotcloud/repositories/3/d/1/2/7/13093/hexp/rsync/app/node_modules/express” -> “~/.nave/installed/0.4.9/lib/node_modules/express”

と出ました。シンボリックリンクは無視してくれるみたいです。グッジョブ!

2011-07-26 12:18:39 [www.0] npm info build Success: hello-express@0.0.1
2011-07-26 12:18:39 [www.0] npm info build Success: jade@0.13.0
2011-07-26 12:18:39 [www.0] npm ok

と行った感じでpackage.jsonに書かれている必要なライブラリをビルドしてくれます。

9.その他のコマンド

dotcloudにはその他に便利なコマンドが準備されています。
一部ここで紹介しておきます。

利用可能なコマンドはdotcloud -hと打つことで参照可能です。
ちなみに、これPythonのCmdというパッケージを使って実現しているようです。便利デスヨ。

おまけ:application.service

helpを見ていると頻繁にapplication.serviceという表現が頻繁に出てきます。
これはapplicationはcreateしたアプリ名を指し、
serviceは、dotcloud.ymlに定義したservice名(今回でいえばwww)を指します。
application.serviceという表記は、hexp.wwwというように指定します。

コマンド

setup/create/pushは今まで使ってきましたので省略。

list

createした環境の一覧を表示します。

hexp:
  - www (type: nodejs; instances: 1)

versions

pushでデプロイした際のrsyncのバージョンが表示されます。

- rsync-1311682682.25
- rsync-1311683164.82

run

dotcloud環境上でコマンドを実行します。
たとえばlsだとこんな感じになります。

dotcloud run hexp.www ls

なお、引数を与えたい場合は–を使います

dotcloud run hexp.www ls -- -ls

logs

ログを出力します。実体はtail -Fで/var/log/supervisor/*.log が流れます。

dotcloud run hexp.www ls 

alias

ヘルプを見ると、独自ドメインに紐つけるとのこと。持ってないので未確認

destroy

createで登録したアプリケーションを削除します。

url

デプロイしたアプリケーションのURLを参照します。
うっかり忘れた時用。

info

アプリケーションないしはサービスの情報を参照します。
アプリケーションであればURLやプログラミング言語、インスタンスなど、
サービスであればhttpのアクセスやsshのアクセスのURLなどが参照できます。

status

supervisorctlを通して起動しているサービスの状態が参照可能です。

node RUNNING pid 230, uptime 0:28:42

rollback

???

ssh

該当アプリケーションのサービスにsshでアクセスします

restart

指定したアプリケーションのサービスを再起動します。

参考サイト

以下のサイトがとても参考になりました。
http://docs.dotcloud.com/services/nodejs/
http://d.hatena.ne.jp/replication/20110603/1307026830

以上です。
次はmongodbとつなげてみようと思います。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。