Можно ли сделать так, чтобы Capistrano сделал проверку через обратный туннель SSH? - PullRequest
10 голосов
/ 28 апреля 2010

Я разрабатываю приложение, которое находится на общедоступном хосте, но источник которого я должен хранить в репозитории Git за корпоративным брандмауэром. Я очень устал от медленного развертывания через scp (копирование всего хранилища и доставка его по SSH при каждом развертывании) и хотел бы, чтобы удаленный хост просто сделал git pull для Обновить. Проблема в том, что брандмауэр запрещает входящие SSH-соединения.

Могу ли я установить туннель SSH от моего компьютера до компьютера развертывания и использовать мой репозиторий в качестве источника для git pull? В конце концов, git распространяется, поэтому моя копия является таким же допустимым хранилищем, как и центральное. Если это возможно, какой будет команда туннеля и конфигурация Capistrano?

Я думаю, что туннель будет выглядеть примерно так

ssh -R something:deployserver.com:something deploybot@deployserver.com

Ответы [ 2 ]

7 голосов
/ 17 октября 2010

Net :: SSH реализует удаленную пересылку . Я просмотрел весь исходный код Capistrano и не увидел ссылок на него в текущем выпуске. Тем не менее это не мешает вам установить удаленную переадресацию перед развертыванием с Capistrano.

То, что вы хотите сделать, это установить пути :local_repository и :repository индивидуально. На :local_repository ссылаются локально, чтобы определить, какой коммит будет использоваться для развертывания до инициации соединения. Это оставляет :repository для удаленного сервера для извлечения после того, как соединение было инициировано. Здесь вы можете указать путь к хранилищу за брандмауэром.

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

Перед развертыванием обязательно установите удаленную пересылку. Вам нужно будет повторить это для каждого сервера, на котором вы развертываете.

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

Используя Net :: SSH, это легко можно превратить в задачу, которая выполняется раньше всего, обеспечивая большую гибкость при развертывании на нескольких серверах.

Наконец, если вы используете scp, вы можете установить deploy_via, :remote_cache, который хранит копию хранилища на удаленном сервере. Это значительно сокращает время развертывания и снижает вероятность повреждения.

1 голос
/ 23 июля 2015

См. Мой ответ от этого ТАКОГО вопроса :

Используя Capistrano 3.x, у меня работает следующее:

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

Обратите внимание, что ssh.forward.remote ожидает параметры в порядке, отличном от ssh -R, приведенное выше эквивалентно ssh -R 9000:192.168.1.123:22

Эта задача вызывает закрытый метод, если кто-нибудь знает официальный способ получить доступ к ssh-подключению Capistrano, пожалуйста, прокомментируйте или отредактируйте.

Редактировать: Также см. Раздел Туннелирование и другие связанные темы SSH из README SSHKit

...