Rocky Linux 10 部署 GitLab 私服实战:Omnibus 安装、6001 端口、备份恢复与安全基线
本文记录一次基于 Rocky Linux 10 的 GitLab Self-Managed / Omnibus 部署实战。重点不是“装上能访问”这么简单,而是把域名、非标准端口、SELinux、防火墙、备份恢复、升级、卸载重装、常见 500 错误、安全基线一起讲清楚。GitLab 是代码仓库,也是 DevOps 中枢;装得随意,后面就会用凌晨三点来还债。
1. 本文适用范围
本文主要面向下面这种场景:
- 操作系统:Rocky Linux 10,或其他 RHEL 10 二进制兼容系统。
- 部署方式:GitLab Linux package,也就是常说的 Omnibus GitLab。
- 访问域名:示例使用
gitlab.egon.top。 - 访问端口:示例使用 HTTP
6001端口。 - 使用规模:个人、家庭实验室、小团队、公司内网单机版。
- 暂不启用:Container Registry、Prometheus 及相关 exporter、SMTP。
- 强烈建议启用:备份、恢复演练、关闭公开注册、管理员 2FA、独立 Runner。
本文不覆盖 GitLab 高可用架构。真正的大规模生产环境请参考官方 Reference Architectures,不要靠一台单机硬扛。单机可以很稳,但不要把它幻想成一座分布式城堡。
2. Rocky Linux 10 上安装 GitLab 的前置判断
这里有一个容易忽略但非常关键的点:
Rocky Linux 10 对应 RHEL 10 兼容环境,而 GitLab 对 RHEL 10 / AlmaLinux 10 的支持是从 GitLab 18.6.0 开始的。
所以:
- Rocky 9 上很多 GitLab 16.x 的教程,不能直接照搬到 Rocky 10。
- 不建议手动下载
el9的 rpm 包硬装到 Rocky 10。 - 不建议把旧版本备份直接恢复到 Rocky 10 上的 GitLab 18.6+。
- 如果旧 GitLab 版本低于 18.6,需要先在旧系统或临时中转环境完成 GitLab 版本升级,再迁移到 Rocky 10。
一句话:Rocky 10 上的 GitLab,至少按 GitLab 18.6+ 来规划。
3. 先修正原脚本里的几个关键问题
原来的脚本方向是对的,但有几个地方建议调整。
3.1 external_url 写法错误
原来的写法类似:
1 | |
这个写法有两个问题:
- GitLab Omnibus 的配置是 Ruby DSL,通常写成
external_url '...'。 - URL 少了
//,正确 HTTP 地址应该是http://...。
建议改成:
1 | |
如果用反向代理对外提供 HTTPS,而 GitLab 内部只监听 6001,则应该写成:
1 | |
这两个方案不要混着写。external_url 是用户浏览器、Git 客户端、Webhook、CI 变量看到的真实访问地址,不只是 GitLab 内部监听地址。
3.2 unicorn 已经过时
老文章里常见:
1 | |
现在 GitLab 使用的是 Puma。恢复备份时建议用:
1 | |
3.3 500 错误不要上来就 db:migrate
原脚本里写了:
1 | |
这个命令不是不能用,而是不要作为“500 错误万能药”。更稳的排查顺序是:
1 | |
只有在确认是数据库迁移未完成、升级中断、并且已经备份后,再考虑执行:
1 | |
3.4 不要把 root 初始密码写进博客或仓库
脚本里出现了初始 root 密码示例。博客里建议只写命令,不要写真实密码:
1 | |
登录后立刻修改 root 密码,并删除本地记录。密码这种东西贴进博客,就像把家门钥匙拍照发朋友圈,刺激是刺激,后果也刺激。
4. 推荐架构:Rocky 10 单机 GitLab
推荐单机架构如下:
flowchart LR
Dev[开发者电脑] --> DNS[DNS: gitlab.egon.top]
DNS --> GL[Rocky Linux 10 / GitLab Omnibus]
GL --> Data[/var/opt/gitlab 数据目录\]
GL --> Logs[/var/log/gitlab 日志目录\]
GL --> Conf[/etc/gitlab 配置目录\]
GL --> Backup[/var/opt/gitlab/backups 备份目录\]
Runner[独立 GitLab Runner] --> GL
如果家里或内网一台机器部署很多服务,我更推荐:
flowchart LR
User[用户] --> Proxy[Nginx / Caddy / OpenWrt 反向代理]
Proxy -->|HTTP 6001| GitLab[GitLab Omnibus]
User -->|SSH 22/2222| SSHD[系统 sshd + git 用户]
两种常见访问模式:
| 模式 | 对外访问 | GitLab 内部监听 | 适合场景 |
|---|---|---|---|
| 直接暴露端口 | http://gitlab.egon.top:6001 |
6001 | 内网、临时、自用 |
| 反向代理 HTTPS | https://gitlab.egon.top |
127.0.0.1:6001 | 推荐生产、小团队、公网入口 |
5. 资源规划
GitLab 对资源并不算轻,尤其是 Rails、PostgreSQL、Gitaly、Sidekiq、日志和 Git 操作都依赖磁盘 IO。
建议起步:
| 场景 | CPU | 内存 | 磁盘 | 说明 |
|---|---|---|---|---|
| 个人实验 | 2 核 | 8 GB | 100 GB SSD | 能用,但要关掉不用的组件 |
| 小团队 | 4 核 | 16 GB | 200 GB+ SSD/NVMe | 推荐起点 |
| 中型团队 | 8 核+ | 32 GB+ | 500 GB+ SSD/NVMe | 需要监控、备份、升级窗口 |
| 大规模 | 参考官方架构 | 参考官方架构 | 对象存储 / 独立 DB / Gitaly | 不建议单机硬扛 |
磁盘建议:
/var/opt/gitlab放数据,建议独立 SSD/NVMe 分区。/var/log/gitlab放日志,至少保证不会把根分区打满。/var/opt/gitlab/backups可以先本机保存,但必须再同步到异机或 NAS。- 备份文件和 GitLab 数据放同一块盘,只能防误删,不能防硬盘坏。
查看磁盘:
1 | |
如果已经规划独立数据盘,可以挂载到 /var/opt/gitlab:
1 | |
建议写入 /etc/fstab,避免重启后 GitLab 数据目录没挂载就启动。
6. 域名与 DNS 规划
6.1 DNS 只负责域名到 IP,不负责端口
gitlab.egon.top 只能解析到 IP,不能解析到 6001 端口。
所以:
- 直接端口访问:浏览器输入
http://gitlab.egon.top:6001 - 反向代理访问:浏览器输入
https://gitlab.egon.top
6.2 内网推荐 Split DNS
如果 GitLab 在家里内网,同时又有公网 IP,推荐:
| 访问来源 | DNS 解析结果 |
|---|---|
| 内网设备 | gitlab.egon.top -> 192.168.9.x |
| 外网设备 | gitlab.egon.top -> 公网 IP 或不解析 |
| VPN 用户 | gitlab.egon.top -> 192.168.9.x |
如果的 OpenWrt / dnsmasq / AdGuard 在内网做 DNS,可以加一条:
1 | |
这样 Mac、Windows、服务器、Runner 都能通过同一个域名访问 GitLab,后面 clone 地址、Webhook、CI/CD 变量也会更一致。
7. Rocky Linux 10 系统初始化
以下命令建议使用 root 或具备 sudo 权限的账号执行。
7.1 设置主机名和时区
1 | |
如果的团队主要在新加坡,也可以使用:
1 | |
检查:
1 | |
7.2 更新系统与安装基础依赖
1 | |
启动 SSH 和防火墙:
1 | |
7.3 检查 SELinux
Rocky 默认通常启用 SELinux:
1 | |
如果输出是 Enforcing,非标准 HTTP 端口需要额外放行 SELinux 端口类型,否则防火墙放了端口,GitLab Nginx 仍可能起不来或无法访问。
为 6001 添加 HTTP 端口类型:
1 | |
查看:
1 | |
7.4 放行防火墙端口
直接使用 6001 访问:
1 | |
如果使用标准 HTTP/HTTPS:
1 | |
如果后续启用 Git over SSH 的自定义端口,例如 2222:
1 | |
8. 添加 GitLab 官方 RPM 仓库
个人私服推荐 GitLab CE:
1 | |
如果公司未来可能购买订阅,也可以装 EE:
1 | |
查看仓库:
1 | |
查看可安装版本:
1 | |
如果使用 EE:
1 | |
不建议手工拼
packages.gitlab.com/.../el/9/...rpm下载地址。Rocky 10 应按 EL10/RHEL10 兼容包走仓库安装;手工下错包,后面升级会非常痛苦。
9. 安装 GitLab
9.1 方案一:直接使用 6001 端口访问
如果就是希望访问:
1 | |
安装 CE:
1 | |
安装 EE:
1 | |
安装完成后编辑配置:
1 | |
推荐基础配置如下:
1 | |
应用配置:
1 | |
9.2 方案二:反向代理 HTTPS,GitLab 内部监听 6001
如果后面想用 Nginx / Caddy / OpenWrt 入口统一管理证书,建议让用户访问:
1 | |
GitLab 内部只监听:
1 | |
/etc/gitlab/gitlab.rb 写成:
1 | |
应用配置:
1 | |
外部 Nginx 示例:
1 | |
这个模式更适合生产,因为后续可以把很多服务统一挂在 443:
1 | |
端口冲突就交给反向代理处理,别让每个服务都在公网裸奔一个端口。端口不是糖葫芦,越串越难管。
10. 初始化登录
查看初始 root 密码:
1 | |
登录地址:
1 | |
或:
1 | |
首次登录后立刻做这些事:
- 修改 root 密码。
- 修改 root 邮箱。
- 创建自己的管理员账号。
- 禁止日常使用 root。
- 关闭公开注册。
- 如有公网访问,管理员启用 2FA。
关闭公开注册路径:
1 | |
11. Git over SSH 端口说明
这是很多 GitLab 私服文章讲得不够清楚的地方。
Linux package / Omnibus GitLab 默认并不会单独运行一个 GitLab SSH 服务。Git over SSH 通常通过系统 sshd,再由 git 用户和 gitlab-shell 处理。
所以:
- Web 访问端口 6001 与 SSH clone 端口不是一回事。
gitlab_rails['gitlab_shell_ssh_port']主要影响页面上展示的 clone 地址。- 如果设置页面展示 2222,系统
sshd也必须真的监听 2222。 - 不要只改 GitLab 配置,不改 sshd,然后疑惑为什么 clone 失败。
如果希望 Git clone 使用 2222,同时保留系统管理 SSH 22,可以新增 sshd 配置:
1 | |
写入:
1 | |
SELinux 放行 SSH 端口:
1 | |
防火墙放行:
1 | |
重载 SSHD:
1 | |
然后在 /etc/gitlab/gitlab.rb 增加:
1 | |
应用:
1 | |
测试:
1 | |
如果没有特别需求,最简单就是继续使用系统默认 22。小团队内网不用为了“看起来专业”强行改端口,改完忘了防火墙和 SELinux,专业感会立刻变成排障感。
12. 常用运维命令
查看状态:
1 | |
重载配置:
1 | |
重启全部组件:
1 | |
只重启 Nginx:
1 | |
查看全部日志:
1 | |
查看 Rails 日志:
1 | |
查看 Nginx 日志:
1 | |
健康检查:
1 | |
查看环境信息:
1 | |
查看版本:
1 | |
13. 备份策略
GitLab 备份必须分成两类看:
| 类型 | 内容 | 常见路径 |
|---|---|---|
| 应用数据备份 | 数据库、仓库、uploads、artifacts、LFS、packages 等 | /var/opt/gitlab/backups |
| 配置与密钥备份 | gitlab.rb、gitlab-secrets.json、证书等 |
/etc/gitlab |
只备份 /var/opt/gitlab/backups 不够。
最关键的是:
1 | |
这个文件丢了,恢复后可能出现:
- 2FA 用户无法正常登录。
- CI/CD variables 无法解密。
- Runner token、加密字段、集成配置异常。
gitlab-rake gitlab:doctor:secrets报错。
备份 GitLab 不备份 secrets,就像备份了保险柜,顺手把钥匙扔河里。
13.1 手动应用数据备份
1 | |
备份结果默认在:
1 | |
也可以用旧命令:
1 | |
但新版本更推荐 gitlab-backup create。
13.2 手动配置备份
1 | |
默认生成在:
1 | |
也可以指定目录:
1 | |
13.3 定时备份
创建 cron:
1 | |
写入:
1 | |
检查 cron:
1 | |
13.4 异机同步
假设有 NAS 或另一台备份机:
1 | |
更实用的定时同步:
1 | |
如果备份里包含 secrets,建议加密保存,例如使用 age、gpg 或备份系统自带的加密功能。
13.5 备份检查清单
每次备份后至少确认:
1 | |
检查文件是否明显异常:
- 备份文件大小突然变成几 KB,通常不正常。
- 备份目录一直没有新文件,cron 可能没跑。
- 备份和生产数据在同一块盘,硬盘坏了全没。
- 没做过恢复演练,备份只能算“心理安慰”。
14. 恢复策略
恢复前请记住三条硬规则:
- 目标 GitLab 必须是可运行实例。
- 目标 GitLab 版本和类型必须与备份完全一致。
- 必须恢复
gitlab-secrets.json。
比如备份来自:
1 | |
目标也应该安装:
1 | |
不能拿 16.x 的备份直接恢复到 18.x,也不能拿 CE 备份直接恢复到 EE 后当作没事。
14.1 查看备份 ID
备份文件通常类似:
1 | |
恢复时 BACKUP= 后面不带 _gitlab_backup.tar:
1 | |
14.2 恢复配置和 secrets
先恢复配置:
1 | |
重新生成子配置:
1 | |
14.3 放置备份文件
1 | |
14.4 停止连接数据库的进程
1 | |
注意,不是 unicorn。
14.5 执行恢复
1 | |
根据提示输入 yes。
恢复后:
1 | |
14.6 恢复验证
至少验证:
- root / 管理员能登录。
- 用户、Group、Project 都存在。
- 仓库 clone / pull / push 正常。
- Merge Request、Issue、Wiki 正常。
- CI/CD variables 能读取。
- Runner 能连上。
- 如果启用 LFS / artifacts / packages / registry,也要逐项验证。
15. 从旧 GitLab 迁移到 Rocky 10 的推荐路径
这是现在很可能遇到的真实问题:之前已经部署过一套 GitLab,现在想在 Rocky 10 上继续用。
15.1 如果旧版本已经是 18.6+
路径比较简单:
- 旧机器执行应用数据备份。
- 旧机器执行
/etc/gitlab配置备份。 - 新 Rocky 10 安装相同版本 GitLab。
- 恢复
gitlab.rb和gitlab-secrets.json。 - 恢复应用备份。
- 检查功能。
- 切 DNS。
15.2 如果旧版本低于 18.6
不要直接恢复到 Rocky 10。
建议路径:
1 | |
如果旧机器系统已经不能升级,可以临时找一台 Rocky 9 / AlmaLinux 9 中转机:
- 安装与旧备份一致的 GitLab 版本。
- 恢复旧备份。
- 按 GitLab 升级路径升级到 18.6+。
- 再备份。
- 到 Rocky 10 恢复。
这一步不能省。GitLab 恢复对版本要求非常严格,强行跨版本恢复,轻则报错,重则数据半残,运维体验堪比拆盲盒。
16. 升级 GitLab
升级前准备:
1 | |
查看可用版本:
1 | |
升级到仓库最新版本:
1 | |
或安装指定版本:
1 | |
升级后检查:
1 | |
升级原则:
- 不要用生产环境试胆。
- 不要不备份就升级。
- 不要跨多个大版本乱跳。
- 不要忽略官方 upgrade path。
- 不要忘了升级 GitLab Runner。
- 升级前暂停关键 pipeline,避免升级时还有 job 在跑。
17. 卸载与重装
如果只是想重配,不一定要卸载。优先:
1 | |
如果必须卸载,先备份:
1 | |
停止服务:
1 | |
卸载 CE:
1 | |
卸载 EE:
1 | |
清理目录前再次确认备份:
1 | |
是否删除 /etc/gitlab 要非常慎重,因为里面有 gitlab-secrets.json。如果还可能恢复,就不要删。
原脚本里提到“覆盖回 /opt/gitlab/embedded/etc/*-gitlab-*.conf”。这类文件属于 GitLab 包内部生成内容,不建议作为迁移主线。真正应该长期保存和恢复的是:
1 | |
如果有内核参数优化,建议放到 /etc/sysctl.d/*.conf,不要靠覆盖 GitLab embedded 目录。
18. 500 错误排查
访问 GitLab 出现 500,先不要慌,也不要立刻重装。按下面顺序排。
18.1 看服务状态
1 | |
重点看:
- puma
- sidekiq
- redis
- postgresql
- gitaly
- nginx
18.2 看日志
1 | |
18.3 看磁盘和内存
1 | |
磁盘满是 GitLab 500 的常见原因,尤其是:
/var/opt/gitlab/var/log/gitlab/- 备份目录
18.4 检查配置
1 | |
18.5 检查迁移状态
1 | |
如果确认迁移卡住,且已经备份,再执行:
1 | |
18.6 常见原因速查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 端口访问不到 | firewalld / SELinux 未放行 | 放行端口、semanage port |
| 页面跳转地址不对 | external_url 写错 |
修改并 reconfigure |
| clone 地址不对 | SSH 端口配置不一致 | 配置 gitlab_shell_ssh_port 与 sshd |
| 恢复后 2FA / CI variables 异常 | secrets 没恢复 | 恢复 gitlab-secrets.json |
| 升级后 500 | migration 未完成 | 看日志、查 migrate status |
| 登录页慢 | 内存不足或磁盘 IO 差 | 增内存、SSD、关不用组件 |
| 备份恢复失败 | 版本或 CE/EE 不一致 | 安装完全相同版本与类型 |
19. 小内存优化建议
现在已经关闭了 Registry、Prometheus 和 exporter,这对个人 GitLab 是合理的。
可以考虑:
1 | |
如果机器内存只有 4GB-8GB,可以谨慎调整 Puma:
1 | |
然后:
1 | |
不建议一上来就疯狂调 Sidekiq、PostgreSQL、Gitaly。GitLab 的默认值已经考虑了通用场景,调错了比不调更糟。性能调优第一原则:先监控,再下刀;不要凭感觉给生产做针灸。
20. SMTP 配置建议
现在写的是:
1 | |
个人内网可以先关闭。但关闭 SMTP 之后:
- 用户无法通过邮件重置密码。
- 邀请用户邮件不会发送。
- Pipeline 失败通知没有邮件。
- MR / Issue 通知体验变差。
如果公司内网使用,建议配置 SMTP:
1 | |
应用:
1 | |
测试邮件可以在 GitLab Rails console 中做,但生产环境注意不要把 SMTP 密码写进公开仓库。
21. Root 密码重置
如果忘记 root 密码:
1 | |
它会提示输入新密码和确认密码。
如果 root 用户名被改了,可以先用普通命令重置:
1 | |
然后根据提示输入用户名。
如果密码改完仍登录失败,可能是邮箱确认或账号状态问题,可以进入 Rails console 排查:
1 | |
示例:
1 | |
22. GitLab Runner 建议独立部署
GitLab 本体不要和 Runner 混在一台机器上,尤其是生产环境。
原因:
- CI job 会执行项目里的脚本,本质上是不可信代码。
- Shell executor 风险很高。
- Docker privileged 模式风险很高。
- 构建任务会抢 CPU、内存、磁盘 IO。
- Runner 崩了不应该拖垮 GitLab 本体。
建议:
1 | |
Rocky 10 Runner 机器可以添加 Runner 仓库:
1 | |
注册 Runner:
1 | |
如果的 GitLab 是 http://gitlab.egon.top:6001,--url 就写这个地址。
基础 .gitlab-ci.yml:
1 | |
Runner 安全基线:
- 不可信项目不要用 Shell executor。
- Docker executor 不要默认开启 privileged。
- 给 Runner 打 tag,避免所有项目乱用。
- 生产发布 Runner 与普通构建 Runner 分开。
- CI/CD variables 设置 protected、masked。
- 不要在 CI 日志里 echo 密钥。
23. 生产安全基线
23.1 账号安全
- 关闭公开注册。
- 管理员开启 2FA。
- 不要多人共用 root。
- 创建日常管理员账号,root 只做兜底。
- 定期清理离职用户和长期不用账号。
- 定期审计 Personal Access Token、Project Access Token、Group Access Token。
23.2 网络安全
- 公网优先通过 VPN / WireGuard / 零信任网关访问。
- 必须公网开放时,只开放必要端口。
- 不建议把 GitLab 管理后台暴露给全互联网。
- 反向代理要保留真实 IP。
- 不要暴露 Prometheus / exporter 到公网。
23.3 数据安全
- 应用备份 + 配置备份必须同时做。
gitlab-secrets.json加密保存。- 备份要异机保存。
- 每月至少做一次恢复演练。
- 备份文件权限建议
0600。 - 不要把备份文件放到公开目录或对象存储公开桶。
23.4 项目安全
- 默认分支禁止直接 push。
- 强制 Merge Request。
- 重要项目至少 1 人 Review。
- 保护生产分支和生产 tag。
- CI/CD 生产变量只允许 protected branch/tag 使用。
- 重要项目开启 signed commit / approval rules,视团队情况逐步推进。
24. 推荐最终配置模板
如果当前就是单机 + 6001 端口 + 不启用 SMTP/Registry/Prometheus,可以用下面这份作为 /etc/gitlab/gitlab.rb 的核心配置段:
1 | |
应用:
1 | |
25. 一键检查清单
部署完成后按下面清单过一遍:
1 | |
26. 总结
Rocky Linux 10 上部署 GitLab,真正要注意的不是安装命令本身,而是这几件事:
- 版本匹配:Rocky 10/RHEL 10 兼容环境至少按 GitLab 18.6+ 规划。
external_url正确:它决定 clone 地址、Webhook、CI 变量和跳转地址。- 非标准端口要处理 SELinux + firewalld:只开防火墙不一定够。
- 不要再用
unicorn:恢复时停puma和sidekiq。 - 备份必须包含 secrets:
gitlab-secrets.json是恢复成败关键。 - 旧版本迁移不要跨版本硬恢复:先升级到 Rocky 10 支持的 GitLab 版本线。
- Runner 独立部署:不要让 CI job 和 GitLab 本体互相伤害。
- 公网访问要收紧:关闭注册、启用 2FA、HTTPS/VPN、限制暴露面。
GitLab 私服不是“装完就结束”的软件,它更像一个持续运行的内部平台。把安装、备份、恢复、升级、安全这几件事提前做好,后面会少很多“为什么昨天还能用”的灵魂拷问。
参考资料
- GitLab Docs - Install GitLab using the Linux package
https://docs.gitlab.com/install/package/ - GitLab Docs - Install the Linux package on AlmaLinux and RHEL compatible systems
https://docs.gitlab.com/install/package/almalinux/ - GitLab Docs - GitLab installation requirements
https://docs.gitlab.com/install/requirements/ - GitLab Docs - Linux package configuration options
https://docs.gitlab.com/omnibus/settings/configuration/ - GitLab Docs - NGINX settings
https://docs.gitlab.com/omnibus/settings/nginx/ - GitLab Docs - Back up GitLab
https://docs.gitlab.com/administration/backup_restore/backup_gitlab/ - GitLab Docs - Backup GitLab Linux package configuration
https://docs.gitlab.com/omnibus/settings/backups/ - GitLab Docs - Restore GitLab
https://docs.gitlab.com/administration/backup_restore/restore_gitlab/ - GitLab Docs - Reset user passwords
https://docs.gitlab.com/security/reset_user_password/ - GitLab Docs - Running GitLab in a memory-constrained environment
https://docs.gitlab.com/omnibus/settings/memory_constrained_envs/ - GitLab Docs - Configure the bundled Puma instance
https://docs.gitlab.com/administration/operations/puma/ - CSDN - Rocky Linux 安装部署 GitLab
https://blog.csdn.net/weixin_43573768/article/details/136161268 - CSDN - Docker 部署配置 GitLab
https://blog.csdn.net/Mr_XiMu/article/details/130319766