¿Es posible hacer haber Capistrano hacer una obtención través de un túnel SSH inverso?
-
02-10-2019 - |
Pregunta
Estoy desarrollando una aplicación que reside en un host 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 simplemente hacer una git pull
de actualización. El problema es que el servidor de seguridad prohíbe conexiones SSH entrantes.
¿Sería posible para mí para configurar un túnel SSH desde mi ordenador para el equipo de implementación y uso mi repositorio como la fuente para el git pull
? Después de todo, git
se distribuye, por lo que mi copia es tan válida como un repositorio de la central. Si esto es posible, lo que sería el comando túnel y la configuración Capistrano ser?
Creo que el túnel se verá algo como
ssh -R something:deployserver.com:something deploybot@deployserver.com
Solución
implementos desvío remoto . He mirado a través de todo el código fuente de Capistrano y no pude ver ninguna referencia a que en la versión actual. No obstante, eso no le impida el establecimiento de expedición remota antes de implementar con Capistrano.
Lo que usted querrá hacer es establecer los caminos :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 el servidor remoto para tirar de vez iniciada la conexión. Aquí es donde puede especificar la ruta al depósito detrás del firewall.
# deploy.rb
set :local_repository, "ssh://git@serverbehindfirewall/path/to/project.git"
set :repository, "ssh://git@localhost:9000/path/to/project.git"
Antes de implementar, asegúrese de establecer el desvío a distancia. Tendrá que repetir esta operación para cada servidor se implementa a.
$ 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.
El uso de Net :: SSH esto podría fácilmente convertirse 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 utilizando SCP, es posible que desee deploy_via, :remote_cache
conjunto que mantiene una copia del repositorio en el servidor remoto. Esto disminuye en gran medida el tiempo de despliegue reduce el riesgo de corrupción.
Otros consejos
Ver mi respuesta de esta cuestión de forma :
El uso de 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 que ssh -R
, lo anterior es equivalente a ssh -R 9000:192.168.1.123:22
Esta tarea requiere un método privado, si alguien conoce una manera oficial para obtener la conexión SSH acceso de Capistrano, por favor, comentario o edición.
Editar Véase también la sección Túneles y otros temas relacionados SSH de README de SSHKit