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

时间:2010-04-13 22:56:01

标签: ruby-on-rails capistrano

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

我认为我在正确的轨道上让Capistrano接受命令行参数,但是当我尝试在命名空间中设置角色时它会窒息。我将传递'hosts = 1,2,3'作为参数并在分配命令并进入每个do | host之后将app / web / db设置为“machine#{host} .com” | {} ...

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

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

只是不知道它是否应该在deploy.rb中与命名空间分开,或者是否应该分解为多个* deploy **。rb文件。

2 个答案:

答案 0 :(得分:71)

它应该全部放在一个文件中。这是一个例子:

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%为YES),那么请确保只提供一个。

答案 1 :(得分:3)

我必须使用稍微不同的语法。

role :app, %w{s01.foobaz.com s02.foobaz.com}, user: 'deployer'
role :web, %w{s01.foobaz.com s02.foobaz.com}, user: 'deployer'