gpt4 book ai didi

ruby - Capistrano、防火墙和隧道

转载 作者:数据小太阳 更新时间:2023-10-29 07:36:26 25 4
gpt4 key购买 nike

我们正在使用 Capistrano 自动将新版本的 PHP 应用程序推送到生产服务器。生产服务器(我们称之为生产)是公共(public)的,而我们的存储服务器(我们称之为 repo)与我们自己的机器一起位于我们公司的防火墙后面。

默认情况下配置的 Capistrano 将无法工作,因为生产无法与 repo 通信。

我想知道是否可以通过某种方式将 capistrano 设置为先通过 SSH repo ,然后通过 SSH 连接到生产环境,在端口上打开一个隧道,然后我可以使用该隧道从生产环境通过 SSH 返回到 repo 以从 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

最佳答案

这里有 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

第二种方式

在对这个 SO 问题的回答中概述:

这种技术与第一种方式非常相似。首先,您需要创建 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 问题的答案:

关于ruby - Capistrano、防火墙和隧道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14278822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com