Como armazenar arquivos de configurações/configuração de implantação do Node.js?

Eu tenho trabalhado em algumas aplicações de Node, e I'tenho procurado por um bom padrão de armazenamento de configurações relacionadas à implantação. No mundo Django (de onde eu venho), a prática comum seria ter um arquivo settings.py contendo as configurações padrão (timezone, etc), e então um local_settings.py para configurações específicas de deployment, ou seja, qual banco de dados falar, qual soquete memcache, endereço de e-mail para os administradores e assim por diante.

Tenho procurado por padrões semelhantes para o Node. Apenas um arquivo de configuração seria bom, então ele não precisa estar preso com tudo o resto no `app.js', mas eu acho importante ter uma maneira de ter uma configuração específica do servidor em um arquivo que não está no controle de código fonte. O mesmo aplicativo poderia muito bem ser implementado em servidores diferentes com configurações muito diferentes, e ter que lidar com conflitos de fusão e tudo isso não é minha idéia de diversão.

Então, existe algum tipo de estrutura/ferramenta para isto, ou toda a gente hackeia alguma coisa sozinha?

Eu utilizo um package.json para meus pacotes e um config.js para minha configuração, que se parece com:

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;

Eu carrego a configuração do meu projeto:

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

e depois posso aceder às minhas coisas a partir de config.db_host, config.db_port, etc... Isso me permite ou usar parâmetros codificados, ou parâmetros armazenados em variáveis ambientais se eu não'não quero armazenar senhas no controle de código fonte.

Também gerei um package.json e inseri uma seção de dependências:

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

Quando eu clono o projeto na minha máquina local, eu corro `npm install' para instalar os pacotes. Mais informações sobre isso aqui.

O projeto é armazenado no GitHub, com controles remotos adicionados para o meu servidor de produção.

Comentários (18)
Solução

Muito mais tarde, eu encontrei um módulo Node.js muito bom para gerenciar a configuração: nconf.

Um exemplo simples:

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

Ele também suporta armazenamento de configurações em Redis, escrita de arquivos de configuração, e tem uma API razoavelmente sólida, e também é apoiado por uma das mais respeitadas lojas Node.js, Nodejitsu, como parte da iniciativa [Flatiron][] framework, portanto, deve ser razoavelmente à prova de futuro.

Confira nconf em Github.

http://flatironjs.org/

Comentários (15)

Você também pode olhar para node-config que carrega o arquivo de configuração dependendo da variável $HOST e __$NODE_ENV__ (um pouco como RoR) : documentação.

Isto pode ser bastante útil para diferentes configurações de implantação (desenvolvimento, teste ou produção).

Comentários (0)