我正在尝试与Capistrano部署Rails应用程序。我得到了Capistrano或多或少的配置。我知道它起作用,因为我已经部署了另一个使用SQLite作为数据库的应用程序。 现在,当前使用Postgresql,我无法弄清楚为什么Capistrano无法通过身份验证。 这说明了当capstrano试图exec bundle exec rake db:migrate
的错误是:来自Capistrano的Postgresql身份验证失败
PG::ConnectionBad: FATAL: password authentication failed for user 'nameofrailsapplication'
目前,我在服务器上尝试此配置:
/etc/postgresql/9.3/main/pg_hba.conf
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
我md5
和trust
拨弄左右,但代替ConnectionBad
错误我得到一个密码错误。由于我现在不希望Capistrano交互式地要求输入密码,因此md5
没有让我走得很远。
我的本地配置:
Capfile
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/migrations'
require 'capistrano/postgresql'
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
的capistrano/postgresql
宝石似乎做它的工作好,内部署的消息,我可以看到,它确实需要数据库名和创建传递给服务器的密码。 为了安全起见我配置里面deploy.rb数据库名称:从配置/ deploy.rb
:
# config valid only for Capistrano 3.1
lock '3.2.1'
set :application, "nameofrailsapplication"
set :pg_database, "nameofrailsapplication"
set :repo_url, "[email protected]:gituser/repo-name.git"
set :deploy_to, "/var/www/#{fetch(:application)}"
set :deploy_user, "deployers"
# Default value for :linked_files is []
set :linked_files, %w{config/database.yml}
# Default value for linked_dirs is []
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
我怀疑的事实deploy_user是不同的,则PostgreSQL用户(同作为数据库名称)可能会导致一些麻烦。系统用户deployers
在数据库中不存在,系统上的数据库用户也不存在。
的config/database.yml的
default: &default
adapter: postgresql
encoding: unicode
pool: 5
development:
<<: *default
database: nameofrailsapplication_development
test:
<<: *default
#database: nameofrailsapplication_test
database: nameofrailsapplication_test
production:
<<: *default
database:nameofrailsapplication
username: nameofrailsapplication
password: <%= ENV['NAME-OF-RAILS-APPLICATION_DATABASE_PASSWORD'] %>
最后一件事我也许应该提到的是,我也是用费加罗的宝石,其复制的database.yml到服务器。为此 我运行下面的Capistrano的任务:
namespace :figaro do
desc "SCP transfer figaro configuration to the shared folder"
task :setup do
on roles(:app) do
upload! "config/application.yml","#{shared_path}/application.yml", via: :scp
end
end
desc "Symlink application.yml to the release path"
task :symlink do
on roles(:app) do
execute "ln -sf #{shared_path}/application.yml #{current_path}/config/application.yml"
end
end
end
after "deploy:started", "figaro:setup"
after "deploy:symlink:release", "figaro:symlink"
任何建议,不胜感激!
编辑1:我在git和服务器上正确设置了ssh密钥。
编辑2:我可以从本地登录数据库作为'nameofrailsapplication',没有任何问题。
不应该capistrano postgresql宝石为你做这个? – josullivan