Capistrano - не могу развернуть мою базу данных.yml

Когда я пытаюсь развернуть свое приложение с помощью capistrano, я получаю эту ошибку:

не удалось: "sh -c 'cp /var/www/my_app/releases/20120313115055/config/database.staging.yml /var/www/my_app/releases/20120313115055/config/database.yml'" на 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"

Что мне здесь не хватает / где я должен искать сбой? Учетные данные для доступа к базе данных на сервере должны быть правильными.

EDIT — вот мое развертывание

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

person user984621    schedule 13.03.2012    source источник
comment
что происходит, когда вы вручную запускаете команду cp на этой машине?   -  person Brian Maltzan    schedule 13.03.2012
comment
.yml или .ymp? Если у вас есть .ymp, ваш файл назван неправильно   -  person DGM    schedule 13.03.2012
comment
когда я пытаюсь запустить его в терминале на сервере, я получаю сообщение об ошибке Нет такого файла или каталога, и когда я смотрю в каталог релизы, поэтому это пусто.   -  person user984621    schedule 13.03.2012


Ответы (3)


Я не уверен, как решить вашу проблему. Похоже, что database.staging.yml не развертывается, поэтому ему нечего копировать.

Я думаю, что есть лучший рабочий процесс, хотя. Такие вещи, как настройки и конфигурации базы данных, обычно не меняются между развертываниями, поэтому эти вещи могут находиться в общей папке всех выпусков capistrano. Как правило, вы не хотите, чтобы ваш файл database.yml находился в вашем репозитории, так как это конфиденциальная информация. Вы можете удовлетворить обе эти потребности, исключив config/database.yml из .gitignore.

Это требует от вас единовременной настройки на ваших серверах. Вам нужно создать database.yml в your_app_path/shared/config. Shared является братом текущих и выпусков.

У вашего 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

Это означает, что ваш репозиторий не будет содержать database.yml файлов. Поскольку они, вероятно, уже есть в вашем репо. Вам придется git rm их зафиксировать. Добавьте их в .gitignore и сделайте коммит.

person JohnColvin    schedule 13.03.2012
comment
мы сделали это, но включили файл database.yml.example в конфигурацию, который разработчики могут использовать для локального запуска без необходимости угадывать настройки database.yml - person tehfoo; 02.03.2013
comment
Я думаю, что current/config/database.yml связан с shared/config/database.yml. Если shared/config/database.yml отсутствует, это даст вам «Нет такого файла или каталога». Мы можем создать его вручную в файле shared/config/database.yml и развернуть его. Эта штука работает здесь. - person vajapravin; 02.04.2013
comment
Извините, почему в вашем сценарии deploy.rb упоминается settings.yml? - person Matthias; 06.03.2016

В Capistrano 3 встроено связывание файлов. Ответ Джона прост:

  • В папке shared/ создайте config/database.yml
  • В config/deploy.rb используйте эту строку

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

Это делает то, о чем говорил Джон.

person carlosayam    schedule 19.01.2015
comment
Это оно. Спасибо - person Francisco Quintero; 12.08.2016

Если вам не нужно «ссылаться на объекты или методы приложения» (1) во время прекомпиляции вы можете быть в порядке с установкой config.assets.initialize_on_precompile на false в config/application.rb

person Jared Beck    schedule 11.02.2013