在 Linux 服务器上部署和维护 GitLab
以 AlmaLinux/RHEL 为例,记录安装、备份、性能调优、安全加固与故障排查
本文记录了在 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 8 | AlmaLinux/RHEL 9 | CentOS 7/8 已不在当前包支持范围 |
| 内存 | 8GB(需按受限环境调优) | 16GB | 负载增加时继续扩容 |
| CPU | 按低负载实测裁剪 | 8 vCPU | CI/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'] | 启用 TLS | true |
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.rb和gitlab-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'] | 25 | 5 | 约 200MB |
prometheus_monitoring | true | false | 约 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 错误 的排查思路:
free -m查内存与 swap,确认是否发生资源耗尽sudo gitlab-ctl status看哪个组件挂了sudo gitlab-ctl tail puma看 Puma 日志- 如果是刚装完或刚重启,等 2-3 分钟再试(GitLab 启动慢是正常的)
- 实在内存不够就按上面的调优配置减负
注意无法发送邮件:检查 SMTP 配置是否正确,可以用
sudo gitlab-rails console进去手动发一封测试邮件排查:Notify.test_email('test@example.com', '测试', '测试邮件内容').deliver_now
注意性能问题:用
top或htop看资源占用,大概率是内存吃紧。如果 Sidekiq 占用过高,降低并发数;如果 Puma 占用过高,减少 worker 数量。调完别忘了sudo gitlab-ctl reconfigure。
写在最后
自建 GitLab 的过程并不复杂,真正的挑战在于后期的维护和调优。建议上线前做好监控和告警,定期检查备份是否可用(别等到要恢复的时候才发现备份是坏的),升级前仔细看 changelog。把这些习惯养成了,GitLab 就能稳稳地为团队服务。更多配置细节可参考 GitLab 官方文档。
Footnotes
-
GitLab 当前文档把 8 vCPU、16GB 内存作为单节点基线;内存受限环境至少 8GB。存储还要包含应用、数据库和全部仓库数据。详见 GitLab installation requirements。 ↩