十二因素应用:与配置指南保持一致的方法

时间:2016-12-17 20:49:48

标签: ruby-on-rails environment-variables 12factor

我正在写一篇关于12因素应用程序的论文,我想知道你是否可以帮助我。

十二因素应用程序的第三个因素是:在环境中存储配置。 (https://12factor.net/config)。根据页面,所有可能在部署之间变化的配置都应该提取到环境变量。

我想知道如何在开发期间应用一个Rails应用程序。目前我认为有两种方式在我看来并不完美。

  • 将环境变量存储在 .bashrc .zshrc 等文件中。我不知道如何使用这种方法管理测试和开发环境,因为两者都需要使用相同环境变量的特定配置。此外,当处理多个项目时,这将使变量混乱,但它似乎符合十二因素应用程序方法。
  • 使用像https://github.com/bkeepers/dotenv这样的工具,它使用一个文件作为项目的一部分来存储配置,因此与Rails框架已经提供的secrets.yml或database.yml没有多大区别,哪个是不完全符合12因素应用程序的想法(仍然可能意外地检入代码库,并且主要是与语言无关)

我的观点是否正确?我想知道是否有任何最佳实践来解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:2)

基本上,可以根据您的上下文访问环境变量。运行流程的用户,系统,应用程序都可以修改您可以在应用程序中的任何给定时间/地点访问的变量集。那么,你把它们放在哪里取决于你的应用程序的需求 - 你需要在同一台服务器上隔离不同的应用程序吗?您是否需要有效管理数十个应用程序?您是否需要配置和填充新的服务器环境?等

至于这里的选项是我所经历的:

.*rc文件适用于这种配置,即使您可能不喜欢它的 flavor 这些可供环境运行文件的用户使用,因此如果您的登录用户为ubuntu,但您的服务以其他用户身份运行,例如{{1},则可能对您无效}或www-data

Dotenv也很好,因为它在运行时将变量注入到实际的ENV中。不完美,但仍然可以接受imho(假设你从不将这些变量提交给vc,正如你所指出的那样)。 这使得使用Dotenv 的单个应用程序可以使用它们。

其他方式(对于Web应用程序)将它们放入Apache或Nginx(或其他Web服务器)配置中。它们可以放在虚拟主机定义层的环境中,也可以放在服务/守护进程配置层(尽管我认为Nginx不支持vhost环境)。 这使得变量可供这些服务启动的任何应用。这对于网站或网络应用程序来说很常见。

您还可以在服务器范围内设置环境:httpd/etc/profile。这使它们可用于整个系统上的任何服务。

除此之外(多服务器应用程序,复杂托管等)更多是Ops的问题 - 管理多个配置集仍然与12因素应用程序相关,但不会有一个简单的答案:)< / p>

这是很酷的事情:

你不必马上做出决定!使用环境变量是一种非常灵活的方法!您可以在开发Macbook上使用DotEnv,将它们放在Staging环境中的Apache中,使用/etc/environment作为测试/集成服务器,并将它们放在.bashrc的定制Lighttpd生产服务器上。让你的应用程序期望你的配置在ENV中意味着你的应用程序不必关心它是如何到达的那样 !!!