Ruby on rails Rails部署,每个客户机一个环境,这样对吗?

Ruby on rails Rails部署,每个客户机一个环境,这样对吗?,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我们的应用程序是用于医院的Saas,部署在一台生产服务器上(与linux+nginx+puma的代码相同),用于所有客户机。 默认情况下,它们有三个:测试、开发和生产。但在我们的例子中,有10个环境配置文件指向文件夹“config/environments/”中的10个客户端配置文件。我们为环境文件命名医院,例如 config/environments/hospital1.rb config/environments/hospital2.rb config/environments/hospit

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

config/environments/hospital1.rb
config/environments/hospital2.rb
config/environments/hospital3.rb
...
有几个功能是通过
引擎
开发的

现在想象一下,hospital1为功能付费。如何仅为医院1提供活动功能1? 我目前正在Gemfile中执行此操作

group :hospital1 do
  gem 'feature1', path to ....
end
问题: 这是将生产环境替换为特定于客户机的环境并能够在GEMFILE中启用/禁用gem的好方法吗


欢迎任何建议

就我个人而言,我更喜欢将环境视为技术层面的东西,而不是应用程序逻辑的东西。因此,我会尽量少使用环境。如果您想在
Gemfile
中使用条件语句,那么最好使用环境变量?差不多

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

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

这听起来是个坏主意

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

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


至于限制对付费功能的访问,你们应该考虑这样做的解决方案
Gemfile
绝对不是适合您的业务逻辑的地方

这真是个糟糕的方法

基本上,你是在试图做多任务,但在非常奇怪和失控的方式

这是一个体系结构的决定,它不能符合StackOverflow的答案,许多人需要一整本书来解释它

看一看,获得一些观点


基本上,功能启用/禁用应该基于规则进行,这些规则至少应该可以通过一些管理面板轻松管理。

针对每个客户的环境的方法不能很好地扩展
Gemfile
绝对不是保存客户端设置的地方。而且它更难测试

如果您需要强大的分离(分离数据库、工人等)-我仍然会选择一个
生产环境:

  • 有一个配置文件,其中包含所有客户端的设置(已启用的功能等):
  • 医院1:
    名称:想象医疗中心
    地址:无处街0号
    特征:
    cool_通知:true
    特征2:错误
    医院2:
    名称:模糊视野通勤医院
    特征:
    特征1:错误
    
    稍后,这可以演变为一个管理数据库

  • 而不是环境传递一个租户id为的ENV变量(比如
    HOSPITAL\u NAME=hospital1 rails server-e production
    ),并创建一个单例对象,在调用时加载该配置
  • 所有引擎都可以在gemfile中,但是如果启用了相应的功能,则使用
    require:false
    ,并且您只能将它们加载到application.rb(就在
    Bundler.require
    之后)

  • 如果您可以允许一些资源共享(如web workers),也可以查看一下。您必须向应用程序和功能切换中添加多域支持,但处理不断增长的客户端数量(并节省服务器资源,最有可能的是,您的客户端都不会产生高持续负载)会更加容易。

    谢谢您的时间。至于插件管理,有什么好的开源项目值得推荐吗?每个客户端都有自己独立的数据库。没有超级管理面板来控制所有客户端的权限。所以权威人士帮不上忙。谢谢你抽出时间