我正在尝试使用Capistrano部署Rails应用程序。我或多或少配置了Capistrano。我知道它有效,因为我已经部署了另一个使用SQLite作为数据库的应用程序。现在,当前使用的是Postgresql,我不知道为什么Capistrano无法通过身份验证。capstrano尝试执行时显示的错误exec bundle exec rake db:migrate
如下:
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中配置了数据库名称:
从config / 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
数据库中不存在系统用户,系统上的数据库用户也不存在。
配置/ 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'] %>
我可能要提到的最后一件事是,我还在使用figaro gem,它将gemdata.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插件负责管理整个创建用户和登录业务,所以我自己应该在服务器端进行处理并没有引起我的注意。
无论如何,我所做的就是浏览服务器上的数据库文件(由capistrano创建),检索capistrano生成的密码,最后登录到postgres用户,将railsuser密码更改为文件中的密码。解决了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句