使用 Deploy key 将私有 GitHub 仓库克隆到境内服务器

由于某些原因,我们往往无法直接在境内服务器上克隆 GitHub 上的仓库。对于公开仓库,我们可以通过公益或自建的反向代理来解决这个问题。但是当我们希望将仓库保持私有时,我们遇到了以下几个问题:

  1. 我们不希望将自己的凭据上传到服务器,因此需要使用权限较低的 personal access token
  2. 很多反向代理方式,尤其是公益的,并不支持传递 personal access token
  3. 在服务器上使用 personal access token 配合反向代理进行 HTTPS clone 将会向反向代理服务器暴露该 token

本文将通过转发 GitHub 的 SSH 端口并使用 Deploy key 来解决这些问题。使用该方案,服务器上的凭据将仅限于读取指定仓库,且中间人无法获得你的凭据。

生成和设置 Deploy key

Deploy key 指位于部署目标服务器上的 SSH 密钥对,私钥保存在该服务器上,公钥保存在 GitHub 上,用于通过 SSH 连接到 GitHub。Deploy Key 只具有对特点仓库的权限,将其设为只读后很适合用于自动化部署。

首先你需要在服务器上生成 SSH 密钥对并导出公钥

然后在需要部署的仓库的设置中添加 Deploy key:

转发 GitHub 的 SSH 端口

Deploy key 的工作需要服务器能够连接到 GitHub 的 SSH 端口,但对于国内服务器,连接往往并不稳定。我们可以在一台境外的服务器上对 github.com:22 进行端口转发。Nginx 配置如下:

1
2
3
4
5
6
7
stream {
server {
listen 12345;
listen [::]:12345;
proxy_pass github.com:22;
}
}

当然,你也可以更换端口或者使用 iptables 等其他端口转发方式。

为了防止被其他人使用造成流量飙升,你可以在防火墙中将允许的源 IP 限制为你的境内服务器 IP。

然后通过以下命令克隆仓库:

1
git clone ssh://git@1.1.1.1:12345/username/private-repo.git

请将 1.1.1.1 替换为你的境外服务器 IP 地址(或域名),username/private-repo 替换为你要 clone 的仓库。

Reference

  1. GitHub Docs: Deploy keys

  2. GitHub Gist: HTTPS clone via personal access token

  3. Stack Overflow: What are the supported git url formats?

使用 Deploy key 将私有 GitHub 仓库克隆到境内服务器

https://blog.caomingjun.com/clone-private-github-repo-to-china-server-with-deploy-key/

作者

Cao Mingjun

发布于

2023-02-26

更新于

2023-02-26

许可协议

评论