Node.js dağıtım ayarları/konfigürasyon dosyaları nasıl saklanır?

Birkaç Node uygulaması üzerinde çalışıyorum ve dağıtımla ilgili ayarları saklamak için iyi bir model arıyordum. Django dünyasında (geldiğim yer), yaygın uygulama standart ayarları (zaman dilimi, vb.) içeren bir settings.py dosyasına ve ardından dağıtıma özgü ayarlar için bir local_settings.py dosyasına sahip olmaktır, yani hangi veritabanıyla konuşulacağı, hangi memcache soketi, yöneticiler için e-posta adresi vb.

Node için benzer modeller arıyordum. Sadece bir yapılandırma dosyası iyi olurdu, böylece app.js içindeki diğer her şeyle birlikte sıkışmak zorunda kalmazdı, ancak kaynak kontrolünde olmayan bir dosyada sunucuya özgü yapılandırmaya sahip olmanın bir yolunu önemli buluyorum. Aynı uygulama çılgınca farklı ayarlarla farklı sunuculara dağıtılabilir ve birleştirme çakışmaları ve tüm bunlarla uğraşmak zorunda kalmak benim eğlence anlayışım değil.

Peki bunun için bir tür çerçeve/araç var mı, yoksa herkes kendi başına bir şeyler mi yapıyor?

Paketlerim için bir package.json ve yapılandırmam için bir config.js kullanıyorum, bu da şöyle görünüyor:

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;

Yapılandırmayı projemden yüklüyorum:

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

ve sonra config.db_host, config.db_port, vb. üzerinden işlerime erişebilirim. Bu, şifreleri kaynak kontrolünde saklamak istemiyorsam, kodlanmış parametreleri veya çevresel değişkenlerde depolanan parametreleri kullanmamı sağlar.

Ayrıca bir package.json oluşturuyorum ve bir bağımlılıklar bölümü ekliyorum:

"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"
}

Projeyi yerel makineme klonladığımda, paketleri yüklemek için npm install çalıştırıyorum. Bu konuda daha fazla bilgi burada.

Proje GitHub'da saklanıyor ve üretim sunucum için uzaktan kumandalar eklenmiş durumda.

Yorumlar (18)
Çözüm

Çok sonraları, yapılandırmayı yönetmek için oldukça iyi bir Node.js modülü buldum: nconf.

Basit bir örnek:

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'));

Ayrıca ayarları Redis'te depolamayı, yapılandırma dosyalarını yazmayı destekler ve oldukça sağlam bir API'ye sahiptir ve ayrıca Flatiron çerçeve girişiminin bir parçası olarak daha saygın Node.js mağazalarından biri olan Nodejitsu tarafından desteklenmektedir, bu nedenle oldukça geleceğe dönük olmalıdır.

Github'da nconf]nconf'a göz atın.

Yorumlar (15)

Ayrıca $HOST ve __$NODE_ENV__ değişkenine bağlı olarak yapılandırma dosyasını yükleyen node-config adresine de bakabilirsiniz (biraz RoR gibi) : documentation.

Bu, farklı dağıtım ayarları (geliştirme, test veya üretim) için oldukça yararlı olabilir.

Yorumlar (0)