Gitlab本地部署(2)Git LFS从外网访问的问题和解决

本文最后更新于:2023年10月14日 中午

前言

上一篇自部署的Gitlab已经能够在内网环境内访问了,在校园环境内我们通常是在机房的服务器上运行程序,因此从机房服务器到实验室内的Gitlab宿主机这条路需要打通:

graph LR
  机房服务器 --> 个人路由器 --> Gitlab宿主机

如果你的个人路由器无法被机房服务器访问,那么这篇文章的完整过程可能无法复现,但是可以作为借鉴。

本篇主要解决的问题是git lfs在通过路由器端口转发后无法正常被宿主机解析,导致lfs请求的地址是无法从外部访问的内网地址,最终卡在downloading界面没有反应。

省流版:在clone命令中加入可访问内网地址的跳板机作为http代理,通过内网地址进行lfs的仓库克隆。

问题

上一篇提到我们在内网中留下了3个端口,分别是SSH端口、HTTP端口和HTTPS端口,

在内网中无论是通过ssh访问还是http访问都没有出现问题,特别是lfs追踪的大文件,都可以以理想速度进行下载。但是在大局域网(下称:外网)中,git clone或者git lfs clone都无法正常下载lfs追踪的大文件,表现为卡在下载环节,这时候仓库其他内容已经下载完成,只等lfs下载

卡在LFS下载环节

通过SSH clone也没有办法下载lfs文件

类似的问题在lfs官方的issue中有人曾经提到过,在Gitea中也遇到了:issue

在回复中作者表示不会解决这个问题,应该由Gitea来解决,Gitlab也一样。

问题如上面描述的一样,在LFS中处理大文件链接所解析得到的ip地址是Gitlab部署时配置的内网地址,即使在外网访问,LFS也不会修改这个地址,那解决方案很清晰明了。

解决方案

代理之Clash

需要:一个能够提供http代理的内网代理工具,常见的如Clash

如果你的内网中有Clash并放出了代理端口(默认的是7890),在配置好路由器的端口转发后,就可以将Clash的http代理端口通过路由器端口转发到校园网范围内,这个代理端口能够被机房服务器访问,命令如下:

1
git lfs clone -c http.proxy="http://路由器ip:转发的端口" http://Gitlab内网ip:端口/repo.git

代理之群晖

需要:内网群晖开启Proxy Server放出http代理

这是我最新发现的一个用法,群晖的官方套件中有Proxy Server可以放出http代理

群晖

用法和上面的一样,多一步可能是,在这里可能需要配置下来源IP保证安全

在这里修改

两个方案其实一样都是通过http代理,直接clone内网ip地址的仓库,只需要第一次使用配置代理,后续自动都使用代理pull和push

坏处是每次新克隆还得找代理的命令。

对于Git clone 设置代理

1
2
3
4
# 一次性代理
git clone -c http.proxy="http://127.0.0.1:1087" https://github.com/xxx.git
# 全局设置代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:1086

Gitlab本地部署(2)Git LFS从外网访问的问题和解决
https://ash-one.github.io/2023/10/08/gitlab-ben-di-bu-shu-2-git-lfs-cong-wai-wang-fang-wen-de-wen-ti-he-jie-jue/
作者
灰一
发布于
2023年10月8日
许可协议