Capistrano – 无法部署我的database.yml

当我尝试使用capistrano部署我的应用程序时,我会收到此错误:

失败:IP_ADDR上的“sh -c’cp /var/www/my_app/releases/20120313115055/config/database.staging.yml /var/www/my_app/releases/20120313115055/config/database.yml’”

我的database.yml即空, database.staging.yml

production: adapter: mysql2 encoding: utf8 reconnect: false database: my_db pool: 15 username: my_user_name password: my_pass host: localhost 

/ confing / deploy中是文件“production”“staging”

我在这里缺少什么/我应该在哪里寻找失败? 服务器上数据库的凭据应该是正确的。

编辑 – 这是我的部署

 set :application, "my_app" set :repository, "https://IP_ADDR/svn/my_app" set :scm, :subversion set :scm_username, 'my_name' set :scm_password, 'my_pass' default_run_options[:pty] = true set :user, "my_name" set :domain, 'IP_ADDR' set :deploy_to, "/var/www/my_app" set :use_sudo, false set :deploy_via, :remote_cache #set :keep_releases, 1 set :rails_env, 'production' role :web, domain role :app, domain role :db, domain, :primary => true # This is where Rails migrations will run namespace :deploy do task :build_gems, :roles => :app do desc "Building gems" run "cd #{release_path} && bundle install --deployment" end task :migrations do desc "Migrating database" run "cd #{release_path} && rake db:migrate RAILS_ENV=production" end [:start, :stop].each do |t| desc "#{t} task is a no-op with passenger" task t, :roles => :app do ; end end desc "Restarting passenger with restart.txt" task :restart, :roles => :app, :except => { :no_release => true } do run "touch #{release_path}/tmp/restart.txt" end after "deploy:update_code", "deploy:build_gems", "db:copy_configuration", "config:copy", "deploy:migrations", "deploy:cleanup" after "deploy:update", "bluepill:copy_config", "bluepill:restart" end namespace :db do task :copy_configuration do run "cp #{release_path}/config/database.staging.yml #{release_path}/config/database.yml" end end namespace :config do task :copy do run "cp #{release_path}/config/config.staging.yml #{release_path}/config/config.yml" end end namespace :bluepill do desc "Restart bluepill process" task :restart, :roles => [:app] do run "#{release_path}/script/delayed_job stop" sudo "/etc/init.d/bluepill.sh restart" end #desc "Load bluepill configuration and start it" ##task :start, :roles => [:app] do # sudo "/etc/init.d/bluepill.sh start" #end desc "Prints bluepills monitored processes statuses" task :status, :roles => [:app] do sudo "bluepill status" end desc "Copy config" task :copy_config, :roles => [:app] do run "cp #{release_path}/config/bluepill/configuration.rb /srv/script/bluepill.rb" end end 

问题:

 cp: cannot stat `/var/www/my_app/releases/20120313144907/config/database.staging.yml': No such file or directory 

我不知道如何解决你的问题。 看起来好像没有部署database.staging.yml,因此没有任何内容可以复制。

不过,我认为有更好的工作流程。 设置和数据库配置之类的东西通常不会在部署之间发生变化,因此这些东西可以放在所有capistrano版本的共享文件夹中。 通常,您不希望您的database.yml在您的仓库中,因为它是敏感信息。 您可以通过在.gitignore排除config/database.yml来满足这两个条件。

这要求您在服务器上进行一次设置。 您需要在your_app_path/shared/config创建database.yml 。 共享是当前和发布的兄弟。

您的deploy.rb应该有一个任务,将新部署的版本的database.yml符号链接到共享目录中的on。 像这样:

 before "deploy:assets:precompile" do run ["ln -nfs #{shared_path}/config/settings.yml #{release_path}/config/settings.yml", "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml", "ln -fs #{shared_path}/uploads #{release_path}/uploads" ].join(" && ") end 

这意味着您的repo将不包含database.yml文件。 因为他们可能已经在你的回购。 你必须git rm他们,提交。 将它们添加到.gitignore并提交。

在Capistrano 3中,链接文件是内置的。 约翰的答案很简单:

  • shared/文件夹中创建config/database.yml
  • config/deploy.rb使用此行

     set :linked_files, fetch(:linked_files, []).push('config/database.yml') 

这就是约翰所说的。

如果在预编译期间不需要“引用应用程序对象或方法”( 1 ),那么在config/application.rb中将config.assets.initialize_on_precompile设置为false可能没问题。