您是否使用环境变量或prod.secret.exs
来存储密码,API密钥等?对此有什么经验法则?我觉得它们或多或少是相同的,因此混淆了哪一个使用。
请注意,我不想通过合并第三方来使其变得复杂 我的代码库。我想要一个开箱即用的解决方案,最好。
答案 0 :(得分:5)
环境变量。
是否是Phoenix / Elixir并不重要。
根据一组名为The Twelve-Factor App的最佳做法,
十二因素应用程序将配置存储在环境变量中(通常缩写为env vars或env)。在不更改任何代码的情况下,可以在部署之间轻松更改Env变量;与配置文件不同,它们几乎没有机会被意外地检入代码仓库;与自定义配置文件或其他配置机制(如Java系统属性)不同,它们是与语言和操作系统无关的标准。
答案 1 :(得分:5)
如此快速和简单 - 对于小型混合/凤凰项目我总是使用dev/test/prod.secret.exs
文件,然后只需用Application.get_env(:key, :value)
获取我需要的东西,例如 - 我的{env}.secret.exs
文件可能看起来像这样:
config :my_app, api_key: "1234567890"
然后在代码中的某个地方:
def do_stuff do
api_key = Application.get_env(:my_app, :api_key)
end
当然主配置文件应包含导入:
import_config "#{Mix.env}.secret.exs"
什么是非常重要 - 不要忘记将您的秘密文件添加到.gitignore
对于需要更多安全性的大型项目 - 我会使用env变量。请查看此guide。
答案 2 :(得分:1)
对我而言,它是两者的混合,并且将取决于我是否期望在运行时期间该值发生变化。对于保持静态的东西,比如API密钥,我使用prod.secrets.exs.
我使用它的原因是因为我可以在我配置应用程序的方式上保持一致。对于其他一切,我使用配置文件,我想对我的秘密做同样的事情。我还可以将秘密文件放入不同的版本控制系统,以便我获得对文件和由谁进行更改的历史记录。我也可以这样做,以便编写代码的人不需要对秘密文件的读访问权。在部署时,有权进行部署的人可以运行一个脚本来提取秘密文件,然后创建一个版本。该版本将部署到亚马逊,并隐藏秘密。还有一些错误情况会导致应用程序将其环境转储到您的日志记录系统,并且您的所有秘密都以明文形式存在。
缺点是配置是静态的。对机密的任何更改都意味着运行另一个版本。如果你有一个功能标记,比如说DEBUG=true
,你就不想再打开另一个版本来打开调试。这就是环境变量闪耀的地方。只需更改env,您的应用就会开始调试。但是,如果您要使用环境变量,则应将System.get_env
的呼叫置于您将要使用它的模块中。我把System.get_env
调用到我的prod.secrets.exs
文件中的位置被咬了,结果是我的应用程序使用当时存在的环境变量进行编译,并且更改不是动态应用。