Можно ли сделать Капистрано сделать чек на обратном 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