10

我正在开发一个驻留在公共主机上的应用程序,但我必须将其源代码保存在公司防火墙后面的 Git 存储库中。我已经厌倦通过(复制整个存储库并在每次部署时通过 SSH 发送)的缓慢部署,scp并且希望远程主机简单地git pull进行更新。问题是防火墙禁止传入的 SSH 连接。

我是否可以设置从我的计算机到部署计算机的 SSH 隧道,并使用我的存储库作为源git pull?毕竟,git它是分布式的,所以我的副本与中央存储库一样有效。如果这是可能的,隧道命令和 Capistrano 配置是什么?

我认为隧道看起来像

ssh -R something:deployserver.com:something deploybot@deployserver.com
4

2 回答 2

7

Net::SSH实现远程转发。我查看了 Capistrano 的所有源代码,在当前版本中看不到任何对它的引用。尽管如此,这不会阻止您在使用 Capistrano 部署之前建立远程转发。

您要做的是单独设置:local_repository:repository路径。:local_repository在本地引用以确定在启动连接之前将用于部署的提交。这留给:repository远程服务器在连接启动后拉取。您可以在此处指定防火墙后面的存储库的路径。

# deploy.rb
set :local_repository, "ssh://git@serverbehindfirewall/path/to/project.git"
set :repository,  "ssh://git@localhost:9000/path/to/project.git"

在部署之前,请务必建立远程转发。您需要为部署到的每台服务器重复此操作。

$ ssh -R 9000:serverbehindfirewall:22 deploybot@deployserver.com
# CTRL + C + A (Screen) or ⌘ + T (Terminal.app) to open new tab
$ cap HOSTFILTER=deployserver.com deploy # HOSTFILTER reduces set to specified host. Only useful if you have multiple servers.

使用 Net::SSH,这可以很容易地变成一个任务,在部署到多个服务器时提供更大的灵活性。

最后,鉴于您一直在使用 scp,您可能希望设置deploy_via, :remote_cache 在远程服务器上保留存储库的副本。这大大减少了您的部署时间,减少了损坏的机会。

于 2010-10-17T13:18:07.687 回答
1

从这个 SO question中查看我的答案:

使用 Capistrano 3.x,以下对我有用:

namespace :deploy do
  desc "Open SSH Tunnel to GitLab"
  task :open_tunnel do
    on roles(:app) do
      info "Opening SSH Remote Tunnel..."
      self.send(:with_ssh) do |ssh|
        # ssh -R 9000:192.168.1.123:22
        ssh.forward.remote(22, "192.168.1.123", 9000)
      end
    end
  end
  before "deploy:check", "deploy:open_tunnel"
end

请注意,ssh.forward.remote期望参数的顺序不同于ssh -R,以上等价于ssh -R 9000:192.168.1.123:22

此任务调用私有方法,如果有人知道获取 Capistrano 的 ssh 连接的官方方法,请评论或编辑。

编辑:另见SSHKit 的自述文件的隧道和其他相关 SSH 主题部分

于 2015-07-23T13:39:28.663 回答