许多Capistrano示例配方包括:db
角色。默认情况下,部署任务将应用程序代码导出到所有角色中的所有主机。因此,这表明人们通常会在数据库主机上保留其应用程序的副本。此外,在Capistrano的分布式deploy.rb
食谱中,:deploy:migrate
看起来像这样:
task :migrate, :roles => :db, :only => { :primary => true } do
# ...
end
我的问题是,为什么这样做?将应用程序代码保留在数据库主机(可能甚至没有安装Ruby)并从生产框运行迁移不是更清晰吗?
答案 0 :(得分:7)
db server运行迁移,因为它是对数据库负责的人。
人们还可以想象安全策略只允许从数据库服务器本身创建/删除/更改表。
如果在迁移过程中加载了数据,甚至可能会有轻微的性能提升,尽管这是一个糟糕的想法。
如果您需要引用数据库主机并且不需要代码的副本,则可以使用以下内容:
role :db, 'dbhost', :no_release => true
在应用程序服务器上运行迁移的示例代码:
role :app, 'apphost', :runs_migrations => true
task :migrate, :roles = :app, :only => {:runs_migrations => true } do
#...
end