2010-04-28 8 views
10

Ich entwickle eine Anwendung, die sich auf einem öffentlichen Host befindet, deren Quelle ich jedoch in einem Git-Repository hinter einer Unternehmens-Firewall aufbewahren muss. Ich bekomme sehr müde von der Langsamkeit der Bereitstellung über scp (Kopieren des gesamten Repository und Versand über SSH auf jeder Bereitstellung) und möchten, dass der Remote-Host einfach eine git pull zu aktualisieren. Das Problem besteht darin, dass die Firewall eingehende SSH-Verbindungen verhindert.Ist es möglich, dass Capistrano einen Checkout über einen umgekehrten SSH-Tunnel durchführt?

Wäre es für mich möglich, einen SSH-Tunnel von meinem Computer zum Deployment-Computer einzurichten und mein Repository als Quelle für die git pull zu verwenden? Immerhin ist git verteilt, so dass meine Kopie genauso ein Repository ist wie die zentrale. Wenn das möglich ist, was wäre der Tunnelbefehl und die Capistrano-Konfiguration?

Ich denke, der Tunnel so etwas wie

ssh -R something:deployserver.com:something [email protected] 

Antwort

7

Net :: SSH implements remote forwarding aussehen wird. Ich habe den Quellcode von Capistrano durchgesehen und konnte in der aktuellen Version keine Hinweise darauf finden. Nichtsdestoweniger hindert Sie das nicht daran, die Remote-Weiterleitung einzurichten, bevor Sie mit Capistrano bereitstellen.

Sie sollten die Pfade :local_repository und :repository einzeln einstellen. Auf :local_repository wird lokal verwiesen, um zu bestimmen, welcher Commit für die Bereitstellung verwendet wird, bevor die Verbindung initiiert wird. Das lässt :repository für den Remote-Server abziehen, nachdem die Verbindung initiiert wurde. Hier können Sie den Pfad zum Repository hinter der Firewall angeben.

# deploy.rb 
set :local_repository, "ssh://[email protected]/path/to/project.git" 
set :repository, "ssh://[email protected]:9000/path/to/project.git" 

Stellen Sie vor der Bereitstellung sicher, dass die Remoteweiterleitung eingerichtet ist. Sie müssen dies für jeden Server wiederholen, auf dem Sie bereitstellen.

$ ssh -R 9000:serverbehindfirewall:22 [email protected] 
# 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. 

Mit Net :: SSH diese leicht in eine Aufgabe gedreht werden konnten, die vor etwas ausgeführt wird sonst ein größere Flexibilität, wenn auf mehrere Servern bereitstellen.

Schließlich, vorausgesetzt, Sie haben scp verwendet, möchten Sie vielleicht deploy_via, :remote_cache setzen, die eine Kopie des Repository auf dem Remote-Server hält. Dies verringert erheblich Ihre Bereitstellungszeit reduziert die Wahrscheinlichkeit von Korruption.

0

Meine Antwort von this SO question:

Mit Capistrano 3.x, die folgenden Werke für mich:

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 

Bitte beachten, dass ssh.forward.remote Parameter in einer anderen Reihenfolge als ssh -R erwartet, ist das obige Äquivalent zu ssh -R 9000:192.168.1.123:22

Diese Aufgabe ruft eine private Methode, wenn jemand einen offiziellen Weg, um den Zugriff Capistrano ssh-Verbindung zu erhalten, kommentieren oder bearbeiten.

Edit: auch den Abschnitt siehe Tunneling and other related SSH themes von SSHKit README