Ist es möglich, eine Kasse über einen Reverse-SSH-Tunnel zu tun hat Capistrano tun?
-
02-10-2019 - |
Frage
Ich entwickle eine Anwendung, die befindet sich auf einem öffentlichen Host, aber dessen Quelle ich in einem Git-Repository hinter einer Unternehmens-Firewall halten müssen. Ich erhalte sehr müde von der Langsamkeit über scp
der Bereitstellung (Kopieren des gesamten Repository und Verschiffung es über SSH auf jeder deploy) und möchte den Remote-Host haben einfach eine git pull
zu aktualisieren tun. Das Problem ist, dass der Firewall eingehende SSH-Verbindungen verbietet.
Wäre es möglich, für mich einen SSH-Tunnel von meinem Computer auf den Einsatz Computer einzurichten und mein Repository als für die git pull
Quelle verwenden? Immerhin ist git
verteilt, so dass meine Kopie genauso gültig ein Repository als zentrales ist. Wenn dies möglich ist, was wäre der Tunnel-Befehl und die Capistrano Konfiguration?
ich glaube, der Tunnel etwas aussehen wird
ssh -R something:deployserver.com:something deploybot@deployserver.com
Lösung
Net :: SSH Geräte Fern Spedition . Ich habe über alle Capistrano Quellcode geschaut und keine Verweise auf sie in der aktuellen Version sehen konnte. Nichtsdestoweniger, die Sie nicht davon abhalten, Spedition Fern Einrichtung, bevor Sie mit Capistrano bereitstellen.
Was Sie tun möchten, eingestellt wird, um die :local_repository
und :repository
Pfade einzeln. :local_repository
lokal zu bestimmen, verwiesen, die für die Bereitstellung verwendet werden begehen, bevor die Verbindung initiiert wird. Das Blatt :repository
für den Remote-Server zu ziehen aus, nachdem die Verbindung initiiert wurde. Hier können Sie den Pfad zu dem Repository hinter der Firewall angeben.
# deploy.rb
set :local_repository, "ssh://git@serverbehindfirewall/path/to/project.git"
set :repository, "ssh://git@localhost:9000/path/to/project.git"
Bevor Sie einsetzen, müssen Sie die Fernbedienung nach vorne zu etablieren. Sie werden dies für Sie bereitstellen für jeden Server müssen wiederholen.
$ 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.
Mit Net :: SSH diese leicht in eine Aufgabe gedreht werden können, die vor etwas ausgeführt wird sonst ein größere Flexibilität, wenn auf mehrere Servern bereitstellen.
Schließlich, da Sie haben scp benutzen, könnte man auf Set deploy_via, :remote_cache
will, die eine Kopie des Repository auf dem Remote-Server hält. Diese stark verringert Ihre Einsatzzeit die Möglichkeit der Korruption reduziert.
Andere Tipps
Siehe meine Antwort von diese Frage SO :
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 Sie, dass ssh.forward.remote
erwartet Parameter in einer anderen Reihenfolge als ssh -R
ist das obige entspricht ssh -R 9000:192.168.1.123:22
Diese Aufgabe erfordert eine private Methode, wenn jemand einen offiziellen Weg kennt den Zugang Capistrano des SSH-Verbindung zu bekommen, bitte Kommentar bearbeiten.
Edit: auch den Abschnitt finden Sie unter Tunneling und andere verwandte Themen SSH von SSHKit README