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
external_url='http:gitlab.egon.top:6001'

这个写法有两个问题:

  1. GitLab Omnibus 的配置是 Ruby DSL,通常写成 external_url '...'
  2. URL 少了 //,正确 HTTP 地址应该是 http://...

建议改成:

1
external_url 'http://gitlab.egon.top:6001'

如果用反向代理对外提供 HTTPS,而 GitLab 内部只监听 6001,则应该写成:

1
2
3
external_url 'https://gitlab.egon.top'
nginx['listen_port'] = 6001
nginx['listen_https'] = false

这两个方案不要混着写。external_url 是用户浏览器、Git 客户端、Webhook、CI 变量看到的真实访问地址,不只是 GitLab 内部监听地址。

3.2 unicorn 已经过时

老文章里常见:

1
gitlab-ctl stop unicorn

现在 GitLab 使用的是 Puma。恢复备份时建议用:

1
2
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq

3.3 500 错误不要上来就 db:migrate

原脚本里写了:

1
gitlab-rake db:migrate

这个命令不是不能用,而是不要作为“500 错误万能药”。更稳的排查顺序是:

1
2
3
4
5
sudo gitlab-ctl status
sudo gitlab-ctl tail gitlab-rails
sudo gitlab-ctl tail nginx
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-rake db:migrate:status

只有在确认是数据库迁移未完成、升级中断、并且已经备份后,再考虑执行:

1
2
sudo gitlab-rake db:migrate
sudo gitlab-ctl restart

3.4 不要把 root 初始密码写进博客或仓库

脚本里出现了初始 root 密码示例。博客里建议只写命令,不要写真实密码:

1
sudo cat /etc/gitlab/initial_root_password

登录后立刻修改 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
2
lsblk
df -h

如果已经规划独立数据盘,可以挂载到 /var/opt/gitlab

1
2
sudo mkdir -p /var/opt/gitlab
sudo mount /dev/mapper/vg_gitlab-lv_data /var/opt/gitlab

建议写入 /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
gitlab.egon.top -> 192.168.9.x

这样 Mac、Windows、服务器、Runner 都能通过同一个域名访问 GitLab,后面 clone 地址、Webhook、CI/CD 变量也会更一致。

7. Rocky Linux 10 系统初始化

以下命令建议使用 root 或具备 sudo 权限的账号执行。

7.1 设置主机名和时区

1
2
sudo hostnamectl set-hostname gitlab
sudo timedatectl set-timezone Asia/Shanghai

如果的团队主要在新加坡,也可以使用:

1
sudo timedatectl set-timezone Asia/Singapore

检查:

1
2
hostnamectl
timedatectl

7.2 更新系统与安装基础依赖

1
2
3
4
5
6
7
8
9
10
sudo dnf update -y

sudo dnf install -y \
curl \
vim \
wget \
perl \
openssh-server \
policycoreutils-python-utils \
firewalld

启动 SSH 和防火墙:

1
2
3
4
5
sudo systemctl enable --now sshd
sudo systemctl enable --now firewalld

sudo systemctl status sshd --no-pager
sudo systemctl status firewalld --no-pager

7.3 检查 SELinux

Rocky 默认通常启用 SELinux:

1
getenforce

如果输出是 Enforcing,非标准 HTTP 端口需要额外放行 SELinux 端口类型,否则防火墙放了端口,GitLab Nginx 仍可能起不来或无法访问。

为 6001 添加 HTTP 端口类型:

1
2
sudo semanage port -a -t http_port_t -p tcp 6001 2>/dev/null || \
sudo semanage port -m -t http_port_t -p tcp 6001

查看:

1
sudo semanage port -l | grep http_port_t

7.4 放行防火墙端口

直接使用 6001 访问:

1
2
3
sudo firewall-cmd --permanent --add-port=6001/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

如果使用标准 HTTP/HTTPS:

1
2
3
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

如果后续启用 Git over SSH 的自定义端口,例如 2222:

1
2
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

8. 添加 GitLab 官方 RPM 仓库

个人私服推荐 GitLab CE:

1
curl --location "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh" | sudo bash

如果公司未来可能购买订阅,也可以装 EE:

1
curl --location "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh" | sudo bash

查看仓库:

1
dnf repolist | grep gitlab

查看可安装版本:

1
dnf --showduplicates list gitlab-ce | tail -n 20

如果使用 EE:

1
dnf --showduplicates list gitlab-ee | tail -n 20

不建议手工拼 packages.gitlab.com/.../el/9/...rpm 下载地址。Rocky 10 应按 EL10/RHEL10 兼容包走仓库安装;手工下错包,后面升级会非常痛苦。

9. 安装 GitLab

9.1 方案一:直接使用 6001 端口访问

如果就是希望访问:

1
http://gitlab.egon.top:6001

安装 CE:

1
sudo EXTERNAL_URL="http://gitlab.egon.top:6001" dnf install -y gitlab-ce

安装 EE:

1
sudo EXTERNAL_URL="http://gitlab.egon.top:6001" dnf install -y gitlab-ee

安装完成后编辑配置:

1
sudo vim /etc/gitlab/gitlab.rb

推荐基础配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
############################################
# 1. 基础访问地址
############################################
external_url 'http://gitlab.egon.top:6001'

# external_url 已包含 6001 时,GitLab Nginx 默认会监听这个端口。
# 显式写出来也可以,便于读者理解。
nginx['listen_port'] = 6001
nginx['listen_https'] = false

############################################
# 2. 时区
############################################
gitlab_rails['time_zone'] = 'Asia/Shanghai'

############################################
# 3. SMTP:个人内网可先关闭;公司环境建议配置
############################################
gitlab_rails['smtp_enable'] = false

############################################
# 4. Container Registry:不用镜像仓库就关闭
############################################
gitlab_rails['registry_enabled'] = false
registry['enable'] = false

############################################
# 5. 监控组件:小内存机器可关闭;生产建议接外部监控
############################################
prometheus_monitoring['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false

############################################
# 6. 备份配置
############################################
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_archive_permissions'] = 0600

# 7 天,单位是秒。0 表示不自动清理。
gitlab_rails['backup_keep_time'] = 604800

应用配置:

1
2
3
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-ctl status

9.2 方案二:反向代理 HTTPS,GitLab 内部监听 6001

如果后面想用 Nginx / Caddy / OpenWrt 入口统一管理证书,建议让用户访问:

1
https://gitlab.egon.top

GitLab 内部只监听:

1
127.0.0.1:6001

/etc/gitlab/gitlab.rb 写成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
external_url 'https://gitlab.egon.top'

nginx['listen_port'] = 6001
nginx['listen_https'] = false

# 如果只希望本机反代访问 GitLab,可以限制监听地址。
# 如果外部代理不在本机,就不要写 127.0.0.1。
nginx['listen_addresses'] = ['127.0.0.1']

gitlab_rails['time_zone'] = 'Asia/Shanghai'

gitlab_rails['smtp_enable'] = false

gitlab_rails['registry_enabled'] = false
registry['enable'] = false

prometheus_monitoring['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false

gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_archive_permissions'] = 0600
gitlab_rails['backup_keep_time'] = 604800

应用配置:

1
2
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

外部 Nginx 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 80;
server_name gitlab.egon.top;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name gitlab.egon.top;

ssl_certificate /etc/nginx/certs/gitlab.egon.top/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/gitlab.egon.top/privkey.pem;

client_max_body_size 0;

proxy_read_timeout 3600;
proxy_connect_timeout 300;
proxy_send_timeout 3600;

location / {
proxy_pass http://127.0.0.1:6001;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
}
}

这个模式更适合生产,因为后续可以把很多服务统一挂在 443:

1
2
3
4
gitlab.egon.top    -> GitLab
harbor.egon.top -> Harbor
nexus.egon.top -> Nexus
grafana.egon.top -> Grafana

端口冲突就交给反向代理处理,别让每个服务都在公网裸奔一个端口。端口不是糖葫芦,越串越难管。

10. 初始化登录

查看初始 root 密码:

1
sudo cat /etc/gitlab/initial_root_password

登录地址:

1
http://gitlab.egon.top:6001

或:

1
https://gitlab.egon.top

首次登录后立刻做这些事:

  1. 修改 root 密码。
  2. 修改 root 邮箱。
  3. 创建自己的管理员账号。
  4. 禁止日常使用 root。
  5. 关闭公开注册。
  6. 如有公网访问,管理员启用 2FA。

关闭公开注册路径:

1
Admin Area -> Settings -> General -> Sign-up restrictions

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
sudo vim /etc/ssh/sshd_config.d/10-gitlab-ssh.conf

写入:

1
2
Port 22
Port 2222

SELinux 放行 SSH 端口:

1
2
sudo semanage port -a -t ssh_port_t -p tcp 2222 2>/dev/null || \
sudo semanage port -m -t ssh_port_t -p tcp 2222

防火墙放行:

1
2
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

重载 SSHD:

1
2
sudo sshd -t
sudo systemctl reload sshd

然后在 /etc/gitlab/gitlab.rb 增加:

1
gitlab_rails['gitlab_shell_ssh_port'] = 2222

应用:

1
sudo gitlab-ctl reconfigure

测试:

1
ssh -T -p 2222 git@gitlab.egon.top

如果没有特别需求,最简单就是继续使用系统默认 22。小团队内网不用为了“看起来专业”强行改端口,改完忘了防火墙和 SELinux,专业感会立刻变成排障感。

12. 常用运维命令

查看状态:

1
sudo gitlab-ctl status

重载配置:

1
sudo gitlab-ctl reconfigure

重启全部组件:

1
sudo gitlab-ctl restart

只重启 Nginx:

1
sudo gitlab-ctl restart nginx

查看全部日志:

1
sudo gitlab-ctl tail

查看 Rails 日志:

1
sudo gitlab-ctl tail gitlab-rails

查看 Nginx 日志:

1
sudo gitlab-ctl tail nginx

健康检查:

1
sudo gitlab-rake gitlab:check SANITIZE=true

查看环境信息:

1
sudo gitlab-rake gitlab:env:info

查看版本:

1
sudo gitlab-rake gitlab:env:info | grep "GitLab information" -A 20

13. 备份策略

GitLab 备份必须分成两类看:

类型 内容 常见路径
应用数据备份 数据库、仓库、uploads、artifacts、LFS、packages 等 /var/opt/gitlab/backups
配置与密钥备份 gitlab.rbgitlab-secrets.json、证书等 /etc/gitlab

只备份 /var/opt/gitlab/backups 不够。

最关键的是:

1
/etc/gitlab/gitlab-secrets.json

这个文件丢了,恢复后可能出现:

  • 2FA 用户无法正常登录。
  • CI/CD variables 无法解密。
  • Runner token、加密字段、集成配置异常。
  • gitlab-rake gitlab:doctor:secrets 报错。

备份 GitLab 不备份 secrets,就像备份了保险柜,顺手把钥匙扔河里。

13.1 手动应用数据备份

1
sudo gitlab-backup create

备份结果默认在:

1
ls -lh /var/opt/gitlab/backups

也可以用旧命令:

1
sudo gitlab-rake gitlab:backup:create

但新版本更推荐 gitlab-backup create

13.2 手动配置备份

1
sudo gitlab-ctl backup-etc

默认生成在:

1
/etc/gitlab/config_backup/

也可以指定目录:

1
sudo gitlab-ctl backup-etc --backup-path /var/opt/gitlab/backups

13.3 定时备份

创建 cron:

1
sudo vim /etc/cron.d/gitlab-backup

写入:

1
2
3
4
5
6
7
8
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/gitlab/bin

# 每天 02:15 应用数据备份
15 2 * * * root /opt/gitlab/bin/gitlab-backup create CRON=1

# 每天 02:40 配置与 secrets 备份
40 2 * * * root /opt/gitlab/bin/gitlab-ctl backup-etc --backup-path /var/opt/gitlab/backups --delete-old-backups

检查 cron:

1
2
sudo crontab -l -u root
sudo ls -lh /etc/cron.d/gitlab-backup

13.4 异机同步

假设有 NAS 或另一台备份机:

1
2
3
sudo rsync -av --progress \
/var/opt/gitlab/backups/ \
backup@192.168.9.10:/data/backups/gitlab/

更实用的定时同步:

1
10 3 * * * root rsync -az --delete /var/opt/gitlab/backups/ backup@192.168.9.10:/data/backups/gitlab/

如果备份里包含 secrets,建议加密保存,例如使用 agegpg 或备份系统自带的加密功能。

13.5 备份检查清单

每次备份后至少确认:

1
2
ls -lh /var/opt/gitlab/backups
du -sh /var/opt/gitlab/backups

检查文件是否明显异常:

  • 备份文件大小突然变成几 KB,通常不正常。
  • 备份目录一直没有新文件,cron 可能没跑。
  • 备份和生产数据在同一块盘,硬盘坏了全没。
  • 没做过恢复演练,备份只能算“心理安慰”。

14. 恢复策略

恢复前请记住三条硬规则:

  1. 目标 GitLab 必须是可运行实例。
  2. 目标 GitLab 版本和类型必须与备份完全一致。
  3. 必须恢复 gitlab-secrets.json

比如备份来自:

1
18.6.0-ce

目标也应该安装:

1
18.6.0-ce

不能拿 16.x 的备份直接恢复到 18.x,也不能拿 CE 备份直接恢复到 EE 后当作没事。

14.1 查看备份 ID

备份文件通常类似:

1
1719200000_2026_06_22_18.6.0-ce_gitlab_backup.tar

恢复时 BACKUP= 后面不带 _gitlab_backup.tar

1
1719200000_2026_06_22_18.6.0-ce

14.2 恢复配置和 secrets

先恢复配置:

1
2
3
4
sudo cp gitlab.rb /etc/gitlab/gitlab.rb
sudo cp gitlab-secrets.json /etc/gitlab/gitlab-secrets.json
sudo chown root:root /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json
sudo chmod 0600 /etc/gitlab/gitlab-secrets.json

重新生成子配置:

1
sudo gitlab-ctl reconfigure

14.3 放置备份文件

1
2
sudo cp 1719200000_2026_06_22_18.6.0-ce_gitlab_backup.tar /var/opt/gitlab/backups/
sudo chown git:git /var/opt/gitlab/backups/1719200000_2026_06_22_18.6.0-ce_gitlab_backup.tar

14.4 停止连接数据库的进程

1
2
3
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl status

注意,不是 unicorn

14.5 执行恢复

1
sudo gitlab-backup restore BACKUP=1719200000_2026_06_22_18.6.0-ce

根据提示输入 yes

恢复后:

1
2
3
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-rake gitlab:doctor:secrets

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+

路径比较简单:

  1. 旧机器执行应用数据备份。
  2. 旧机器执行 /etc/gitlab 配置备份。
  3. 新 Rocky 10 安装相同版本 GitLab。
  4. 恢复 gitlab.rbgitlab-secrets.json
  5. 恢复应用备份。
  6. 检查功能。
  7. 切 DNS。

15.2 如果旧版本低于 18.6

不要直接恢复到 Rocky 10。

建议路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
旧机器 GitLab 16.x/17.x
|
| 按官方升级路径逐步升级
v
旧机器或中转环境 GitLab 18.6+
|
| 创建 18.6+ 备份
v
Rocky 10 安装相同 GitLab 18.6+ 版本
|
| 恢复备份
v
Rocky 10 GitLab 正式运行

如果旧机器系统已经不能升级,可以临时找一台 Rocky 9 / AlmaLinux 9 中转机:

  1. 安装与旧备份一致的 GitLab 版本。
  2. 恢复旧备份。
  3. 按 GitLab 升级路径升级到 18.6+。
  4. 再备份。
  5. 到 Rocky 10 恢复。

这一步不能省。GitLab 恢复对版本要求非常严格,强行跨版本恢复,轻则报错,重则数据半残,运维体验堪比拆盲盒。

16. 升级 GitLab

升级前准备:

1
2
3
sudo gitlab-rake gitlab:env:info
sudo gitlab-backup create
sudo gitlab-ctl backup-etc --backup-path /var/opt/gitlab/backups

查看可用版本:

1
dnf --showduplicates list gitlab-ce | tail -n 30

升级到仓库最新版本:

1
sudo dnf update -y gitlab-ce

或安装指定版本:

1
sudo dnf install -y gitlab-ce-<version>

升级后检查:

1
2
3
sudo gitlab-ctl status
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-ctl tail

升级原则:

  • 不要用生产环境试胆。
  • 不要不备份就升级。
  • 不要跨多个大版本乱跳。
  • 不要忽略官方 upgrade path。
  • 不要忘了升级 GitLab Runner。
  • 升级前暂停关键 pipeline,避免升级时还有 job 在跑。

17. 卸载与重装

如果只是想重配,不一定要卸载。优先:

1
2
3
sudo vim /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

如果必须卸载,先备份:

1
2
3
4
sudo gitlab-backup create
sudo gitlab-ctl backup-etc --backup-path /root
sudo cp -a /etc/gitlab /root/gitlab-etc-$(date +%F)
sudo cp -a /var/opt/gitlab/backups /root/gitlab-backups-$(date +%F)

停止服务:

1
2
sudo gitlab-ctl stop
sudo systemctl disable gitlab-runsvdir.service

卸载 CE:

1
sudo dnf remove -y gitlab-ce

卸载 EE:

1
sudo dnf remove -y gitlab-ee

清理目录前再次确认备份:

1
2
3
sudo rm -rf /opt/gitlab
sudo rm -rf /var/opt/gitlab
sudo rm -rf /var/log/gitlab

是否删除 /etc/gitlab 要非常慎重,因为里面有 gitlab-secrets.json。如果还可能恢复,就不要删。

原脚本里提到“覆盖回 /opt/gitlab/embedded/etc/*-gitlab-*.conf”。这类文件属于 GitLab 包内部生成内容,不建议作为迁移主线。真正应该长期保存和恢复的是:

1
2
3
4
5
/etc/gitlab/gitlab.rb
/etc/gitlab/gitlab-secrets.json
/var/opt/gitlab/backups/*_gitlab_backup.tar
证书文件
SSH host keys,按实际情况

如果有内核参数优化,建议放到 /etc/sysctl.d/*.conf,不要靠覆盖 GitLab embedded 目录。

18. 500 错误排查

访问 GitLab 出现 500,先不要慌,也不要立刻重装。按下面顺序排。

18.1 看服务状态

1
sudo gitlab-ctl status

重点看:

  • puma
  • sidekiq
  • redis
  • postgresql
  • gitaly
  • nginx

18.2 看日志

1
2
3
4
5
6
sudo gitlab-ctl tail gitlab-rails
sudo gitlab-ctl tail puma
sudo gitlab-ctl tail sidekiq
sudo gitlab-ctl tail postgresql
sudo gitlab-ctl tail gitaly
sudo gitlab-ctl tail nginx

18.3 看磁盘和内存

1
2
3
df -h
free -h
top

磁盘满是 GitLab 500 的常见原因,尤其是:

  • /var/opt/gitlab
  • /var/log/gitlab
  • /
  • 备份目录

18.4 检查配置

1
2
sudo gitlab-rake gitlab:check SANITIZE=true
sudo gitlab-rake gitlab:doctor:secrets

18.5 检查迁移状态

1
sudo gitlab-rake db:migrate:status

如果确认迁移卡住,且已经备份,再执行:

1
2
sudo gitlab-rake db:migrate
sudo gitlab-ctl restart

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
2
3
prometheus_monitoring['enable'] = false
gitlab_rails['registry_enabled'] = false
registry['enable'] = false

如果机器内存只有 4GB-8GB,可以谨慎调整 Puma:

1
2
puma['worker_processes'] = 2
puma['per_worker_max_memory_mb'] = 1200

然后:

1
2
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

不建议一上来就疯狂调 Sidekiq、PostgreSQL、Gitaly。GitLab 的默认值已经考虑了通用场景,调错了比不调更糟。性能调优第一原则:先监控,再下刀;不要凭感觉给生产做针灸。

20. SMTP 配置建议

现在写的是:

1
gitlab_rails['smtp_enable'] = false

个人内网可以先关闭。但关闭 SMTP 之后:

  • 用户无法通过邮件重置密码。
  • 邀请用户邮件不会发送。
  • Pipeline 失败通知没有邮件。
  • MR / Issue 通知体验变差。

如果公司内网使用,建议配置 SMTP:

1
2
3
4
5
6
7
8
9
10
11
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.example.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "gitlab@example.com"
gitlab_rails['smtp_password'] = "CHANGE_ME"
gitlab_rails['smtp_domain'] = "example.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true

gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'

应用:

1
sudo gitlab-ctl reconfigure

测试邮件可以在 GitLab Rails console 中做,但生产环境注意不要把 SMTP 密码写进公开仓库。

21. Root 密码重置

如果忘记 root 密码:

1
sudo gitlab-rake "gitlab:password:reset[root]"

它会提示输入新密码和确认密码。

如果 root 用户名被改了,可以先用普通命令重置:

1
sudo gitlab-rake "gitlab:password:reset"

然后根据提示输入用户名。

如果密码改完仍登录失败,可能是邮箱确认或账号状态问题,可以进入 Rails console 排查:

1
sudo gitlab-rails console

示例:

1
2
3
4
user = User.find(1)
user.skip_reconfirmation!
user.save!
exit

22. GitLab Runner 建议独立部署

GitLab 本体不要和 Runner 混在一台机器上,尤其是生产环境。

原因:

  • CI job 会执行项目里的脚本,本质上是不可信代码。
  • Shell executor 风险很高。
  • Docker privileged 模式风险很高。
  • 构建任务会抢 CPU、内存、磁盘 IO。
  • Runner 崩了不应该拖垮 GitLab 本体。

建议:

1
2
GitLab 主机:只跑 GitLab
Runner 主机:跑 gitlab-runner + Docker/BuildKit/Kaniko

Rocky 10 Runner 机器可以添加 Runner 仓库:

1
2
curl --location "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
sudo dnf install -y gitlab-runner

注册 Runner:

1
2
3
4
5
6
7
sudo gitlab-runner register \
--url "https://gitlab.egon.top" \
--token "glrt-xxxxxxxxxxxxxxxx" \
--executor "docker" \
--docker-image "alpine:latest" \
--description "rocky10-docker-runner-01" \
--tag-list "docker,linux,rocky"

如果的 GitLab 是 http://gitlab.egon.top:6001--url 就写这个地址。

基础 .gitlab-ci.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
stages:
- test
- build

test:
stage: test
image: maven:3.9-eclipse-temurin-21
script:
- mvn -B test
tags:
- docker

build:
stage: build
image: maven:3.9-eclipse-temurin-21
script:
- mvn -B -DskipTests package
tags:
- docker

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
############################################
# GitLab Rocky Linux 10 单机私服配置
############################################

external_url 'http://gitlab.egon.top:6001'

nginx['listen_port'] = 6001
nginx['listen_https'] = false

gitlab_rails['time_zone'] = 'Asia/Shanghai'

############################################
# 邮件
############################################
gitlab_rails['smtp_enable'] = false

############################################
# Registry
############################################
gitlab_rails['registry_enabled'] = false
registry['enable'] = false

############################################
# Monitoring
############################################
prometheus_monitoring['enable'] = false
prometheus['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
gitlab_exporter['enable'] = false

############################################
# Backup
############################################
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_archive_permissions'] = 0600
gitlab_rails['backup_keep_time'] = 604800

############################################
# Optional: 小内存机器谨慎启用
############################################
# puma['worker_processes'] = 2
# puma['per_worker_max_memory_mb'] = 1200

应用:

1
2
3
4
5
6
7
8
9
sudo semanage port -a -t http_port_t -p tcp 6001 2>/dev/null || \
sudo semanage port -m -t http_port_t -p tcp 6001

sudo firewall-cmd --permanent --add-port=6001/tcp
sudo firewall-cmd --reload

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-ctl status

25. 一键检查清单

部署完成后按下面清单过一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 1. 服务状态
sudo gitlab-ctl status

# 2. 健康检查
sudo gitlab-rake gitlab:check SANITIZE=true

# 3. 访问测试
curl -I http://gitlab.egon.top:6001/users/sign_in

# 4. DNS
dig gitlab.egon.top

# 5. 防火墙
sudo firewall-cmd --list-all

# 6. SELinux 端口
sudo semanage port -l | grep http_port_t | grep 6001

# 7. 磁盘
df -h

# 8. 备份
sudo gitlab-backup create
sudo gitlab-ctl backup-etc --backup-path /var/opt/gitlab/backups
ls -lh /var/opt/gitlab/backups

26. 总结

Rocky Linux 10 上部署 GitLab,真正要注意的不是安装命令本身,而是这几件事:

  1. 版本匹配:Rocky 10/RHEL 10 兼容环境至少按 GitLab 18.6+ 规划。
  2. external_url 正确:它决定 clone 地址、Webhook、CI 变量和跳转地址。
  3. 非标准端口要处理 SELinux + firewalld:只开防火墙不一定够。
  4. 不要再用 unicorn:恢复时停 pumasidekiq
  5. 备份必须包含 secretsgitlab-secrets.json 是恢复成败关键。
  6. 旧版本迁移不要跨版本硬恢复:先升级到 Rocky 10 支持的 GitLab 版本线。
  7. Runner 独立部署:不要让 CI job 和 GitLab 本体互相伤害。
  8. 公网访问要收紧:关闭注册、启用 2FA、HTTPS/VPN、限制暴露面。

GitLab 私服不是“装完就结束”的软件,它更像一个持续运行的内部平台。把安装、备份、恢复、升级、安全这几件事提前做好,后面会少很多“为什么昨天还能用”的灵魂拷问。


参考资料


Rocky Linux 10 部署 GitLab 私服实战:Omnibus 安装、6001 端口、备份恢复与安全基线
https://allendericdalexander.github.io/2026/06/22/devops/infra/rocky10-gitlab-deploy-blog/
作者
AtLuoFu
发布于
2026年6月22日
许可协议