【问题标题】:Capistrano - can't deploy my database.ymlCapistrano - 无法部署我的 database.yml
【发布时间】:2012-03-29 21:21:58
【问题描述】:

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

失败:“sh -c 'cp /var/www/my_app/releases/20120313115055/config/database.staging.yml /var/www/my_app/releases/20120313115055/config/database.yml'" on IP_ADDR

我的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

【问题讨论】:

  • 在该机器上手动运行 cp 命令会发生什么?
  • .yml 还是 .ymp?如果您有 .ymp,则您的文件命名错误
  • 当我尝试在服务器上的终端中运行它时,我收到错误 No such file or directory,当我查看 发布目录,所以它是空的。

标签: ruby database deployment ruby-on-rails-3.1 capistrano


【解决方案1】:

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

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

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

这就是约翰所说的。

【讨论】:

  • 就是这样。谢谢
【解决方案2】:

我不确定如何解决您的问题。看起来 database.staging.yml 没有被部署,所以没有什么可以复制的。

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

这需要您在服务器上进行一次性设置。您需要在your_app_path/shared/config 创建一个database.yml。 Shared 是 current 和 release 的兄弟。

您的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 并提交。

【讨论】:

  • 我们这样做了,但在配置中包含了一个 database.yml.example,开发人员可以使用它在本地进行操作,而无需猜测 database.yml 设置
  • 我认为 current/config/database.yml 链接到 shared/config/database.yml 如果 shared/config/database.yml 丢失,它会给你“没有这样的文件或目录”。我们可以手动创建它到 shared/config/database.yml 并部署它。这东西在这里有效。
  • 抱歉,为什么你的deploy.rb 脚本提到了settings.yml
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2013-02-16
    • 2014-01-08
    相关资源
    最近更新 更多