【问题标题】:PM2 + Meteor Environment SetupPM2 + Meteor 环境设置
【发布时间】:2018-03-15 18:14:28
【问题描述】:

我正在尝试将 Meteor 设置为使用 pm2 (https://github.com/Unitech/pm2) 而不是永远作为节点进程监视器。我没有获得 pm2 进程需要看到 Meteor 应用程序的环境变量。

这是我的过程:

export MONGO_URL="mongodb://localhost:27017/meteor"
export PORT=4000
export ROOT_URL="https://beta.example.com/"
pm2 start main.js --name MyMeteorApp

在 pm2 的错误日志中,我看到我的 Meteor 应用程序抱怨找不到 MONGO_URL

为了使用 pm2,我需要使用特定的方式进行导出吗?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    您可以创建process.json(PM2 车队配置文件)文件,您可以在其中指定环境变量。

    例如:

    {
      "apps": [
        {
          "name": "MyMeteorApp",
          "script": "./main.js",
          "log_date_format": "YYYY-MM-DD",
          "exec_mode": "fork_mode",
          "env": {
            "PORT": 4000,
            "MONGO_URL": "mongodb://localhost:27017/meteor",
            "ROOT_URL": "https://beta.example.com/"
          }
        }
      ]
    }
    

    开始:pm2 start processes.json

    【讨论】:

    • 有没有办法给这个添加meteor --settings?
    • @JohhanSantana 是的,像这样插入其他环境变量:"METEOR_SETTINGS": { 'private': { ... }, 'public': { ... } }
    【解决方案2】:

    去结帐 pm2-meteor。应该可以帮助您生成 pm2-env.json。

    $ npm i -g pm2-meteor
    $ cd myMeteorProject
    $ pm2-meteor --settings meteor-settings.json
    

    【讨论】:

      【解决方案3】:

      截至 2018 年

      我遇到了这样的大问题,但现在一切都解决了。

      当您使用 PM2 定制生产 Meteor App 时,您只需在 bundle 目录中放置一个文件 process.json 并运行以下命令,

      pm2 start process.json
      

      下面是我想在生产环境中作为METEOR_SETTINGS传递的文件process.json的参数,

      {
        "apps": [
          {
            "name": "My APP",
            "script": "./main.js",
            "log_date_format": "YYYY-MM-DD",
            "exec_mode": "fork_mode",
            "env": {
              "PORT": 3000,
              "MONGO_URL": "mongodb://username:password@127.0.0.1:27017/dbname",
              "ROOT_URL": "http://hostname/",
              "METEOR_SETTINGS": {
                  "MAIL_URL": "smtps://<your username>:<your password>@smtp.gmail.com:465",
                  "AUTHKEY": "185938A0asmD231231231231e4992",
                  "HOSTNAME": "some example",
                  "public": {
                      "COMPANY_NAME": "Some Company Name"
                  }
              }
            }
          }
        ]
      }
      

      所以,在上面的代码中你可以看到我是如何设置METEOR_SETTINGS的。

      【讨论】:

      • 无法从项目文件 settings.json 的根目录中检索设置并使用 PM2 加载它们吗?是否需要在 process.json 中定义 Meteor 设置?
      • @yajairo:你可以试试,我还没有。
      • 嗨@AnkurSoni - 你需要修复你的METEOR_SETTINGS - 你已经放入名为public的部分,但忘记将其他部分放入名为private的部分。欢呼
      【解决方案4】:

      pm2 有点奇怪。但是这样的东西可以工作

      pm2 kill
      MONGO_URL="mongodb://localhost:27017/meteor" PORT=4000 ROOT_URL="https://beta.example.com/" pm2 start app.js --name MyMeteorApp
      

      之所以会这样,是因为 pm2 将所有内容都包装到一个自己的新进程中,该进程看不到原始环境的变量。我认为还有一种方法可以将环境变量放入 JSON 文件中,但我不确定文档到底有多空

      【讨论】:

        【解决方案5】:

        经过一番挖掘,我找到了正确的答案。在 pm2 中,您放置在 JSON 任务定义中的不是保留关键字之一的任何内容都将作为环境变量导出到您在 pm2 中运行的进程。

        【讨论】:

        • 比如什么变量名?
        • 请提供一个示例,说明您的 JSON 文件在放入任务定义时的情况。否则,我不会撤消我对这个答案的负面评价。