2015-04-12 44 views
2

我正在尝试与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 

md5trust拨弄左右,但代替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',没有任何问题。

回答

0

我终于自己找到了解决方案,其实很简单。我当时理所当然地认为capistrano/postgresql插件负责管理整个创建用户和登录业务,所以它并没有跨越我的想法,我应该自己处理服务器端的事情。

无论如何,我所做的只是窥探服务器上的数据库文件(由capistrano创建),检索capistrano生成的密码并最终登录postgres用户将railsuser密码更改为文件中的密码。解决了。

+0

不应该capistrano postgresql宝石为你做这个? – josullivan

1

其实问题其实很简单。您在database.yml配置中使用的环境变量不适用于capistrano。有一个类似的问题here

Capistrano通过SSHKit执行远程命令。在SSHKit的文档中提到:

程序化SSH会话与交互式会话没有相同的环境变量通常是一个问题。

你有不同的选项来设置环境对登录shell SSHKit用途:

  1. 添加您的环境变量/etc/environment。请考虑,该变量可供远程系统上的所有人访问。也许这不是一个保存密码的地方。

  2. ~/.ssh/environment中设置变量并在/etc/ssh/sshd_config中激活PermitUserEnvironment。这些变量只对特定用户可见,但它们不适用于rails应用程序。

  3. 使用Capistrano共享和链接文件的功能。在public/config/中创建一个database.ymlsecrets.yml。我认为这是最简单和最安全的选择。

+0

非常感谢这 – Stpn