gitlab私有化部署 项目迁移踩坑之旅

文章目录

gitlab服务架构

详见:centos7 个人网站搭建之gitlab私有化部署实现线上发布-CSDN博客

项目架构

步骤一:创建分组

注意:创建分组时,分组权限需要选择public;不然无法从www.zhangluyue.asia/go-web/orm_framework网络上拉去自己的orm_framework包

步骤二:创建远程仓库

注意:

步骤三:使用https关联远程仓库并git push

注意:git remote add origin https://xxx 使用https方式,不用ssh方式

问题排查

git push卡住很久不动

可以ctrl + c 结束,再重试推送一遍,我就ok了

remote关联ssh无法推送 踩坑记录

我配置好ssh公钥、密钥后,尝试推送代码到git@www.zhangluyue.asia

直接免密登录服务,确认密钥生效
复制代码
# 密钥的存放位置
cat /var/opt/gitlab/.ssh/authorized_keys
走网关服务器进行免密登录

如图,因为网关服务器没有公钥,又没配置ssh转发,所以无法识别。当成普通的ssh请求,要求用户输入密码(没有)。

思路:尝试进行端口转发,将网关服务器的指定端口的流量转发给gitlab服务器。

注意:不能使用网关服务器的22端口转发,网关服务器的22端口需要用来登录网关服务器,不能占用。如果占用,就尝试通过VNC连接。

尝试解决方案:将网关服务器8878端口流量转发至gitlab服务器22端口上

将网关服务器8878端口流量转发至gitlab服务器22端口上;添加ECS安全组允许8878通过;git remote推送端口8878

注意:阿里云ECS安全组是实例级别的控制,防火墙是实例内的控制,这两个都需要配置;

网关服务器配置

*: iptables配置后立即生效,持久化需要单独配置:iptables-save > /etc/sysconfig/iptables

复制代码
# 允许对 8878 端口的 TCP 流量进行 DNAT 转发
sudo iptables -t nat -A PREROUTING -p tcp --dport 8878 -j DNAT --to-destination 172.28.0.2:22

# 允许外部设备访问网关的 8878 端口(TCP 协议)
sudo iptables -A INPUT -p tcp --dport 8878 -j ACCEPT

# 允许网关将流量转发到内网 GitLab 的 22 端口(TCP 协议)
sudo iptables -A FORWARD -p tcp -d 172.28.0.2 --dport 22 -j ACCEPT

# 允许内网 GitLab 对外部请求的响应流量通过网关返回
sudo iptables -A FORWARD -p tcp -s 172.28.0.2 --sport 22 -j ACCEPT

# 对从内网 GitLab(172.28.0.2)发出的流量进行源地址伪装(用网关公网 IP 替代)
sudo iptables -t nat -A POSTROUTING -s 172.28.0.2 -j MASQUERADE

# 启用 IP 转发(允许转发的总开关)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 查看配置
sysctl -p

# 持久化 重启后也生效
iptables-save > /etc/sysconfig/iptables

# 查看当前 nat 表 PREROUTING 链规则
sudo iptables -t nat -L PREROUTING --line-numbers
# 查看 FORWARD
iptables -L FORWARD --line-numbers

如果修改错误,需要添加删除后重新添加规则:

复制代码
# 删除对应编号的规则(假设编号为 1)
iptables -t nat -D PREROUTING [规则编号]
# 删除
iptables -D FORWARD [规则编号]

注意:centos7 当前状态是防火墙(firewalld)关闭状态,如果此时开启firewalld,录入规则会被重置掉;如果开启firewalld,需要使用firewalld添加上述配置。

git remote配置
复制代码
git remote add origin ssh://git@www.zhangluyue.asia:8878/go-web/orm_framework.git
firewalld与iptables的区别
  • iptables是底层工具,规则需手动通过iptables-save保存,且与firewalld不兼容;支持高度定制化,配置立即生效;适用场景:

    docker等容器引擎:使用firewalld可能会覆盖docker规则,导致网络异常

    vpn服务:需要自定义iptables规则,如转发隧道流量

  • firewalld是前端管理工具,自动管理底层iptables规则,支持动态加载和持久化;高并发不友好,配置后需要重启;centos7+支持

端口转发方案失败

尝试排查:8878 端口无法建立 TCP 连接

复制代码
Test-NetConnection -ComputerName www.zhangluyue.asia -Port 8878
与他人商讨记录

步骤四:以第三方依赖包的形式下拉orm_framework

配置 GOPRIVATE和GONOSUMDB,跳过公共代理和校验

告诉 Go 工具链:www.zhangluyue.asia 是私有域名,无需通过公共代理或 sumdb 验证:

复制代码
# 设置私有域名(替换为你的实际域名)
go env -w GOPRIVATE=www.zhangluyue.asia

# 跳过私有模块的 sumdb 验证(关键)
go env -w GONOSUMDB=www.zhangluyue.asia

作为第三方的库必须有main package和func main

如果没有main方法会报错,如图:

包需要是public权限

创建分组时,需要创建public权限的分组;private分组无法创建public权限project;project也需要是public权限,如果是私有的包会出现如图问题: