Возможно ли, чтобы Capistrano выполнял проверку через обратный туннель SSH?

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

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

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

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

person James A. Rosen    schedule 28.04.2010    source источник


Ответы (2)


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

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

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

person Tate Johnson    schedule 17.10.2010

См. мой ответ на этот вопрос SO:

Используя 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

person amiuhle    schedule 23.07.2015