我正在尝试用Capistrano部署Rails应用程序。我或多或少配置了卡皮斯特拉诺。我知道这是可行的,因为我已经部署了另一个使用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
错误而是密码错误。因为我不想让卡皮斯特拉诺在这一点上以交互方式请求密码,md5
并没有让我走得很远。我的本地配置:
卷宗
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 }
gem似乎做得很好,在deploy消息中我可以看到它确实使用了数据库名并创建了一个传递给服务器的密码。
为了安全起见,我在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_用户不同于postgresql用户(与数据库名相同)这一事实可能会在这里造成一些麻烦。系统用户“cc>”不存在于数据库中,系统上的数据库用户也不存在。
配置/数据库.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,它将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”身份登录数据库,没有任何问题。
最佳答案
其实问题很简单。您在database.yml
配置中使用的环境变量不可用于capistrano。有一个类似的问题here。
Capistrano通过SSHKit执行远程命令。在SSHKit的文件中提到:
编程SSH会话与交互会话的环境变量不同,这常常是一个问题。
您可以使用不同的选项将环境设置为SSHKit使用的登录shell:
将环境变量添加到/etc/environment
。请考虑,远程系统上的所有人都可以访问此变量。也许这不是储存密码的地方。
设置~/.ssh/environment
中的变量并激活PermitUserEnvironment
中的/etc/ssh/sshd_config
。这些变量只对特定用户可见,但对rails应用程序不可见。
使用Capistrano的共享和链接文件功能。在database.yml
中创建secrets.yml
和public/config/
。我认为这是最简单和最安全的选择。
关于ruby-on-rails - 来自Capistrano的Postgresql身份验证失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29594324/