[node.js] ndenv と npm と daemontools

久々のエントリです。
このブログを WordPress から Ghost に乗り換えました。
markdown スラスラ書けて良い…!

Ghost は node.js で書かれたアプリです。
今回 node.js 製アプリに触れるのは初めてだったので、セットアップするにあたって、自分なりの tips をまとめてみました。

ndenv でバージョン管理

Ruby, Perl でもそうなのですが、僕は env 系はシステムワイドに配置しています。
インストール等が必要な時は root になって作業します。

# git clone https://github.com/riywo/ndenv.git /usr/local/ndenv
# git clone https://github.com/riywo/node-build.git /usr/local/ndenv/plugins/node-build

# cat <<'___EOL___' > /etc/profile.d/ndenv.sh
export NDENV_ROOT=/usr/local/ndenv
export PATH="$NDENV_ROOT/bin:$PATH"
eval "$(ndenv init -)"
___EOL___

# exec $SHELL -l

(/etc/profile.d は使えないディストロあるかも…。)

バージョンは下記の様に、アプリの一階層上で固定します。

$ pwd
/path/to/app

$ cd ..
$ ndenv local v0.10.26

npm でパッケージ管理

あたりまえの手順なので解説する必要はないけど、一応。
下記で package.json を読んで必要なパッケージをインストールしてくれます。

$ cd /path/to/app
$ npm install

daemontools で永続化・自動起動

永続化というと forever とか pm2 とかが有名ですが、あえて daemontools を使います。
(いい加減卒業しろよ、とは自分でも思ってます)

npm start だと子プロセスができてしまうので、daemontools 管理に向きません。

npm startpackage.json の中の scripts.start の内容を叩いているだけ (っぽい) なので、これを daemontools の run ファイルで exec してあげれば OK です。

例えば Ghost の package.json

    "scripts": {
        "start": "node index",
        "test": "grunt validate --verbose"
    },

というわけで run ファイルは下記のようになります。

#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH

sleep 3
exec 2>&1

export NDENV_ROOT=/usr/local/ndenv
export PATH="$NDENV_ROOT/bin:$PATH"
eval "$(ndenv init -)"

cd /path/to/app
export NODE_ENV=production
exec setuidgid daemon node index

  • 初稿 (Tue, 11 Mar 2014 14:53:39 JST)