Rails部署,每个客户端有一个正确的环境吗?

问题描述 投票:0回答:2

我们的应用程序是医院的Saas,已为所有客户部署在一个生产服务器上(与Linux + nginx + puma相同的代码)。默认情况下,其中有三个:测试,开发和生产。但在本例中,我们有10个环境配置文件指向文件夹“ config / environments /”中的10个客户端配置文件。并且我们给医院名称加上环境文件,例如

config/environments/hospital1.rb
config/environments/hospital2.rb
config/environments/hospital3.rb
...

[engine开发了几种付费功能。

现在想象,医院1为功能1支付了费用。如何仅针对医院1激活功能1?我目前正在Gemfile中执行此操作

group :hospital1 do
  gem 'feature1', path to ....
end

问题:这是将生产环境替换为特定于客户的环境并能够启用/禁用GEMFILE中的gem的好方法吗?

欢迎任何建议!

ruby-on-rails ruby ruby-on-rails-5
2个回答
0
投票

我个人更喜欢将环境视为技术级别的东西,而不是应用程序逻辑的东西。因此,我将尝试保持尽可能少的环境。如果您想在Gemfile中使用条件语句,也许最好使用环境变量?有点像

if ENV['FEATURE_1_ENABLED']
  gem 'feature1', path to ....
end

您甚至可以通过每家医院拥有一个.env文件并使用Dotenv.load加载适当的文件来自动管理这些变量。


0
投票

这听起来是个坏主意。

您在这里“混合橘子和沙发”。环境和客户端具有不同的语义。

您拥有的是同一应用程序部署在不同服务器上的不同实例(然后,特定于客户端的内容应来自环境变量),或者如果是单个部署(看起来像您的情况),则客户端-具体设置应存储在数据库中。

关于限制对付费功能的访问,您应该研究像pundit这样的解决方案。 Gemfile绝对不是适合您的业务逻辑的地方!

© www.soinside.com 2019 - 2024. All rights reserved.