使用 Capistrano 将 Rails 应用程序部署到多个服务器 - 最佳实践

Posted

技术标签:

【中文标题】使用 Capistrano 将 Rails 应用程序部署到多个服务器 - 最佳实践【英文标题】:Deploying a Rails App to Multiple Servers using Capistrano - Best Practices 【发布时间】:2011-02-07 16:36:14 【问题描述】:

我有一个 Rails 应用程序需要部署到 3 个服务器 - machine1.com、machine2.com 和 machine3.com。我希望能够一次将它部署到所有机器上,并单独部署到每台机器上。有人可以帮助我使用骨架 Capistrano 配置文件/配方吗?应该全部在 deploy.rb 中还是应该在 machine1.rb 等中拆分出来?

我认为让 Capistrano 接受命令行参数的方法是正确的,但是当我尝试在命名空间中设置角色时,它就窒息了。我将'hosts = 1,2,3'作为参数传递,并将角色:app/web/db 设置为“machine#host.com”,然后拆分命令并进入 each do |host | ...

无论如何,除了在每次运行 cap:deploy 之前创建 4 个不同的 deploy.rb 文件并重命名它之外,我很难过。我希望能够做到以下几点:

cap deploy:machine1:latest_version_from_svn
cap deploy:all_machines:latest:version_from_svn

只是不知道它是否应该全部放在 deploy.rb 中并与命名空间分开,还是应该分成多个 *deploy**.rb 文件。

【问题讨论】:

【参考方案1】:

所有内容都应该放在一个文件中。这是一个例子:

set :application, "my-app"
set :repository,  "git@git.my-git-host.com:my-app.git"
set :keep_releases, 5
set :deploy_via, :remote_cache
set :git_enable_submodules, true
set :scm, :git
set :user, 'your-user-here'

set :deploy_to, "/var/www/staging.mydomain.com"
set :branch, 'staging'
set :rails_env, 'staging'

role :web, "machine1.mydomain.com", "machine2.mydomain.com", "machine3.mydomain.com"
role :app, "machine1.mydomain.com", "machine2.mydomain.com", "machine3.mydomain.com"
role :db, "db.mydomain.com"
# ...

您会看到只指定了一个数据库服务器。这是运行迁移的机器。如果您只有一个数据库(该问题的答案为“是”的概率为 99.9%),请确保只提供一个。

【讨论】:

你将如何部署到 machine1.mydomain.com (如问题所述) @Nikhil Gupte 使用块而不是固定列表可能值得探索这样做。例如***.com/a/11594890/495319【参考方案2】:

我不得不使用稍微不同的语法。

role :app, %ws01.foobaz.com s02.foobaz.com, user: 'deployer'
role :web, %ws01.foobaz.com s02.foobaz.com, user: 'deployer'

【讨论】:

以上是关于使用 Capistrano 将 Rails 应用程序部署到多个服务器 - 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Capistrano 部署 Rails 应用程序 - 如何处理长时间迁移?

Rails Ubuntu / passenger / capistrano应用程序资产未部署

使用 Capistrano 部署 Rails 5.1 / Webpacker 应用程序

无法通过 capistrano 部署 rails 5 应用程序

如何在通过 Capistrano 部署 Rails 应用程序时输入 ssh 密钥的密码?

如何在被 capistrano 禁用时访问 rails 应用程序,使用 deploy:web:disable 来更新内容?