【问题标题】: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 有两种情况?
- 在我的电脑上本地运行 nodemon 而在 dev 和本地变量中
- 部署到 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 中有所描述。
【解决方案2】:
一种被广泛采用的最佳实践是在运行时注入应用程序设置(秘密和环境配置)。
它更安全(秘密不存储在源代码、包或包/图像中)和可移植(当您部署到更多环境时,您只需要定义合适的值 - 无需更改代码、重新编译或重新打包)。
单个 .env 文件
定义一个.env 文件:您的应用程序在任何地方都需要相同的属性(显然具有不同的值)。
在您的本地开发环境中配置 .env 文件进行开发:您无需提交任何一个打包此文件。
生产部署
定义运行时配置:例如在 Heroku 上使用Config Vars 为.env 文件中定义的每个属性创建一个环境变量
# .env
API_TOKEN = dev1
使用生产值创建一个 Config Var API_TOKEN:这是在应用程序启动时注入的,从不存储/公开。
这种方法与语言无关(在 Java 中,您可能有 .properties,但原理相同)并且适用于不同的托管服务提供商:您将部署相同的应用程序/包,同时相应地配置环境设置。
【解决方案4】:
通常,您会在构建时生成 env 文件。例如,使用 AWS SSM / 或某种安全的 Vault,您可以存储您的秘密,例如数据库密码。 env 文件是一个模板,它使用目标部署的正确 env 变量进行编译。
此外,您可以在您的 env 模板中包含您提交给 git 的虚拟变量。然后将一个带有条目的 .gitignore 文件添加到您的 env 模板中,以确保您不会向 env 文件提交任何秘密。然后在本地编译文件以供本地,在临时构建期间进行临时构建,在 prod 构建期间为 prod 等。
随着应用程序变得越来越大,这允许您为每个人/每个环境配置凭据。您将关联的机密/权限添加到保管库。允许人员/环境访问这些机密,然后您可以以非常精细的方式控制访问。