【问题标题】:How to manage two different production environments while migrating from Heroku to VPS (Digital Ocean)从 Heroku 迁移到 VPS(数字海洋)时如何管理两个不同的生产环境
【发布时间】:2016-07-30 00:44:50
【问题描述】:

我有一个正在运行的实时 Rails 应用程序,目前正在 Heroku 上运行。为了缩减成本,我正在将整个应用程序迁移到 Digital Ocean。到目前为止,我所做的大部分工作只涉及添加额外的 gem 和文件以支持 Capistrano 部署,但我只是遇到了第一个(可能是很多)实例,我需要在 Digital Ocean 上为我的应用程序进行不同的配置,而不是什么我用于 Heroku。具体来说就是 Redis。在 Heroku 上,您需要使用附加组件(“Redis To Go”),因为您无法直接安装 Redis。因此我的 reds_init.rb 看起来像这样:

if Rails.env.development? || Rails.env.test?
  redis_conf_path = Rails.root.join("config/redis", "#{Rails.env}.conf")
  redis_conf = File.read(redis_conf_path)
  port = /port.(\d+)/.match(redis_conf)[1]
  `redis-server #{redis_conf_path}`
  REDIS = Redis.new(:port => port)
end

if Rails.env.production?
  uri = URI.parse(ENV["REDISTOGO_URL"])
  REDIS = Redis.new(:url => ENV['REDISTOGO_URL'])
end

production 配置是 Heroku 特有的,对于 Digital Ocean,我需要更类似于(可能完全类似于)测试/开发配置的东西。但是,在迁移过程中,我需要同时工作,因为我可能需要将代码(错误修复等)部署到实时生产环境,同时慢慢设置 Digital Ocean 环境。

由于在我完成此迁移时可能会有许多其他此类事情的实例,我认为处理此问题的最佳方法是为 Digital Ocean 环境创建一个单独的 Git 分支。但我不完全确定设置它的最佳方法。我非常感谢必须在实时站点上进行此类迁移的人的任何指点。

【问题讨论】:

    标签: ruby-on-rails git vps


    【解决方案1】:

    以下是我的想法以及我过去采用的方法的大致轮廓:

    1. 为了更好地衡量,请确保您的生产环境稳定(测试通过)并且最好部署在 git 上的 master 分支之外。您将希望能够在主服务器上可靠地部署修补程序,并在与开发环境进行迁移期间交叉引用任何未来的更改。同时备份您的数据库。

    2. 为数字海洋创建并签出一个新的 git 分支。

    3. 创建一个新的 Rails 配置环境或数字海洋,最好使用与 (2) 中的分支名称一致的名称。确保您的新环境与您在生产中使用的环境隔离。换句话说,您不应该能够从新环境中“污染”您的生产环境。这意味着所有 db & api 连接都使用单独的凭据。还要尝试通过跟踪特定更改的提交来牢记版本控制。如有必要,这将使通过git bisect 进行调试更容易。

    4. 使用种子数据库中的数据在数字海洋上配置和测试应用服务器的部署。确保您可以执行部署的所有方面,包括运行迁移、资产预编译、捆绑器、nginx/unicorn 的稳定性,而不会影响站点的稳定性。

    5. 在 Heroku 上拍摄您的生产数据库的快照,并将它们导入到您在 Digital Ocean 上使用的数据库中。再次测试您的网站并确保它与生产数据一起正常工作。

    6. 安排一个时间,让您的站点脱机,以便有足够的时间进行迁移。您需要移动 DNS、数据库数据、环境配置以及任何其他特定于环境的数据。

    由于您的主分支应该是稳定的,您可以随时返回到它以根据需要部署错误修复。但是,请确保将(git cherry-pick)这些提交合并到 master 之前的任何分支中以保持一致性。如果您还没有,我建议您结帐 git-flow:http://nvie.com/posts/a-successful-git-branching-model/

    这主要是为了思考,因为关于在数据中心之间迁移应用程序的主题有很多话要说。具体方法和策略将取决于您的开发运营设置和应用程序环境。

    【讨论】:

    • 哇。这太棒了,比我预期的要多得多。我目前的重点是第 3 步,所以我有几个问题。首先,要确认一下,听起来要走的路是对所有迁移工作使用单独的分支,这意味着我想测试部署过程以在非主分支上执行,直到事情得到解决,正确的?其次,我已经创建了我的“droplet”,我假设这就是你所说的配置环境,是吗?这仍然是我的 rails 配置文件中的 production 配置,是吗?
    • master 应该始终处于稳定、可部署的状态。也就是说,您的代码在生产中的状态。配置环境是指应用程序在特定部署中运行所需的所有变量和配置。其中一些存在于 Rails 中(例如要连接到哪个数据库),而另一些则不存在(例如 DNS 设置)。我建议创建一个除 production.rb 之外的新 Rails 环境(例如“staging.rb”),以确保您不会在新设置和 Heroku 上的当前设置之间交叉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多