Node.jsのデプロイメント設定/構成ファイルを保存するには?

いくつかのNodeアプリを作っていますが、デプロイ関連の設定を保存する良いパターンを探していました。Djangoの世界(私の出身地)では、標準的な設定(タイムゾーンなど)を含むsettings.pyファイルと、デプロイメントに特化した設定(どのデータベースと通信するか、どのmemcacheソケットを使うか、管理者のメールアドレスなど)を格納するlocal_settings.pyファイルを用意するのが一般的です。

同じようなパターンをNodeでも探していました。ただの設定ファイルであれば、「app.js」の他の部分と一緒になってしまうことはありませんが、サーバー固有の設定をソース管理外のファイルで行う方法があることは重要だと思います。同じアプリが異なるサーバーにデプロイされ、設定が大きく異なることもあり得ますし、マージコンフリクトなどに対処するのは私の考えでは楽しいことではありません。

そのためのフレームワークやツールがあるのか、それともみんな自分で何かを作っているのか。

私は、パッケージにはpackage.jsonを、設定にはconfig.jsを使っています。

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

私はプロジェクトからコンフィグを読み込みます。

var config = require('./config');

そして、config.db_hostconfig.db_portなどから自分のものにアクセスできるようにしています。 これにより、ハードコードされたパラメータや、ソースコントロールにパスワードを保存したくない場合は環境変数に保存されたパラメータを使用することができます。

また、package.jsonを生成して、dependenciesセクションを挿入しています。

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

プロジェクトを自分のローカルマシンにクローンする際には、npm installを実行してパッケージをインストールします。詳しくはこちらをご覧ください。

プロジェクトはGitHubに保存されており、本番サーバー用にリモートを追加しています。

解説 (18)
ソリューション

ずっと後になって、設定を管理するためのNode.jsのモジュールがなかなか良いことに気づきました。nconfです。

簡単な例です。

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

また、Redisへの設定の保存や設定ファイルの記述もサポートしており、かなり強固なAPIを備えています。また、Flatironフレームワーク構想の一環として、Node.jsの中でも特に評価の高いショップのひとつであるNodejitsuが支援しているので、かなり将来性があると言えるでしょう。

nconf at Github]nconfをチェックしてみてください。

解説 (15)

また、$HOSTと__$NODE_ENV__の変数に応じて設定ファイルを読み込むnode-configも参考になるでしょう(RoRに少し似ています) : documentation

これは、異なるデプロイメント設定(development, test, production)の場合に非常に便利です。

解説 (0)