我正在开发一个驻留在公共主机上的应用程序,但我必须将其来源保留在公司防火墙后面的GIT存储库中。我越来越 非常 厌倦了部署的缓慢 scp (复制整个存储库并在每个部署上通过SSH运输),并希望让远程主机只做一个 git pull 更新。问题是防火墙禁止传入的SSH连接。

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

我认为隧道看起来像

ssh -R something:deployserver.com:something deploybot@deployserver.com
有帮助吗?

解决方案

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 它可以在远程服务器上保留存储库的副本。这大大减少了您的部署时间,减少了腐败的机会。

其他提示

看到我的答案 这个问题:

使用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连接的官方方法,请评论或编辑。

编辑: 另请参阅该部分 隧道和其他相关SSH主题 SSHKIT的README

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top