Capistrano和GitHub私人回购 - 权限被拒绝(公钥)

时间:2014-04-10 02:42:10

标签: ruby-on-rails github ssh capistrano linode

我继承了一个在Linode上托管的Rails项目。

之前的开发人员正在使用BitBucket存储库以及Capistrano进行部署。

我自从在GitHub上设置私人存储库后,我试图让Capistrano配方工作。我没有运气。我在部署期间继续遇到公钥错误。

以下是我采取的步骤 -

  1. 更新了Linode服务器上的Git远程(源)URL以指向我的新存储库
  2. 更新了Capfile中的存储库引用,以引用我的新存储库
  3. 在Capfile
  4. 中确保ssh_options[:forward_agent]设置为true
  5. 在本地生成SSH密钥(id_rsa.pub)并将其添加到GitHub中的用户帐户
  6. 执行ssh-add命令,以确保为auth agent
  7. 添加了身份
  8. 启用ssh -T git@github.com确认ssh已在本地正确设置
  9. 登录我的Linode服务器并运行ssh -T git@github.com以确保其正常工作
  10. 此外,为了防止forward_agent属性不起作用,我甚至尝试在Linode服务器上生成SSH密钥,并将其添加到GitHub。没有运气。

    完成所有这些后,当我运行cap deploy时,我收到以下错误:

    Permission denied (publickey).
    fatal: The remote end hung up unexpectedly    
    

    以下是我使用的配方 -

    require "bundler/capistrano"
    
    server "----SERVER IP----", :web, :app, :db, primary: true
    
    set :application, "blog"
    set :user, "deployer"
    set :deploy_to, "/var/www/blog"
    set :deploy_via, :remote_cache
    set :use_sudo, false
    
    set :scm, "git"
    set :repository, "git@github.com:--MY USERNAME--/blog.git"
    set :branch, "master"
    
    default_run_options[:pty] = true
    ssh_options[:forward_agent] = true
    
    after "deploy", "deploy:cleanup" # keep only the last 5 releases
    
    namespace :deploy do
      task :start do; end
      task :stop do; end
      task :restart, roles: :app, except: {no_release: true} do
        run "touch #{deploy_to}/current/tmp/restart.txt"
      end
    
      task :setup_config, roles: :app do
        sudo "ln -nfs #{current_path}/config/apache.conf /etc/apache2/sites-available/blog"
        run "mkdir -p #{shared_path}/config"
        put File.read("config/database.example.yml"), "#{shared_path}/config/database.yml"
        puts "Now edit the config files in #{shared_path}."
      end
      after "deploy:setup", "deploy:setup_config"
    
      task :symlink_config, roles: :app do
        run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
        run "ln -nfs #{shared_path}/public/avatars #{release_path}/public/avatars"    
      end
      after "deploy:finalize_update", "deploy:symlink_config"
    
      desc "Make sure local git is in sync with remote."
      task :check_revision, roles: :web do
        unless `git rev-parse HEAD` == `git rev-parse origin/master`
          puts "WARNING: HEAD is not the same as origin/master"
          puts "Run `git push` to sync changes."
          exit
        end
      end
      before "deploy", "deploy:check_revision"
    end
    

    我似乎无法弄清楚我哪里出错了 - 任何帮助都会非常感激。


    更新

    我还确保将以下内容添加到我的本地〜/ .ssh / config文件中...

    Host mydomain.com
      ForwardAgent yes
    

6 个答案:

答案 0 :(得分:20)

今天我找到了MAC的根本原因。我的ssh密钥未添加到身份验证代理中,因此密钥未转发。解决方案是执行以下命令:

  

ssh-add~ / .ssh / id_dsa

(如果使用rsa密钥,则为ssh-add~ / .ssh / id_rsa)

答案 1 :(得分:11)

尝试将以下行添加到您的Capistrano脚本中,这将明确告诉Capistrano它应该使用哪个键。

set :ssh_options, { 
  forward_agent: true, 
  paranoid: true, 
  keys: "~/.ssh/id_rsa" 
}

答案 2 :(得分:9)

如果您仍然遇到困难,我会回答与您类似的问题:SSH Agent Forwarding not working

检查您的密钥是否已添加到ssh-add -L的代理商标识列表中。

答案 3 :(得分:1)

同样,我可以从开发机器连接到登台机器,也可以从登台机器连接到github.com。

然而,在部署git clone

时,cap部署失败了
Permission denied (publickey).

然而git ls-remote工作很奇怪。

如果我在暂存机器上将其添加到我的配置中,则可以正常工作

Host github.com 
    Hostname github.com 
    IdentityFile ~/.ssh/git 
    User git

答案 4 :(得分:0)

对我来说,它部署的唯一方式是:

将本地id_rsa添加到服务器 cat ~/.ssh/github_rsa.pub | ssh -i /Users/jasmo2/Documents/AWS-keypair/designmatch.pem ubuntu@52.37.202.32 "cat >> .ssh/authorized_keys"

键入命令后

。最好设置集:ssh_options。 然后 deploy.rb 文件中的set :use_sudo, true。 最后安装

  • 在服务器上:

sudo apt-get install libpq-dev gem install pg -v '0.18.4'

  • deploy.rb (本地):

desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do execute :mkdir, '-p', "#{ release_path }/tmp" execute :touch, release_path.join('tmp/restart.txt') end end

答案 5 :(得分:0)

请注意,如果部署服务器没有磁盘空间,您也会收到此错误!