从临时服务器连接到GitoLite时出错 - ECONNREFUSED部署错误

时间:2012-11-20 15:07:08

标签: ruby-on-rails-3 capistrano rvm-capistrano

我在尝试将以前工作的项目部署到开发服务器时遇到了一些麻烦。我没有设置系统但是我确实拥有我需要的所有凭据(我认为)。

尝试了cap staging deploy后,我到目前为止然后产生错误。请参阅以下内容:

triggering load callbacks
  * 2012-11-20 14:52:20 executing `staging'
    triggering start callbacks for `deploy'
  * 2012-11-20 14:52:20 executing `multistage:ensure'
Identity added: /Users/XXX/.ssh/id_rsa (/Users/XXX/.ssh/id_rsa)
  * 2012-11-20 14:52:20 executing `deploy'
  * 2012-11-20 14:52:20 executing `deploy:update'
 ** transaction: start
  * 2012-11-20 14:52:20 executing `deploy:update_code'
    executing locally: "git ls-remote ssh://gitolite@repo1:2011/proto_projectname_rails HEAD"
    command finished in 2864ms
  * executing "git clone -q ssh://gitolite@repo1:2011/proto_projectname_rails /var/www/projectname/releases/20121120145223 && cd /var/www/projectname/releases/20121120145223 && git checkout -q -b deploy 0598169ed07015279bd78efa91f25ed3e5edcad8 && (echo 0598169ed07015279bd78efa91f25ed3e5edcad8 > /var/www/projectname/releases/20121120145223/REVISION)"
    servers: ["repo2"]
*** [deploy:update_code] rolling back
  * executing "rm -rf /var/www/projectname/releases/20121120145223; true"
    servers: ["repo2"]
 ** [deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: repo2 (Errno::ECONNREFUSED: Connection refused - connect(2))
connection failed for: repo2 (Errno::ECONNREFUSED: Connection refused - connect(2))

deploy.rb

set :stages, %w(staging production)
set :default_stage, "production"
require 'capistrano/ext/multistage'

set :application, "projectname"

set :scm, :git
set :repository,  "ssh://gitolite@repo1:2011/proto_projectname_rails"

我真的很困惑为什么以前工作的版本不再起作用。

任何帮助,建议或指导或此事都非常受欢迎。

谢谢

作为旁注,是的,它始终是2011年的非标准端口,并且在我的.ssh / config

编辑:

此过程涉及2台服务器。

在本地和第二台服务器上运行以下后,我得到了回复。

git ls-remote ssh://gitolite@repo1:2011/proto_projectname_rails

它返回;

0598169ed07015279bd78efa91f25ed3e5edcad8    HEAD
0598169ed07015279bd78efa91f25ed3e5edcad8    refs/heads/master

编辑:在2台服务器上运行。 Repo1和Repo2

cap deploy:check

返回

   triggering load callbacks
 * 2012-11-27 21:02:36 executing `production'
 triggering start callbacks for `deploy:check'
 * 2012-11-27 21:02:36 executing `multistage:ensure'
  Identity added: /Users/x/.ssh/id_rsa (/Users/x/.ssh/id_rsa)
 * 2012-11-27 21:02:36 executing `deploy:check'
 * executing "test -d /var/www/projectname/releases"
   servers: ["repo2"]
   connection failed for: repo2 (Errno::ECONNREFUSED: Connection refused - connect(2))

解决

事实证明,由于第二个服务器端口号,它被拒绝了。添加

set :port, 1893

对于任何可以解释这一点的人来说,赏金仍然是开放的。

为什么总是可以SSH进入服务器,而无需在任何时候编辑我的ssh / config,并且其他机器能够部署,使用完全相同的部署和暂存文件,但直到我明确添加端口号之后我才能这样做?

1 个答案:

答案 0 :(得分:2)

有关此问题的最终答案,请参阅下面的更新2

好的,首先要测试的是,从本地计算机上,您是否可以运行git ls-remote ssh://gitolite@XXX:2011 - 它应该从repo返回引用列表。如果这不起作用,它可能会给你一个类似的错误(连接被拒绝或类似),然后你可能需要弄清楚为什么谁托管git repo。

如果它在本地运行,那么您可能需要设置部分或全部这些选项,具体取决于您在部署时如何访问git。我认为除非您的部署服务器/用户可以直接登录存储库,否则需要使用forward_agent选项。

set :deploy_via, :remote_cache
default_run_options[:pty] = true
ssh_options[:forward_agent] = true

我描述了如何在this other stack overflow answer中设置它。

关于capistrano的关键要记住的是,大多数命令实际上只是标准的shell命令,但是使用ssh传递给远程服务器,如ssh user@server.example.com <command>中那样,如果可以的话,这将是另一个测试不能做到这一点。

根据添加到原始问题的信息进行更新:

使用URL建立与服务器的TCP连接时,请指定协议,主机地址和端口号。许多协议都隐含了端口号。例如。 ssh://1.2.3.4指定标准端口为22的协议SSH,因此与ssh://1.2.3.4:22相同。我猜你的git提供商将不同的端口分配给不同的存储库(可能在同一个IP地址上)以便路由请求,因此对于每个存储库,您可能有不同的端口号。因为它不是正在使用的ssh协议的默认端口,所以必须将其指定为URL的一部分(似乎您可以使用set :port在capistrano中覆盖它。)

对于我来说,对于同一个项目你会有多个git存储库(repo1repo2)是没有意义的,所以也许我需要了解这种情况会发生在什么情况下,但无论如何,错误的原因是您的服务器无法在给定URL的情况下与git主机建立TCP连接。

更新2 好的,事实证明repo1是一个git存储库。它托管在非标准的SSH端口(2011)上,因此只要引用git服务器的ssh URL,就需要将其嵌入到URL中。

但是,repo2实际上只是运行Rails应用程序的应用程序服务器(由与git repo相同的源托管),并且可用于非标准ssh port(1893)。为了ssh到这个服务器,你需要使用ssh -p 1893 ...指定端口 - 因为这是capistrano连接的方式,所以它也是如此。这就是为什么需要添加set :port, 1893