← 文章

在 Linux 服务器上部署和维护 GitLab

以 AlmaLinux/RHEL 为例,记录安装、备份、性能调优、安全加固与故障排查

文章目录7 节
  1. 自建 GitLab,值得吗?
  2. GitLab CE vs EE 怎么选
  3. 先确认机器配置够不够
  4. 安装步骤
  5. 1. 更新系统,装好依赖
  6. 2. 配置网络服务
  7. 3.(可选)配置邮件服务
  8. 4. 安装 GitLab
  9. 5. 个性化配置
  10. 6. 首次登录
  11. 日常维护
  12. 基本管理命令
  13. 备份与恢复
  14. 性能调优
  15. 升级 GitLab
  16. 安全加固
  17. HTTPS 配置
  18. 安全加固检查清单
  19. 常见问题排查
  20. 写在最后

文章目录

7 节
  1. 自建 GitLab,值得吗?
  2. GitLab CE vs EE 怎么选
  3. 先确认机器配置够不够
  4. 安装步骤
  5. 1. 更新系统,装好依赖
  6. 2. 配置网络服务
  7. 3.(可选)配置邮件服务
  8. 4. 安装 GitLab
  9. 5. 个性化配置
  10. 6. 首次登录
  11. 日常维护
  12. 基本管理命令
  13. 备份与恢复
  14. 性能调优
  15. 升级 GitLab
  16. 安全加固
  17. HTTPS 配置
  18. 安全加固检查清单
  19. 常见问题排查
  20. 写在最后

本文记录了在 Linux 服务器上部署 GitLab 的主要步骤,涵盖安装配置、性能调优、安全加固和日常维护。示例以 AlmaLinux/RHEL 兼容发行版为主,其他发行版请按官方安装页调整。

graph TD
    A[系统准备] --> B[安装依赖]
    B --> C[配置 GitLab]
    C --> D[初始化启动]
    D --> E[日常运维]
    E --> F[备份与恢复]
    E --> G[性能调优]
    E --> H[安全加固]

自建 GitLab,值得吗?

团队有数据驻留、内网访问、合规或自主运维要求时,自建 GitLab 是一种选择:代码仓库、CI/CD 和项目管理可以放在自己的基础设施里。代价也很直接——升级、备份、安全和可用性都要由自己负责;如果没有这些约束,托管平台通常更省运维成本。

GitLab CE vs EE 怎么选

很多人一上来就纠结版本,其实对大多数团队来说答案很明确:

维度CE(社区版)EE(企业版)
价格完全免费免费层可用,高级功能付费
核心功能Git 仓库、CI/CD、Issue、Wiki包含 CE 全部功能
高级功能高级 CI/CD、审计日志、LDAP 组同步
安全功能基础SAST/DAST 代码扫描、依赖扫描
技术支持社区支持官方技术支持
适合场景中小团队、个人项目大型企业、合规要求高的场景
提示

EE 软件包未启用付费订阅时可以使用 Free 层,后续升级付费功能无需更换软件包。具体功能归属会随版本和订阅层级变化,选型时再核对官方定价与功能表

下面以 AlmaLinux/RHEL 兼容发行版为例,记录 GitLab CE 的安装、调优和日常维护。具体支持的平台与版本会变化,动手前先核对官方支持列表

先确认机器配置够不够

GitLab 是个资源大户,机器规格需要按用户量、仓库规模和 CI 负载估算1

配置项受限环境起步官方单节点基线说明
操作系统AlmaLinux/RHEL 8AlmaLinux/RHEL 9CentOS 7/8 已不在当前包支持范围
内存8GB(需按受限环境调优)16GB负载增加时继续扩容
CPU按低负载实测裁剪8 vCPUCI/CD Runner 通常还要单独估算
磁盘应用约 40GB,再加数据库和仓库数据SSD,并预留增长空间仓库和数据库都依赖磁盘性能
网络稳定连接内网千兆大仓库 clone/push 对带宽有要求
警告

GitLab 官方当前给出的单节点基线是 8 vCPU、16GB 内存;内存受限场景至少需要 8GB,并配合专门的裁剪。不要把“进程能启动”当作容量达标,正式使用前应按真实并发和仓库规模压测。

安装步骤

1. 更新系统,装好依赖

先更新系统并安装基础工具:

sudo dnf update -y
sudo dnf install -y curl openssh-server

2. 配置网络服务

SSH 和防火墙是基础设施,GitLab 需要通过 HTTP/HTTPS 提供 Web 访问,通过 SSH 提供 Git 操作:

# 启用 SSH 服务
sudo systemctl enable sshd
sudo systemctl start sshd

# 开放防火墙端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

3.(可选)配置邮件服务

GitLab 可以发送合并请求提醒、CI 结果和密码重置邮件。外部 SMTP 可以直接在 gitlab.rb 中配置;只有准备使用本机邮件传输代理时,才需要安装 Postfix:

sudo dnf install -y postfix
sudo systemctl enable postfix
sudo systemctl start postfix

4. 安装 GitLab

准备工作做完,添加官方软件包仓库,然后安装 GitLab:

# 添加 GitLab 仓库
curl --location "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh" | sudo bash

# 安装(替换为你的实际域名或 IP)
sudo EXTERNAL_URL="https://gitlab.example.com" dnf install -y gitlab-ce
注意

gitlab.example.com 替换为已经解析到服务器的实际域名。使用 HTTPS 时,自动申请证书还需要满足官方文档中的 DNS 和入站端口条件;纯内网环境则应配置自己的证书或按内网方案处理。

5. 个性化配置

装完之后,大部分默认配置其实就能用。但有几个地方建议改一下,打开配置文件:

sudo vim /etc/gitlab/gitlab.rb

使用 i 进入编辑模式,修改完成后按 Esc 退出编辑模式,然后输入 :wq 保存退出。

核心配置项一览:

配置项说明示例值
external_url外部访问地址'http://gitlab.example.com'
gitlab_rails['smtp_enable']启用 SMTP 邮件true
gitlab_rails['smtp_address']SMTP 服务器地址'smtp.server.com'
gitlab_rails['smtp_port']SMTP 端口587
gitlab_rails['smtp_user_name']SMTP 用户名'user@example.com'
gitlab_rails['smtp_password']SMTP 密码'password'
gitlab_rails['smtp_authentication']认证方式'login'
gitlab_rails['smtp_enable_starttls_auto']启用 TLStrue
gitlab_rails['gitlab_email_from']发件人地址'gitlab@example.com'
gitlab_rails['backup_keep_time']备份保留时间(秒)604800(一周)

改完之后让配置生效:

sudo gitlab-ctl reconfigure

这个命令会重新生成所有组件的配置文件并重启相关服务,第一次执行会比较慢。

6. 首次登录

打开浏览器访问配置好的 URL,使用下面的信息登录:

  • 用户名:root
  • 初始密码:查看 /etc/gitlab/initial_root_password
提示

Linux 软件包安装会把随机生成的初始密码暂存在 /etc/gitlab/initial_root_password,24 小时后自动删除。首次登录后立即修改密码和管理员邮箱,不要把这个文件复制到聊天记录或工单里。

日常维护

GitLab 跑起来之后,日常维护也不能落下。以下是最常用的操作命令。

基本管理命令

sudo gitlab-ctl status      # 查看各组件状态
sudo gitlab-ctl start       # 启动所有组件
sudo gitlab-ctl stop        # 停止所有组件
sudo gitlab-ctl restart     # 重启所有组件
sudo gitlab-ctl reconfigure # 重新加载配置
sudo gitlab-ctl tail        # 查看实时日志

备份与恢复

数据无价,备份这件事怎么强调都不过分。建议至少配一个每日自动备份,再搞一个异地备份。

手动备份与恢复:

# 创建备份
sudo gitlab-rake gitlab:backup:create

# 恢复备份(先停相关服务)
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
sudo gitlab-rake gitlab:backup:restore BACKUP=1612345678_2021_02_03
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true
注意

备份文件默认保存在 /var/opt/gitlab/backups 目录下。恢复时 BACKUP 参数填文件名中去掉 _gitlab_backup.tar 后缀的部分。

自动备份脚本:

建议配一个 cron 定时任务,每天凌晨自动备份并清理过期文件:

#!/bin/bash
# GitLab 自动备份脚本
# 建议通过 crontab -e 添加:0 2 * * * /opt/scripts/gitlab-backup-cron.sh

BACKUP_LOG="/var/log/gitlab-backup.log"

echo "=== 开始备份: $(date) ===" >> "$BACKUP_LOG"
sudo gitlab-rake gitlab:backup:create >> "$BACKUP_LOG" 2>&1

if [ $? -eq 0 ]; then
  echo "备份成功" >> "$BACKUP_LOG"
else
  echo "备份失败!请检查" >> "$BACKUP_LOG"
  # 可在此处添加邮件/钉钉告警
fi

echo "=== 备份结束: $(date) ===" >> "$BACKUP_LOG"
重要

gitlab.rbgitlab-secrets.json 这两个文件不包含在 gitlab-rake 备份中,需要单独备份。丢了 gitlab-secrets.json 的话,双因子认证和加密的 CI 变量都会失效。

性能调优

如果服务器资源不太富裕,下面这几项配置能显著降低内存占用。实测 4G 内存的机器调完之后流畅很多:

# 减少 Puma 工作进程数(默认按 CPU 核数,小机器改为 2)
puma['worker_processes'] = 2

# 减少 Sidekiq 并发数(默认 25,小机器改为 5)
sidekiq['concurrency'] = 5

# 减少 PostgreSQL 共享缓冲区
postgresql['shared_buffers'] = "256MB"

# 禁用 Prometheus 监控(省约 200MB 内存)
prometheus_monitoring['enable'] = false
调优项默认值推荐值(4G 内存)节省内存
puma['worker_processes']CPU 核数2约 400MB
sidekiq['concurrency']255约 200MB
prometheus_monitoringtruefalse约 200MB
postgresql['shared_buffers']自动256MB视情况而定

升级 GitLab

升级之前务必先备份,这是铁律。另外注意 GitLab 不支持跨大版本升级,需要按照官方升级路径一步步来:

# 1. 先备份!
sudo gitlab-rake gitlab:backup:create

# 2. 更新包信息并升级
sudo dnf update
sudo dnf install gitlab-ce

# 3. 应用配置
sudo gitlab-ctl reconfigure
警告

跨大版本升级(比如从 15.x 直接跳到 17.x)大概率会翻车。务必按官方文档的升级路径走,中间版本不能跳。每升一个版本都要确认服务正常后再继续。

安全加固

生产环境下,以下几点强烈建议配上。

HTTPS 配置

对外暴露的实例必须上 HTTPS,Let’s Encrypt 提供免费 SSL 证书,GitLab 内置支持:

external_url 'https://your-gitlab-domain.com'
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['admin@example.com']

安全加固检查清单

  • 启用 HTTPS — 配置 Let’s Encrypt 或自有证书 — 必须
  • 修改默认 root 密码 — 首次登录后立即修改 — 必须
  • 密码复杂度 — gitlab_rails['password_minimum_length'] = 12 — 高
  • 限制注册 — 关闭公开注册或限制邮箱域名 — 高
  • SSH 访问限制 — 防火墙仅允许特定 IP 段访问 22 端口 — 高
  • 双因子认证 — 管理后台强制启用 2FA — 中
  • 定期备份 — 每日自动备份 + 异地存储 — 必须
  • 备份恢复演练 — 每月至少测试一次恢复流程 — 中
  • 及时升级 — 关注安全公告,及时打补丁 — 高
  • 限制 API 速率 — 管理后台 → 设置 → 网络 → 速率限制 — 中

常见问题排查

遇到问题不要慌,大多数情况都是资源不够或配置不对。

警告

502 错误 的排查思路:

  1. free -m 查内存与 swap,确认是否发生资源耗尽
  2. sudo gitlab-ctl status 看哪个组件挂了
  3. sudo gitlab-ctl tail puma 看 Puma 日志
  4. 如果是刚装完或刚重启,等 2-3 分钟再试(GitLab 启动慢是正常的)
  5. 实在内存不够就按上面的调优配置减负
注意

无法发送邮件:检查 SMTP 配置是否正确,可以用 sudo gitlab-rails console 进去手动发一封测试邮件排查:

Notify.test_email('test@example.com', '测试', '测试邮件内容').deliver_now
注意

性能问题:用 tophtop 看资源占用,大概率是内存吃紧。如果 Sidekiq 占用过高,降低并发数;如果 Puma 占用过高,减少 worker 数量。调完别忘了 sudo gitlab-ctl reconfigure

写在最后

自建 GitLab 的过程并不复杂,真正的挑战在于后期的维护和调优。建议上线前做好监控和告警,定期检查备份是否可用(别等到要恢复的时候才发现备份是坏的),升级前仔细看 changelog。把这些习惯养成了,GitLab 就能稳稳地为团队服务。更多配置细节可参考 GitLab 官方文档

Footnotes

  1. GitLab 当前文档把 8 vCPU、16GB 内存作为单节点基线;内存受限环境至少 8GB。存储还要包含应用、数据库和全部仓库数据。详见 GitLab installation requirements