Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pm2部署[node.js]-隐藏凭据和敏感数据_Node.js_Git_Credentials_Password Protection_Pm2 - Fatal编程技术网

pm2部署[node.js]-隐藏凭据和敏感数据

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

我的目标是从我的git回购中隐藏凭证。 我的整个应用程序管道使用Jenkins MultiBranch+PM2和部署功能

下面的示例应用程序运行良好,它使用pm2部署,功能没有问题,只是安全性问题

但是,正如您所看到的,环境变量是用其中的密码设置的

PM2的本机工作流在执行时从git提取。因此,我需要以某种方式将我的凭据安全地保存在git中,或者将它们放在我的repo之外,但是在repo之外的任何文件都可能在部署节点中丢失和遗忘

通常我只会将硬编码的密码写入配置文件,但这意味着配置文件必须与repo完全隔离(不好,很容易丢失/忘记),或者将密码放入配置文件并签入(与我现在遇到的问题相同)

另一个想法是在repo中保留一个“模板”配置文件,然后仅在部署服务器上填写。这可以很好地工作,但是在下一次执行时,pm2将撤销回购协议,用git版本覆盖我的版本

所以说了这么多,我有点不知所措怎么做

最好的情况是,我可以将creds放入Jenkins credential manager中,该管理器在构建时传递。然而,由于Jenkins并没有实际进行部署(pm2正在进行部署),我觉得这是不可能的

我正在寻找解决这个难题的想法和最佳实践。在应用程序中如何处理这个问题

{
  "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,
      },
    }
  }
};