【问题标题】:Capistrano Staging Deploy Requires Whole New Database MigrationCapistrano 分段部署需要全新的数据库迁移
【发布时间】:2013-06-18 15:38:42
【问题描述】:

我设置了 Capistrano,它允许我将 Ruby on Rails 网站的暂存版本从 git 存储库成功部署到亚马逊服务器。但是,部署后,我必须在服务器上的数据库上运行迁移。如果我不这样做,任何带有登录表单或基于数据库的内容的页面都无法加载。当我在服务器上运行迁移时,我看到正在迁移的站点上的每个单独迁移,而不仅仅是最近的迁移。

我知道 Capistrano 可以维护以前的迁移,我认为它会自动执行此操作。 我的问题是,如何阻止正在发生的明显的数据库擦除或丢失,以便仅在确实有新迁移时才需要迁移?

我在 Capistrano 输出中没有发现异常错误,而且我是 Capistrano 和数据库方面的新手。我注意到我的 database.yml 文件没有用于暂存的条目,我想知道它是否可以像在数据库设置为 db/development.sqlite3 的情况下添加一个用于暂存的条目一样简单?

这是我的 deploy.rb 文件:

set :application, "staging"
set :scm, :git
set :repository, "."
set :deploy_via, :copy
#set :copy_cache, true
set :copy_exclude, [".git"]
set :user, "username"
set :use_sudo, false

default_run_options[:pty] = true

server "server_url", :app, :web, :db, :primary => true
set :deploy_to, "/var/www/staging"

# if you want to clean up old releases on each deploy uncomment this:
set :keep_releases, 3
after "deploy:restart", "deploy:cleanup"

# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
     run "touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end

还有我的 database.yml 文件:

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

【问题讨论】:

    标签: ruby-on-rails migration capistrano


    【解决方案1】:

    Capistrano 不是维护您的迁移号码的人。轨道可以。如果您希望 capistrano 在部署过程中为您运行迁移,请将其添加到您的 config/deploy.rb

    after "deploy:update_code", "deploy:migrate"
    

    您可能应该有一个不同的位置用于生产 sqlite3 文件,而不是 db/production.sqlite3。类似于 /home/user/production.sqlite3

    【讨论】:

    • 这并没有完全触及我问题的核心。我知道我可以让 cap 为我运行迁移,问题是它正在迁移我认为应该已经被以前的部署迁移的东西。什么是重写生产数据库?从 database.yml 我得到的印象是开发数据库是静态的(除非你将新东西迁移到它)。
    • 查看我的答案的底部。如果你在 db 文件夹下有你的 development.sqlite3 文件,那么每次部署时它都会被覆盖。因此它会丢失上次运行的迁移信息。 Capistrano 为每个部署创建一个新文件夹并将其符号链接到当前文件夹。
    • 我尝试将 development.sqlite3 的目录更改为 /var/www/db 并将 development.sqlite3 文件移动到该目录,但问题仍然存在。我的 db 文件夹中没有 production.sqlite3 文件。我将该目录更改为与开发相同的目录,即使我没有它的文件并且导致 rails 失败(无法启动)。
    • 暂时想通了。我将生产重定向到 development.sqlite3 数据库。 (数据库:/var/www/db/development.sqlite3 而不是数据库:/var/www/db/production.sqlite3)。我认为这可能是不好的做法,但是现在当我运行 cap deploy 时,我不需要迁移,除非自上次部署以来我有新的数据库迁移。感谢 Vimsha 为我指明了正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多