从 Heroku 迁移到 VPS(数字海洋)时如何管理两个不同的生产环境

How to manage two different production environments while migrating from Heroku to VPS (Digital Ocean)

我有一个正在运行的 Rails 应用程序,目前 运行 在 Heroku 上。为了缩减成本,我正在将整个应用程序迁移到 Digital Ocean。到目前为止,我所做的大部分工作只涉及添加额外的 gem 和文件以支持 Capist运行o 部署,但我只是 运行 进入我需要不同的第一个(可能是很多)实例我在 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,我将需要更像(也许完全像)test/development 配置的东西。但是,在迁移过程中,我需要同时工作,因为我可能需要将代码(错误修复等)部署到实时生产环境,同时慢慢设置 Digital Ocean 环境。

由于在我完成此迁移过程中可能还会有许多此类事件的其他实例,因此我认为处理此问题的最佳方法是单独 Git b运行ch 用于数字海洋环境。但我不完全确定设置它的最佳方法。我非常感谢必须在实时站点上进行此类迁移的人的任何指示。

以下是我对过去采用的方法的大致看法:

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

  2. 为 digital ocean 创建并签出一个新的 git 分支。

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

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

  5. 在 Heroku 上为您的生产数据库拍摄快照,并将它们导入到您在 Digital Ocean 上使用的数据库中。再次测试您的站点并确保它可以正常使用生产数据。

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

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

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