Skip to content
跳到项目内容
全部项目
公司基础设施/持续维护

GitLab 搭建与代码治理

自托管协作平台与双仓迁移

GitLabNginxDocker ComposeGit LFS
GitLab 实例与代码迁移链路01 / 01

项目速览

业务背景

为团队建立统一代码协作入口,并维护迁移期间的仓库和权限规则。

负责范围
  • 实例与证书
  • 成员接入
  • 仓库迁移与增量同步
  • 容量事故与版本升级
45 / 22 / 1045

升级前后一致

项目、账号与合并请求数量在版本升级前后逐项核对。

LFS → refs

迁移顺序

先传大文件再更新引用;缺失源对象会阻止该仓库推进。

祖先关系

差异核对

历史差异扫描分别记录目标领先、分叉与目标独有 refs,未使用强推消除差异。

01

核心业务

团队需要统一的代码协作入口,同时处在 GitHub 与自托管 GitLab 并行的迁移阶段。建设工作从实例部署延伸到域名与证书、成员接入和代码同步:既要让新人能够加入团队,也要保证已有分支、标签和大文件在迁移时保持完整。

实际约束之一是服务器无法稳定访问 GitHub,因此镜像任务由一台能访问两端的开发机执行。迁移期间有些仓库已以 GitLab 为主,有些仍以 GitHub 为主,同步方向需要逐仓库、逐分支明确。

迁移完成后,五个核心服务整仓切到 GitLab,内部 GitLab 成为最新代码的权威来源,定时镜像于 2026-10-09 停止,脚本与缓存保留备查。之后的工作转为实例维护:处理磁盘写满事故、配置日志轮转并完成版本升级。

01实例与访问入口
Docker Compose 运行 GitLab,宿主 Nginx 终止 TLS,内部 HTTP 只绑定回环地址;SSH 克隆使用独立端口。
02成员与仓库治理
注册策略与组成员同步分别处理,自动授予 Developer,同时保留已有 Maintainer / Owner 权限。
03双平台迁移
使用裸镜像和明确 refspec 同步 Git 内容,按仓库主站与分支祖先关系决定是否推进。
02

技术栈

部署
GitLab CEDocker ComposeNginxacme.sh
协作自动化
Railssystemd timer组成员权限
迁移
Git bare mirrorGit LFSrefspec提交祖先比较
维护
Shelllaunchd同步日志持久化目录
03

系统架构与部署

Web 与 SSH 分开接入,配置、数据和日志持久化;镜像任务在可访问两端的主机上执行,先验证 LFS,再推送允许的 Git refs。

访问层

Nginx / TLS / acme.sh

HTTPS 转发到回环地址上的 GitLab HTTP 服务,证书续期后 reload;域名变更同步实例配置、证书和客户端入口。

实例层

Docker Compose / GitLab CE

配置、数据、日志与备份目录分开持久化,容器更新不依赖容器内临时数据。

成员自动化

Rails 脚本 / systemd timer

定期核对符合规则的活动用户与目标组,只提升到最低协作权限,不降级已有高权限成员。

迁移执行端

Git bare mirror / Git LFS / launchd

迁移期在能够访问两端的开发机上周期执行,日志保留同步结果和拒绝原因;迁移完成后已停用。

日志与容量

Docker 日志轮转 / 镜像清理

容器日志按 100 MB × 5 轮转,升级后清理旧镜像,避免日志再次写满根盘。

04

核心业务链路

从容器实例到团队可用的代码入口

  1. 1持久化目录
  2. 2Compose
  3. 3Nginx / TLS
  4. 4Web 与 SSH 克隆
  5. 5成员接入

先确定数据目录和端口边界,再配置外部访问地址。HTTP 服务不直接暴露公网,Web 经 Nginx 提供 HTTPS;SSH 独立验证克隆路径。域名切换时一起修改 external_url、证书、Runner 入口和镜像配置,避免页面能打开而克隆或流水线仍指向旧地址。

迁移期间的增量镜像

  1. 1获取源 refs
  2. 2确认主站
  3. 3比较提交祖先
  4. 4LFS 完整性
  5. 5fast-forward 推送

只推送 heads、tags、notes,不复制 GitHub 的 pull refs。Git LFS 对象先获取并传到目标,再更新 Git refs;源对象缺失则停止该仓库。目标领先或双方分叉时保留现状并记录,目标独有分支默认不删除,已存在但指向不同对象的标签不移动。

05

关键机制与取舍

01同步依据提交关系,而非时间戳

约束
迁移期间 GitLab 已产生新的开发提交,按最近更新时间覆盖会损失目标分支。
做法
对同名 refs 比较祖先关系:仅推进源领先且可快进的分支;目标领先和分叉分别记录。GitLab 主站仓库退出镜像范围,五个核心服务整仓切换后整体停止镜像。副本同步使用 ci.skip,避免重复触发环境发布。
效果
主站职责、同步方向与历史保留共同约束迁移,自动任务不会把团队新提交覆盖掉。

02注册资格与已验证身份分别处理

约束
邮箱后缀过滤能限制输入范围,但未配置邮件确认时不能证明邮箱归属。
做法
成员同步只对符合规则的活动用户建立组权限,并保留已有高权限;把 SMTP 和邮箱确认作为独立能力记录,不将免审批注册描述成已经完成企业身份验证。
效果
团队接入规则有明确边界,权限自动化不掩盖尚未配置的身份验证环节。

03磁盘写满与版本升级

约束
容器标准输出日志长期累积约 44 GB,根盘写满后登录、推送和 CI 全部返回 500。
做法
清理日志后改为 Docker 原生轮转,不重启容器恢复服务;随后从 CE 19.4.1 升级到 19.5.1,升级前后核对项目、账号、合并请求数量并运行 gitlab:check。
效果
根盘使用率 100% → 48%;升级维护窗口约 2 分 46 秒,期间返回 503,前后均为 45 个项目、22 个账号、1045 个合并请求。备份目前只做了结构校验,尚未做恢复演练。
06

AI 协作开发

版本升级、镜像清理和故障恢复由 Agent 准备和执行,每一步都在得到明确授权后进行。

  • Agent 准备

    升级前后数量比对

    升级前记录项目、账号和合并请求数量,CE 19.4.1 → 19.5.1 后用 gitlab:check、迁移状态和数量比对确认结果。

  • 授权边界

    单次授权执行

    版本升级在得到明确批准后执行;清理镜像时记录回收的空间。

  • 验证口径

    维护窗口照实写

    升级期间约 2 分 46 秒不可用,记录中不写零停机。

根盘被容器日志写满那次,只清理日志并加上每日轮转,没有重启服务。

07

阶段成果

  • 建立自托管代码协作入口、持久化布局和成员接入规则。
  • 双平台迁移具有可核对的同步方向、差异日志和大文件完整性检查,迁移完成后定时镜像停用。
  • 实例维护覆盖容量事故恢复、日志轮转与版本升级,并记录维护窗口。

继续浏览

GitLab 搭建与代码治理 · GitLab 实例与代码迁移链路
100%
GitLab 搭建与代码治理放大预览

GitLab 实例与代码迁移链路

别急,先让缓存热一下。