pm2部署[node.js]-隐藏凭据和敏感数据
我的目标是从我的git回购中隐藏凭证。 我的整个应用程序管道使用Jenkins MultiBranch+PM2和部署功能 下面的示例应用程序运行良好,它使用pm2部署,功能没有问题,只是安全性问题 但是,正如您所看到的,环境变量是用其中的密码设置的 PM2的本机工作流在执行时从git提取。因此,我需要以某种方式将我的凭据安全地保存在git中,或者将它们放在我的repo之外,但是在repo之外的任何文件都可能在部署节点中丢失和遗忘 通常我只会将硬编码的密码写入配置文件,但这意味着配置文件必须与repo完全隔离(不好,很容易丢失/忘记),或者将密码放入配置文件并签入(与我现在遇到的问题相同) 另一个想法是在repo中保留一个“模板”配置文件,然后仅在部署服务器上填写。这可以很好地工作,但是在下一次执行时,pm2将撤销回购协议,用git版本覆盖我的版本 所以说了这么多,我有点不知所措怎么做 最好的情况是,我可以将creds放入Jenkins credential manager中,该管理器在构建时传递。然而,由于Jenkins并没有实际进行部署(pm2正在进行部署),我觉得这是不可能的 我正在寻找解决这个难题的想法和最佳实践。在应用程序中如何处理这个问题pm2部署[node.js]-隐藏凭据和敏感数据,node.js,git,credentials,password-protection,pm2,Node.js,Git,Credentials,Password Protection,Pm2,我的目标是从我的git回购中隐藏凭证。 我的整个应用程序管道使用Jenkins MultiBranch+PM2和部署功能 下面的示例应用程序运行良好,它使用pm2部署,功能没有问题,只是安全性问题 但是,正如您所看到的,环境变量是用其中的密码设置的 PM2的本机工作流在执行时从git提取。因此,我需要以某种方式将我的凭据安全地保存在git中,或者将它们放在我的repo之外,但是在repo之外的任何文件都可能在部署节点中丢失和遗忘 通常我只会将硬编码的密码写入配置文件,但这意味着配置文件必须与re
{
"apps" : [{
"name" : "myapp",
"script" : "myapp.js",
"version" : "0.0.1",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"NODE_ENV": "production",
"PORT": 3009,
"DB_HOST":"proddb.example.com",
"DB_PASS":"db_password"
},
"env_stage" : {
"NODE_ENV": "stage",
"PORT": 3009,
"DB_HOST":"stagedb.example.com",
"DB_PASS":"db_password"
}
}],
"deploy" : {
"stage" : {
"user" : "pm2deploy",
"host" : "node01stage.example.com",
"ref" : "origin/stage",
"repo" : "git@example.com:devproj/myapp.git",
"path" : "/var/www",
"post-deploy" : ". ~/.bash_profile && npm install && pm2 startOrRestart ecosystem.json --env stage"
},
"production" : {
"user" : "pm2deploy",
"host" : "node01prod.example.com",
"ref" : "origin/master",
"repo" : "git@example.com:devproj/myapp.git",
"path" : "/var/www",
"post-deploy" : ". ~/.bash_profile && npm install && pm2 startOrRestart ecosystem.json --env production"
}
}
}
使用或类似方法使敏感数据远离pm2配置,并使用env
属性deploy.production
configuration将env变量导入远程执行
发件人:
设置示例:
.env:
ecosystem.config.js:
.env应该添加到
.gitignore
,这样您的敏感数据就不会被签入。有什么解决方案吗?@BalasubramaniM我们刚刚决定不使用pm2部署
功能,而是通过另一种方法部署应用程序。我们在pm2部署方面的经验证明,它不够稳定或活跃,不足以保证生产使用。如果您希望在这里分享您的另一种方法,这将非常有用。
// Environment variables that must be injected in all applications on this env
"env" : {
"NODE_ENV": "production"
}
DB_HOST=proddb.example.com
DB_PASS=db_password
require('dotenv').config();
module.exports = {
"apps" : [{
"name" : "myapp",
"script" : "myapp.js",
"version" : "0.0.1",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"NODE_ENV": "production",
"PORT": 3009,
},
"env_stage" : {
"NODE_ENV": "stage",
"PORT": 3009,
}
}],
"deploy" : {
"stage" : {
"user" : "pm2deploy",
"host" : "node01stage.example.com",
"ref" : "origin/stage",
"repo" : "git@example.com:devproj/myapp.git",
"path" : "/var/www",
"post-deploy" : ". ~/.bash_profile && npm install && pm2 startOrRestart ecosystem.json --env stage"
},
"production" : {
"user" : "pm2deploy",
"host" : "node01prod.example.com",
"ref" : "origin/master",
"repo" : "git@example.com:devproj/myapp.git",
"path" : "/var/www",
"post-deploy" : ". ~/.bash_profile && npm install && pm2 startOrRestart ecosystem.json --env production",
"env": {
DB_HOST: process.env.DB_HOST,
DB_PASS: process.env.DB_PASS,
},
}
}
};