4

Capistranoを使用して、PHPアプリケーションの新しいバージョンを本番サーバーにプッシュすることを自動化しています。本番サーバー(本番と呼びます)はパブリックですが、リポジトリサーバー(リポジトリと呼びます)は、自社のマシンとともに企業ファイアウォールの背後にあります。

Capistranoは、デフォルトで構成されているように、本番環境がリポジトリと通信できないため、機能しません。

どういうわけか、capistranoをSSHに設定して最初にリポジトリに接続し、次にSSHを本番環境に設定してポートにトンネルを開き、本番環境からリポジトリにSSHで接続してSCMから変更をプルできるかどうか疑問に思いました。

これを設定する方法や、より良い解決策を見つける方法がわかりません。アイデア?

編集:

私はこれを試しました:

role :web, "deploy.com"

namespace :deploy do
    task :remote_tunnel do
        run 'Creating SSH tunnel...' do |channel, stream, data|
            ssh = channel.connection
            ssh.forward.remote(22, 'server.com', 10000, '127.0.0.1')
            ssh.loop {!ssh.forward.active_remotes.include?([10000, '127.0.0.1'])}
        end
    end
end

before "deploy:update_code", "deploy:remote_tunnel"

しかし、私はこのエラーを受け取り続けます:

failed: "sh -c 'Creating SSH tunnel...'" on deploy.com
4

2 に答える 2

2

これを実現する2つの方法があります。

第一の方法

このスレッドを見たことがあるかどうかわかりませんか?

ライブラリを利用しますnet-ssh-gatewayが、ローカル転送メソッドのコピーを作成しますが、それらはリモートアクセス用に調整されています。

class Net::SSH::Gateway 
  # Opens a SSH tunnel from a port on a remote host to a given host and port 
  # on the local side 
  # (equivalent to openssh -R parameter) 
  def open_remote(port, host, remote_port, remote_host = "127.0.0.1") 
    ensure_open! 

    @session_mutex.synchronize do 
      @session.forward.remote(port, host, remote_port, remote_host) 
    end 

    if block_given? 
      begin 
        yield [remote_port, remote_host] 
      ensure 
        close_remote(remote_port, remote_host) 
      end 
    else 
      return [remote_port, remote_host] 
    end 
  rescue Errno::EADDRINUSE 
    retry 
  end 


  # Cancels port-forwarding over an open port that was previously opened via 
  # open_remote. 
  def close_remote(port, host = "127.0.0.1") 
    ensure_open! 

    @session_mutex.synchronize do 
      @session.forward.cancel_remote(port, host) 
    end 
  end 
end

2番目の方法

このSOの質問への回答で概説されています:

この手法は、1番目の方法と非常によく似ています。まず、リポジトリへの2つのパスを作成する必要があります。

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

詳細については、そのSOの質問に対するこの回答を参照してください。

于 2013-01-20T05:56:23.973 に答える
0

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 接続にアクセスする公式の方法を誰かが知っている場合は、コメントまたは編集してください。

編集: SSHKit の READMEのセクショントンネリングおよびその他の関連する SSH テーマも参照してください。

于 2015-07-23T13:09:31.113 に答える