web-dev-qa-db-ja.com

Node.jsのデプロイメント設定/設定ファイルを保存する方法

私はいくつかのNodeアプリに取り組んできました、そして私はデプロイメント関連の設定を保存する良いパターンを探しています。 Djangoの世界(私の出身)では、一般的なやり方は標準設定(timezoneなど)を含むsettings.pyファイルを作成し、次にデプロイメント固有の設定のためのlocal_settings.pyを作成することです。どのデータベースと通信するか、どのmemcacheソケット、管理者用のEメールアドレスなど。

私はNodeについても同様のパターンを探しています。設定ファイルだけでいいので、app.js内の他のすべてのファイルでぎゅうぎゅう詰めする必要はありませんが、ソース管理ではないファイルにサーバー固有の設定を含める方法を持つことが重要です。まったく異なる設定で、同じアプリケーションを異なるサーバー間に配置することもでき、マージの競合に対処する必要があり、それがすべて私の楽しみの考えではありません。

それで、これに対する何らかの種類のフレームワーク/ツールがありますか、それとも誰もが自分自身で何かを一緒にハックしますか?

602
mikl

かなり後で、構成を管理するためのかなり良い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を持ちます。また、より尊敬されるNode.jsショップの1つ Nodejits =、 Flatiron フレームワークイニシアチブの一環として、かなり将来性があるはずです。

Githubのnconf をご覧ください。

189
mikl

私は自分のパッケージに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": {
  "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に保存されており、私の本番サーバー用にリモートが追加されています。

733
noli

Node v0.5.x以降でJSONファイルを要求することができます( この回答を参照してください

config.json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);
230
TinyTimZamboni

私の解決策はかなり簡単です。

環境設定を./config/index.jsにロードします。

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

./config/config.global.jsでいくつかのデフォルトを定義します。

var config = module.exports = {};

config.env = 'development';
config.hostname = 'dev.example.com';

//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';

./config/config.test.js内のデフォルトをオーバーライドする

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

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

./models/user.jsでそれを使う:

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

テスト環境でアプリを実行する

NODE_ENV=test node ./app.js

これについては、ここで詳しく説明します。 http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/

85
chovy

また、 dotenv を見ることもできます。これは、 12要素アプリの原則 に従っています。

以前はnode-configを使用していましたが、そのためにdotenvを作成しました。それはRubyのdotenvライブラリに完全に触発されました。

使い方はとても簡単です。

var dotenv = require('dotenv');
dotenv.load();

次に、.envファイルを作成して、そこに設定を追加します。

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

Nodejsの場合は、 dotenv です。

31
scottmotte

スクリプトを起動するのにnpmを使用しているのですか(envなど)?

.envファイルを使用する場合は、それらをpackage.jsonに含め、npmを使用してそれらをソース/開始することができます。

例:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

それからnpmスクリプトを実行します。

$ npm start-dev

その説明はここにあります https://Gist.github.com/ericelliott/4152984 Eric Elliotへのすべての功績

29
lxx

$ Host および $ NODE_ENV 変数(RoRに少し似ています)に応じて設定ファイルをロードする node-config を見ることもできます: documentation

これは、さまざまなデプロイメント設定(developmenttest、またはproduction)に非常に便利です。

22
ngryman

exportsを付けて単純なsettings.jsを実行するだけです。

exports.my_password = 'value'

それから、あなたのスクリプトで、requireをしてください:

var settings = require('./settings.js');

設定はすべてsettings変数で利用可能になります。

settings.my_password // 'value'
20
Vanuan

これらの答えはどれも、ほとんどすべてのシステムが必要とするすべての重要なコンポーネントに対処するものではないので、ここで私の帽子をリングに入れるつもりです。考慮事項:

  • パブリック設定(フロントエンドから見ることができる)とプライベート設定(guy mograbiがこれを正しくしている)。そして、これらを確実に分離してください。
  • 鍵のような秘密
  • デフォルトと環境固有のオーバーライド
  • フロントエンドバンドル

これが私の設定方法です。

  • config.default.private.js - バージョン管理では、これらはあなたのバックエンドからしか見えないデフォルトの設定オプションです。
  • config.default.public.js - バージョン管理において、これらはバックエンドfrontendで見ることができるデフォルトの設定オプションです。
  • config.dev.private.js - devに異なるプライベートデフォルトが必要な場合.
  • config.dev.public.js - devに対して異なるパブリックデフォルトが必要な場合.
  • config.private.js - バージョン管理ではなく、これらはconfig.default.private.jsをオーバーライドする環境固有のオプションです。
  • config.public.js - バージョン管理ではなく、これらはconfig.default.public.jsをオーバーライドする環境固有のオプションです。
  • keys/ - 各ファイルが異なる種類の秘密を格納するフォルダー。これもバージョン管理下にはありません(キーをバージョン管理下にしないでください)。

私は設定のために普通のjavascriptファイルを使っているので、私はjavascript言語のフルパワーを持っています(コメントや環境設定ファイルにデフォルトの設定ファイルをロードして上書きできるようにする能力を含みます)。環境変数を使用したい場合は、それらの設定ファイル内にそれらをロードすることができます(私はjsonファイルの使用を推奨しないのと同じ理由でenv varsの使用をお勧めしません - 構築するプログラミング言語の力がありません)あなたの設定)。

各キーが別々のファイルに入っているのは、インストーラが使用するためです。これにより、マシン上でキーを作成してそれらをキーフォルダーに保存するインストーラーを作成できます。これがないと、キーにアクセスできない設定ファイルをロードしたときにインストーラが失敗する可能性があります。これにより、存在するものと特定のバージョンのコードに存在しないものを気にせずに、ディレクトリ内を移動してそのフォルダ内のキーファイルをロードできます。

おそらくあなたのプライベート設定にキーがロードされているので、 間違いなく フロントエンドコードでプライベート設定をロードしたくないでしょう。フロントエンドのコードベースをバックエンドから完全に分離することがおそらくより厳密に理想的ですが、多くの場合、PITAは人々がそれを実行するのを防ぐのに十分な大きな障壁であり、したがってプライベート対パブリックの設定です。しかし、プライベート設定がフロントエンドにロードされないようにするために私がすることが2つあります。

  1. 私は私のフロントエンドバンドルが私が私用設定で持っている秘密鍵の1つを含まないことを確実にするユニットテストを持っています。
  2. フロントエンドのコードはバックエンドのコードとは別のフォルダにあり、「config.js」という名前の2つの異なるファイルがあります。バックエンドの場合、config.jsはプライベート設定をロードし、フロントエンドの場合はパブリック設定をロードします。それからあなたはいつもただ( 'config')を必要とし、それがどこから来るのかを心配しません。

最後にもう一つ:あなたの設定は他のフロントエンドコードのどれよりも 完全に 別々のファイルを通してブラウザにロードされるべきです。フロントエンドコードをバンドルする場合、パブリック設定は完全に別のバンドルとして構築されるべきです。そうでなければ、あなたの設定は実際にはもう設定されていません - それはあなたのコードのほんの一部です。 Configはマシンごとに異なる必要があります。

12
B T

環境固有の設定ファイルには Konfig を使用できます。それは自動的にJSONまたはYAMLの設定ファイルをロードし、それはデフォルト値と動的な設定機能を持っています。

Konfigレポからの例:

File: config/app.json
----------------------------
{
    "default": {
        "port": 3000,
        "cache_assets": true,
        "secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
    },

    "development": {
        "cache_assets": false
    },

    "test": {
        "port": 3001
    },

    "staging": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    },

    "production": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    }
}

開発中:

> config.app.port
3000

プロダクションでは、$ NODE_ENV=production PORT=4567 node app.jsでアプリケーションを起動するとします

> config.app.port
4567

詳細: https://github.com/vngrs/konfig

11
Ali Davut

Convict は検証用のスキーマを追加する別のオプションです。 nconfと同様に、環境変数、引数、ファイル、およびjsonオブジェクトの任意の組み合わせから設定をロードすることをサポートします。

READMEからの例:

var convict = require('convict');
var conf = convict({
  env: {
    doc: "The applicaton environment.",
    format: ["production", "development", "test"],
    default: "development",
    env: "NODE_ENV"
  },
  ip: {
    doc: "The IP address to bind.",
    format: "ipaddress",
    default: "127.0.0.1",
    env: "IP_ADDRESS",
  },
  port: {
    doc: "The port to bind.",
    format: "port",
    default: 0,
    env: "PORT"
  }
});

入門記事: node-convictを使った設定の調整

11
hurrymaplelad

私はconfigとしてconfig.jsとして命名するファイルとしてフォルダを作成し、後で私は以下のように必要に応じてこのファイルを使用します

Config.jsの例

module.exports = {
    proxyURL: 'http://url:port',
    Twitter: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    GOOGLE: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    FACEBOOK: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    }
}

それから私はどこかにこの設定ファイルを使用したい場合

以下のように最初にインポートします

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

そして私は以下のように値にアクセスすることができます

const oauth = OAuth({
    consumer: {
        key: config.Twitter.consumerkey,
        secret: config.Twitter.consumerSecrete
    },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
        return crypto.createHmac('sha1', key).update(base_string).digest('base64');
    }
});
7
Ron

典型的な.jsonファイルよりも高い柔軟性を求めていたが、依存関係を必要とするライブラリに抽象化したくなかったので、私が使用した代替例はこのようなものです。基本的には、すぐに呼び出された関数をエクスポートすると、設定したい値を持つオブジェクトが返されます。多くの柔軟性を与えます。

     module.exports = function(){
       switch(node_env){
         case 'dev':
           return
           { var1 = 'development'};
         }
    }();

ここには完全な例でもっと良い説明があります。 Node.jsで設定ファイルを使用する

3
captainavi

これは本当に古い投稿です。しかし、環境変数を設定するためのモジュールを共有したいのですが、それは非常に柔軟なソリューションだと思います。これがモジュール json-configurator です

var configJson = {
  'baseUrl': 'http://test.com',
  '$prod_baseUrl': 'https://prod.com',
  'endpoints': {
    'users': '<%= baseUrl %>/users',
    'accounts': '<%= baseUrl %>/accounts'
    },
  foo: 'bar',
  foobar: 'foobar',
  $prod_foo: 'foo in prod',
  $test_foo: 'foo in test',
  deep:{
    veryDeep: {
      publicKey: 'abc',
      secret: 'secret',
      $prod_secret: 'super secret'
    }
  }
};

var config = require('json-configurator')(configJson, 'prod');

console.log(config.deep.veryDeep.secret) 
// super secret 

console.log(config.endpoints.users)
// https://prod.com/users 

そうすれば、process.env.NODE_ENVを使って自分の環境のすべての変数を取得できます。

3
Christian

私はもう少し遅れてゲームをしていますが、私がここで必要なものを見つけることができませんでした。

構成メカニズムに関する私の要件は以下のとおりです。

  1. フロントエンドをサポートします。フロントエンドが設定を使用できない場合のポイントは何ですか?
  2. settings-overrides.jsをサポート - これは同じように見えますが、settings.jsでの設定の上書きを許可します。ここでの考え方は、コードを変更せずに設定を簡単に変更することです。私はそれがsaasに役立つと思います。

私は環境のサポートについてはあまり気にしていませんが、それを私のソリューションに簡単に追加する方法を説明します

var publicConfiguration = {
    "title" : "Hello World"
    "demoAuthToken" : undefined, 
    "demoUserId" : undefined, 
    "errorEmail" : null // if null we will not send emails on errors. 

};

var privateConfiguration = {
    "port":9040,
    "adminAuthToken":undefined,
    "adminUserId":undefined
}

var meConf = null;
try{
    meConf = require("../conf/dev/meConf");
}catch( e ) { console.log("meConf does not exist. ignoring.. ")}




var publicConfigurationInitialized = false;
var privateConfigurationInitialized = false;

function getPublicConfiguration(){
    if (!publicConfigurationInitialized) {
        publicConfigurationInitialized = true;
        if (meConf != null) {
            for (var i in publicConfiguration) {
                if (meConf.hasOwnProperty(i)) {
                    publicConfiguration[i] = meConf[i];
                }
            }
        }
    }
    return publicConfiguration;
}


function getPrivateConfiguration(){
    if ( !privateConfigurationInitialized ) {
        privateConfigurationInitialized = true;

        var pubConf = getPublicConfiguration();

        if ( pubConf != null ){
            for ( var j in pubConf ){
                privateConfiguration[j] = pubConf[j];
            }
        }
        if ( meConf != null ){
              for ( var i in meConf ){
                  privateConfiguration[i] = meConf[i];
              }
        }
    }
    return privateConfiguration;

}


exports.sendPublicConfiguration = function( req, res ){
    var name = req.param("name") || "conf";

    res.send( "window." + name + " = " + JSON.stringify(getPublicConfiguration()) + ";");
};


var prConf = getPrivateConfiguration();
if ( prConf != null ){
    for ( var i in prConf ){
        if ( prConf[i] === undefined ){

            throw new Error("undefined configuration [" + i + "]");
        }
        exports[i] = prConf[i];
    }
}


return exports;

説明

  • undefinedは、このプロパティが必須であることを意味します
  • nullはオプションであることを意味します
  • meConf - 現在、コードはappの下のファイルをターゲットにしています。 meConfconf/devをターゲットとする上書きファイルです - これは私のvcsでは無視されます。
  • publicConfiguration - フロントエンドとバックエンドから見えます。
  • privateConfiguration - バックエンドからのみ見えるようになります。
  • sendPublicConfiguration - パブリック設定を公開し、それをグローバル変数に割り当てるルート。例えば、以下のコードは、フロントエンドでパブリック設定をグローバル変数myConfとして公開します。デフォルトではグローバル変数名confを使います。

    app.get( "/ backend/conf"、必須( "conf")。sendPublicConfiguration);

オーバーライドの論理

  • privateConfigurationはpublicConfigurationにマージされてからmeConfにマージされます。
  • publicConfigurationは、各キーにオーバーライドがあるかどうかを確認し、そのオーバーライドを使用します。このようにして私たちは個人的なものを公開していません。

環境サポートを追加する

「環境サポート」は役に立ちませんが、誰かが役に立つかもしれません。

環境サポートを追加するには、meConf requireステートメントを次のようなものに変更する必要があります(疑似コード)

if(environment == "production"){meConf = require( "../ conf/dev/meConf")。production; }

if(environment == "development"){meConf = require( "../ conf/dev/meConf")。development; }

同様に、あなたは環境ごとにファイルを持つことができます

 meConf.development.js
 meConf.production.js

正しいものをインポートしてください。他のロジックは同じです。

3
guy mograbi

'development' 'production' configsを分離するのが良いでしょう。

私は次のように使います:これが私の config/index.js fileです。

const config = {
    dev : {
        ip_address : '0.0.0.0',
        port : 8080,
        mongo :{
            url : "mongodb://localhost:27017/story_box_dev",
            options : ""
        }
    },
    prod : {
        ip_address : '0.0.0.0',
        port : 3000,
        mongo :{
            url : "mongodb://localhost:27017/story_box_prod",
            options : ""
        }
    }
} 

設定には以下を使用する必要があります。

const config = require('../config')[process.env.NODE_ENV];

あなたがあなたのconfigオブジェクトを使うことができるより:

const ip_address = config.ip_address;
const port = config.port;
2
Aram Manukyan

npmモジュールconfigを使うだけです(300000以上のダウンロード)

https://www.npmjs.com/package/config

Node-configはあなたのアプリのデプロイのための階層的な設定を整理します。

これにより、一連のデフォルトパラメータを定義し、それらをさまざまなデプロイメント環境(開発、QA、ステージング、プロダクションなど)に拡張できます。

$ npm install config
$ mkdir config
$ vi config/default.json


{
      // Customer module configs
      "Customer": {
        "dbConfig": {
          "Host": "localhost",
          "port": 5984,
          "dbName": "customers"
        },
        "credit": {
          "initialLimit": 100,
          // Set low for development
          "initialDays": 1
        }
      }
}



$ vi config/production.json

{
  "Customer": {
    "dbConfig": {
      "Host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}



$ vi index.js

var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);

if (config.has('optionalFeature.detail')) {
  var detail = config.get('optionalFeature.detail');
  //...
}


$ export NODE_ENV=production
$ node index.js
2
аlex dykyі

あなたはpconfを使うことができます: https://www.npmjs.com/package/pconf

例:

var Config = require("pconf");
var testConfig = new Config("testConfig");
testConfig.onload = function(){

  testConfig.setValue("test", 1);
  testConfig.getValue("test");
  //testConfig.saveConfig(); Not needed

}

nconfモジュール に記載されている この回答 、および node-config に記載されている この回答 には もあります。 node-iniparser および IniReader 。これらは、より単純な.ini構成ファイルパーサーのように見えます。

1
Wingman4l7

私は最近、あらゆるタイプの設定ファイルをロードするための小さなモジュールをリリースしました。それはかなり簡単です、あなたは https://github.com/flesler/config-node でそれをチェックすることができます

1
Ariel Flesler

長い間、私はここの解決策で述べたアプローチを使用していました。しかし、平文での秘密の安全性について懸念があります。セキュリティビットが処理されるようにconfigの上に別のパッケージを使うことができます。

これをチェックしてください: https://www.attosol.com/secure-application-secrets-using-masterkey-in-Azure-key-vault/

0
Rahul Soni

この古いスレッドを訪れている人のためにここに私は良いことがわかっているパッケージです。

https://www.npmjs.org/package/config

0
Venkat Kotra

私はここで提案された解決策のいくつかを試してみましたが、それらに満足していなかったので、私は私自身のモジュールを作成しました。それはmikro-configと呼ばれ、主な違いはそれが設定よりも規約を尊重するということです、それであなたはただモジュールを要求してそれを使い始めることができます。

あなたはあなたの設定を普通のjsか/configフォルダからのjsonファイルに保存します。最初にdefault.jsファイルをロードし、次に/configディレクトリから他のすべてのファイルをロードし、次に$NODE_ENV変数に基づいて環境固有の構成をロードします。

ローカル開発用のこの設定をlocal.jsまたは環境固有の/config/env/$NODE_ENV.local.jsで上書きすることもできます。

あなたはここでそれを見てみることができます:

https://www.npmjs.com/package/mikro-config

https://github.com/B4nan/mikro-config

0
Martin Adámek