2010-04-28 9 views
10

Estoy desarrollando una aplicación que reside en un servidor público, pero cuya fuente debo mantener en un repositorio Git detrás de un cortafuegos corporativo. Me estoy poniendo muy cansado de la lentitud del despliegue a través de scp (copiar todo el repositorio y el envío a través de SSH en cada despliegue) y le gustaría tener el host remoto Basta con hacer una git pull actualizar. El problema es que el firewall prohíbe las conexiones SSH entrantes.¿Es posible hacer haber Capistrano hacer una obtención través de un túnel SSH inverso?

¿Sería posible para mí configurar un túnel SSH desde mi computadora a la computadora de despliegue y usar mi repositorio como fuente para el git pull? Después de todo, git se distribuye, por lo que mi copia es tan válido como un repositorio de la central. Si esto es posible, ¿cuál sería el comando del túnel y la configuración de Capistrano?

creo que el túnel se verá algo como

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

Respuesta

7

Net :: SSH implements remote forwarding. Revisé todo el código fuente de Capistrano y no pude ver ninguna referencia al mismo en la versión actual. Sin embargo, eso no le impide establecer el reenvío remoto antes de implementarlo con Capistrano.

Lo que debe hacer es configurar las rutas :local_repository y :repository individualmente. :local_repository está referenciada a nivel local para determinar que practican será utilizado para el despliegue antes de que se inició la conexión. Eso deja :repository para que el servidor remoto se desconecte después de que se haya iniciado la conexión. Aquí es donde puede especificar la ruta al repositorio detrás del firewall.

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

Antes de implementar, asegúrese de establecer el desvío a distancia. Deberás repetir esto para cada servidor en el que implementes.

$ 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. 

El uso de Net :: SSH esto podría ser fácilmente convertido en una tarea que se ejecuta antes de cualquier otra cosa que proporciona una mayor flexibilidad a la hora de implementar varios servidores.

Por último, dado que ha estado usando scp, es posible que desee establecer deploy_via, :remote_cache que guarda una copia del repositorio en el servidor remoto. Esto reduce enormemente el tiempo de implementación y reduce las posibilidades de corrupción.

0

Véase mi respuesta a this SO question:

Usando Capistrano 3.x, las siguientes obras para mí:

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 

Tenga en cuenta que ssh.forward.remote espera parámetros en un orden diferente al de ssh -R, lo anterior es equivalente a ssh -R 9000:192.168.1.123:22

Esta tarea llama a un método privado, si alguien conoce una forma oficial de obtener el acceso a la conexión ssh de Capistrano, por favor coméntelo o edítelo.

Editar: Véase también la sección de Tunneling and other related SSH themes README de SSHKit

Cuestiones relacionadas