【问题标题】:Best practices to have different variables for development and production为开发和生产设置不同变量的最佳实践
【发布时间】:2021-10-08 20:13:11
【问题描述】:

我正在开发一个用 node、hapijs、nodemon 等制作的小型服务器。
这是一个基本的 api 休息,将随着正在进行的开发而增长。

我需要为 dev 设置不同的变量。和生产。我实际上只有一个 .env 文件。我读过不建议为此使用 2 个单独的文件。

我应该如何修改我的 app.js 有两种情况?

  1. 在我的电脑上本地运行 nodemon 而在 dev 和本地变量中
  2. 部署到 Heroku 时,使用生产变量

非常感谢,

【问题讨论】:

    标签: node.js heroku hapijs


    【解决方案1】:

    您可能已经这样做了。编写代码以使用环境变量。 (无论您是在本地运行还是在生产环境中运行,都是相同的代码。)。

    const ACCESS_KEY = process.env.ACCESS_KEY;
    

    您的 .env 文件只包含您的本地设置,以便在您的本地计算机上进行调试。您可以在 .gitignore 文件中添加 .env 以确保它不会被推送到您的 git 存储库。

    相比之下,生产设置根本不应该在任何文件中。它们只能在您的云提供商的设置中直接配置。

    • 如果您使用的是 Azure,它们应该位于 Azure Key Vault
    • 如果您使用 AWS,它们应该位于 KMS
    • 如果您使用的是 Heroku,那么它们应该在 Heroku 的设置中进行配置。

    Heroku 设置

    您可以通过 heroku 应用仪表板中的“设置”标签来执行此操作。有一个“配置变量”部分。

    当 heroku 启动您的应用程序时,它会将配置的配置变量定义为环境变量。您将能够使用 process.env 访问它们,就像使用在开发期间在 .env 文件中定义的环境变量一样。

    命令行

    仪表板可让您轻松获得概览和管理密钥。也许更方便的是,您也可以直接从命令行使用 heroku cli 工具 来执行此操作。

    要获取当前环境变量的列表,请运行。

    heroku config
    

    从 CLI 添加新密钥。

    heroku config:set ACCESS_KEY=adfsqfddqsdf
    

    所有这些也都在 Heroku 的official documentation 中有所描述。

    【讨论】:

    • 优秀。谢谢@bvdb
    【解决方案2】:

    一种被广泛采用的最佳实践是在运行时注入应用程序设置(秘密和环境配置)。

    更安全(秘密不存储在源代码、包或包/图像中)和可移植(当您部署到更多环境时,您只需要定义合适的值 - 无需更改代码、重新编译或重新打包)。

    单个 .env 文件

    定义一个.env 文件:您的应用程序在任何地方都需要相同的属性(显然具有不同的值)。

    在您的本地开发环境中配置 .env 文件进行开发:您无需提交任何一个打包此文件。

    生产部署

    定义运行时配置:例如在 Heroku 上使用Config Vars.env 文件中定义的每个属性创建一个环境变量

       # .env 
       API_TOKEN = dev1
    

    使用生产值创建一个 Config Var API_TOKEN:这是在应用程序启动时注入的,从不存储/公开。

    这种方法与语言无关(在 Java 中,您可能有 .properties,但原理相同)并且适用于不同的托管服务提供商:您将部署相同的应用程序/包,同时相应地配置环境设置。

    【讨论】:

      【解决方案3】:

      我建议使用 npm 包来处理不同的环境变量和键。 (或者自己实现)

      与 .env 文件一起

      1- 使用 .env 文件来存储凭据和秘密 2- 通过为每个环境提供单独文件的不同包引用这些 .env 变量

      推荐包:https://www.npmjs.com/package/config

      我在我的一个项目中使用了这种方法,让我的生活更轻松。

      【讨论】:

        【解决方案4】:

        通常,您会在构建时生成 env 文件。例如,使用 AWS SSM / 或某种安全的 Vault,您可以存储您的秘密,例如数据库密码。 env 文件是一个模板,它使用目标部署的正确 env 变量进行编译。

        此外,您可以在您的 env 模板中包含您提交给 git 的虚拟变量。然后将一个带有条目的 .gitignore 文件添加到您的 env 模板中,以确保您不会向 env 文件提交任何秘密。然后在本地编译文件以供本地,在临时构建期间进行临时构建,在 prod 构建期间为 prod 等。

        随着应用程序变得越来越大,这允许您为每个人/每个环境配置凭据。您将关联的机密/权限添加到保管库。允许人员/环境访问这些机密,然后您可以以非常精细的方式控制访问。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-10
          • 2021-05-05
          相关资源
          最近更新 更多