Question

Je développe une application qui réside sur un hôte public, mais dont la source, je dois garder dans un dépôt Git derrière un pare-feu d'entreprise. Je reçois très fatigué de la lenteur du déploiement via scp (copie du référentiel entier et l'expédier via SSH sur chaque Deploy) et aimeraient avoir l'hôte distant simplement faire une git pull mise à jour. Le problème est que le pare-feu interdit les connexions SSH entrantes.

Ne serait-il possible pour moi de mettre en place un tunnel SSH de mon ordinateur à l'ordinateur de déploiement et d'utiliser mon dépôt comme source pour le git pull? Après tout, git est distribué, donc ma copie est tout aussi dépôt valide que celle du centre. Si cela est possible, quelle serait la commande du tunnel et la configuration Capistrano être?

Je pense que le tunnel ressemblera à quelque chose comme

ssh -R something:deployserver.com:something deploybot@deployserver.com
Était-ce utile?

La solution

Net :: SSH implémentant la transmission à distance . Je l'ai regardé vers dans la version actuelle du code source de tous Capistrano et ne pouvait pas voir toutes les références. Néanmoins, cela ne vous empêche pas d'établir la transmission à distance avant de déployer avec Capistrano.

Qu'est-ce que vous voulez faire est de définir les chemins de :local_repository et :repository individuellement. :local_repository est référencée localement pour déterminer qui commit sera utilisé pour le déploiement avant que la connexion est lancée. Cela laisse :repository pour le serveur distant pour tirer à partir après que la connexion a été lancé. C'est là que vous pouvez spécifier le chemin vers le référentiel derrière le pare-feu.

# deploy.rb
set :local_repository, "ssh://git@serverbehindfirewall/path/to/project.git"
set :repository,  "ssh://git@localhost:9000/path/to/project.git"

Avant de déployer, assurez-vous d'établir l'avant à distance. Vous devrez répéter cette opération pour chaque serveur que vous déployez à.

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

En utilisant Net :: SSH cela pourrait facilement être transformé en une tâche qui est exécutée avant tout autre offrant une plus grande flexibilité lors du déploiement sur plusieurs serveurs.

Enfin, étant donné que vous avez utilisé scp, vous pouvez définir deploy_via, :remote_cache qui conserve une copie du référentiel sur le serveur distant. Cela diminue considérablement votre temps de déploiement réduit les risques de corruption.

Autres conseils

Voir ma réponse de cette question SO :

Utilisation 3.x Capistrano, les travaux suivants pour moi:

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

S'il vous plaît noter que ssh.forward.remote attend des paramètres dans un ordre différent de celui ssh -R, ce qui précède est équivalent à ssh -R 9000:192.168.1.123:22

Cette tâche appelle une méthode privée, si quelqu'un sait de façon officielle pour obtenir la connexion ssh de l'accès Capistrano, s'il vous plaît commentaire ou modifier.

Modifier Voir aussi la section Tunnels et d'autres thèmes connexes SSH de README SSHKit

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top