Node.js 我应该在节点服务器上的何处存储秘密字符串?
嗯,我有个问题。如何存储不应进入公共版本控制的密码、数据库url和重要字符串 我想出了3个解决方案。第一个仅适用于开发人员:Node.js 我应该在节点服务器上的何处存储秘密字符串?,node.js,Node.js,嗯,我有个问题。如何存储不应进入公共版本控制的密码、数据库url和重要字符串 我想出了3个解决方案。第一个仅适用于开发人员: var config = require('./config'); var port = config.serverPort; config.js module.exports = { 'serverPort' : '8182' } 第二个应该可以在dev和prod上使用。但是config.js文件添加到了.gitignore文件中,因此不会上载到服务器。当服务器
var config = require('./config');
var port = config.serverPort;
config.js
module.exports = {
'serverPort' : '8182'
}
第二个应该可以在dev和prod上使用。但是config.js文件添加到了.gitignore文件中,因此不会上载到服务器。当服务器试图请求config.js但找不到它时,它将抛出一个错误
var config = require('./config');
var port = process.env.PORT || config.serverPort;
第三个是仅使用process.env变量,但这仅适用于生产。而且,如果我在本地机器上测试,我可能需要粘贴我的秘密字符串,并记住在发送到公共版本控制之前删除它
那么,我该怎么办呢?常见的解决方案是向版本控制添加一个
config.js.example
文件(其中包含空/伪值以记录可用内容)
然后将config.js
添加到.gitignore(或适合您的VCS的任何内容)
要运行应用程序,只需将config.js.example
复制到config.js
并输入正确的值即可
当然,config.js
的路径可以从环境变量中获取,以便轻松使用不同的配置-但是,您不会将实际的配置文件置于版本控制之下(除非您对配置文件等有单独的私有repo)
总是需要一个配置文件存在是有意义的。即使在发展中。虽然默认设置可能是合适的,但您的应用程序上的许多开发人员还是希望配置一些东西,或者只是简单地使用非默认值测试一些东西。以下是我的建议:
1。混合使用文件和环境变量
您可以混合使用配置文件和process.env
变量来管理机密字符串
您可以这样做:
var port = process.env.PORT || config.serverPort;
从现在起,使用docker
是规则,您应该试试这个
2。使用样本
您可以在repo中添加一个config.json.example
,其中包含您应该定义的变量示例,但在这里,您必须记住在部署到生产环境时对其进行更改
只需记住将realconfig.json
添加到.gitignore
文件中。
这不是我的首选,但仍然是一个选择 可以使用
dotenv
包将配置和机密从.env
文件加载到process.env
中。对于生产,不必存在.env
文件
例如:
require('dotenv').config();
const oauth2 = require('simple-oauth2').create({
client: {
id: process.env.TWITTER_CONSUMER_KEY,
secret: process.env.TWITTER_CONSUMER_SECRET
}
});
.env文件:
TWITTER_CONSUMER_KEY=bMm...
TWITTER_CONSUMER_SECRET=jQ39...
.gitignore:
.env
有一个节点包处理这个问题,它与Ruby On Rails的凭证系统非常类似: 它允许您将机密保存在加密的vault文件中,并单独存储密钥。只要您对密钥文件保密,就可以将此vauft文件签入您的版本控制系统 可以为不同的节点创建vault文件。 如果通过密钥文件或环境变量放弃密钥,
您可以非常轻松地从应用程序中访问您的凭据。似乎一个包含机密设置且未签入版本控制的配置文件是一种常见的方法。但我应该如何在服务器中管理此未定义的要求?我的服务器崩溃,因为它找不到config.js文件。设置安装时,您可以手动创建或复制config.js文件。它是特定于给定安装的本地安装配置的一部分。例如,开发数据库的路径和密码可能与生产数据库不同(事实上,如果这是一家较大的公司,您甚至不允许知道生产数据库密码)。因此,每次设置与该环境中的配置(路径、密码、证书等)匹配的服务器时,您都会创建一个适当的配置文件。另一个常见选项是环境变量。您可以在源代码管理系统中签入默认config.js,以帮助记录其中的设置,您只是没有在源代码管理版本中添加任何机密。因此,它类似于var config=require(process.env.configPath)?然后我会有一个config.js.example文件,可以用作空文件,并将其添加到VCS中,而我的config.js将只存在于devs计算机上。嗯,差不多了
config.js
也会存在于生产机器上,但不会存在于VCS中;拥有真实生产配置值(如db用户/密码、AWS凭据等)的私有repo。在构建步骤中,在打包应用程序之前,我通过git clone获取这些文件。不太好的地方是,如果这些值不是一直是静态的,那么很难动态更改它们,因为它需要重建和重新打包所有内容。对于更多动态配置值(例如,我们的会话机密经常更改),我计划创建一个中央MySQL数据库来存储它们,不确定这是否是个好主意。我想说,当你提到MySQL时,这个好主意已经不再是一个好主意了;)(使用postgres)