Можно ли сделать Капистрано сделать чек на обратном SSH-туннеле?

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

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

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

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

Ответ 1

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

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

# deploy.rb
set :local_repository, "ssh://[email protected]/path/to/project.git"
set :repository,  "ssh://[email protected]: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, который хранит копию репозитория на удаленном сервере. Это значительно сокращает время развертывания, уменьшая вероятность коррупции.

Ответ 2

См. мой ответ из этого вопроса 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

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

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