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

Posted

技术标签:

【中文标题】Capistrano 和 GitHub 私人回购 - 权限被拒绝(公钥)【英文标题】:Capistrano and GitHub Private Repo – Permission denied (publickey) 【发布时间】:2014-05-23 13:12:29 【问题描述】:

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

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

我已经在 GitHub 上设置了一个私有存储库,并且我正在尝试让 Capistrano 配方工作。我没有运气。我在部署期间继续收到公钥错误。

这是我采取的步骤 -

    更新了 Linode 服务器上的 Git 远程(原始)URL 以指向我的新存储库 更新了 Capfile 中的存储库引用,以引用我的新存储库 确保 ssh_options[:forward_agent] 在 Capfile 中设置为 true 在本地生成 SSH 密钥 (id_rsa.pub) 并将其添加到我在 GitHub 中的用户帐户中 执行ssh-add 命令,确保身份已添加到身份验证代理 运行 ssh -T git@github.com 以确认 ssh 已在本地正确设置 登录到我的 Linode 服务器并运行 ssh -T git@github.com 以确保它也能正常工作

另外,为了以防 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

【问题讨论】:

你可以尝试在本地机器上运行“ssh-add”,然后重新运行cap deploy吗?更多信息here 【参考方案1】:

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

 ssh-add ~/.ssh/id_dsa

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

删除所有添加到代理的 ssh 密钥

ssh-add -D

【讨论】:

【参考方案2】:

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

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

【讨论】:

当我正确设置所有部分,从命令行正确运行所有内容,并且仍然从部署服务器收到密码挑战时,这对我有用。例如, ssh -A deploy@server 'git ls-remote git@github.com:x/y.git HEAD' 有效,但 cap deploy 无效。 @jjk 听起来您使用的 ssh 密钥没有放在该用户的 authorized_keys 文件中? 我在关注link 我相信我使用 ssh-copy-id 为该用户更新了 authorized_keys 文件,但我可能遗漏了一些东西。【参考方案3】:

如果您仍然遇到问题,我在这里回答了与您类似的问题:SSH Agent Forwarding not working

检查您的密钥是否已添加到具有ssh-add -L 的代理身份列表中。

【讨论】:

【参考方案4】:

同样,我可以从开发机器 SSH 到暂存机器,也可以从暂存机器 SSH 到 github.com。

但是 cap deploy 执行 git clone 失败

Permission denied (publickey).

但是 git ls-remote 的工作很奇怪。

如果我在登台机器上将它添加到我的配置中,它就可以工作

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

【讨论】:

【参考方案5】:

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

将本地 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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于Capistrano 和 GitHub 私人回购 - 权限被拒绝(公钥)的主要内容,如果未能解决你的问题,请参考以下文章

在 Github 上公开分享私人回购的一部分

ArgoCD 私人回购声明式方法

使用Capistrano 3部署git子模块

如何从私人 gitlab 存储库创建公开发布?

私人回购 - 去 1.13 - `go mod ..` 失败:ping “sum.golang.org/lookup” .. 验证包 .. 410 不见了

从 GitHub 部署 Key 问题 Capistrano