Linux 服务器部署 GitLab 完整指南
本文记录了在 Linux 服务器上从零部署 GitLab 的完整过程,涵盖安装配置、性能调优、安全加固和日常维护。以 CentOS/RHEL 为例,其他发行版可参考调整。
graph TD
A[系统准备] --> B[安装依赖]
B --> C[配置 GitLab]
C --> D[初始化启动]
D --> E[日常运维]
E --> F[备份与恢复]
E --> G[性能调优]
E --> H[安全加固]
自建 GitLab,值得吗?
团队规模一大,代码托管就成了绕不开的话题。用 GitHub 或 Gitee?私有项目要收费,而且代码放在别人服务器上,有些公司的安全策略不允许。这时候自建一套 GitLab 就成了最务实的选择——代码仓库、CI/CD、项目管理全都有,一个平台搞定。
GitLab CE vs EE 怎么选
很多人一上来就纠结版本,其实对大多数团队来说答案很明确:
| 维度 | CE(社区版) | EE(企业版) |
|---|---|---|
| 价格 | 完全免费 | 免费层可用,高级功能付费 |
| 核心功能 | Git 仓库、CI/CD、Issue、Wiki | 包含 CE 全部功能 |
| 高级功能 | 无 | 高级 CI/CD、审计日志、LDAP 组同步 |
| 安全功能 | 基础 | SAST/DAST 代码扫描、依赖扫描 |
| 技术支持 | 社区支持 | 官方技术支持 |
| 适合场景 | 中小团队、个人项目 | 大型企业、合规要求高的场景 |
[!TIP] 实际上 EE 版本也可以免费使用(不激活 License 就等同于 CE),好处是以后想升级到付费功能时无需重新安装。但如果你确定不需要企业功能,CE 更轻量省心。
下面记录一下在 CentOS 上从零部署 GitLab CE 的完整过程,包括安装后的调优和日常维护,都是实际踩过坑总结出来的。
先确认机器配置够不够
GitLab 是个资源大户,别在 1 核 2G 的小机器上折腾,启动都费劲1。
| 配置项 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| 操作系统 | CentOS 7 / 8 | CentOS 8 Stream | CentOS 7 已 EOL,建议尽快迁移 |
| 内存 | 4GB | 8GB+ | 4G 能跑但会卡,10 人以上团队至少 8G |
| CPU | 2 核 | 4 核+ | CI/CD 用得多的话 CPU 很关键 |
| 磁盘 | 10GB | 50GB+ SSD | 仓库数据增长很快,SSD 对性能有明显提升 |
| 网络 | 稳定连接 | 内网千兆 | 大仓库 clone/push 对带宽有要求 |
[!WARNING] 4G 内存能跑起来,但用着会卡。如果团队超过 10 人同时使用,8G 是起步线。内存不够是 GitLab 502 错误的头号原因。
安装步骤
1. 更新系统,装好依赖
老规矩,装软件之前先把系统包更新到最新,避免一些莫名其妙的兼容性问题:
sudo yum update -y
sudo yum install -y curl policycoreutils-python openssh-server perl
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 构建结果、密码重置等等。先把 Postfix 装上,后面再配 SMTP:
sudo yum install -y postfix
sudo systemctl enable postfix
sudo systemctl start postfix
4. 安装 GitLab
准备工作做完,终于到正题了。添加官方仓库源,然后一条命令安装:
# 添加 GitLab 仓库
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# 安装(替换为你的实际域名或 IP)
sudo EXTERNAL_URL="http://your-gitlab-domain.com" yum install -y gitlab-ce
[!NOTE] 将
your-gitlab-domain.com替换为你的实际域名或服务器 IP 地址。如果只在内网使用,直接填内网 IP 即可。安装过程会比较久——它在后台装 PostgreSQL、Redis、Nginx 等一堆组件,耐心等就好。
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。设好密码之后就可以开始创建项目了。
[!TIP] GitLab 14.0+ 版本会把初始 root 密码写入
/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
[!NOTE] 备份文件默认保存在
/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"
[!IMPORTANT]
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 yum update
sudo yum install gitlab-ce
# 3. 应用配置
sudo gitlab-ctl reconfigure
[!WARNING] 跨大版本升级(比如从 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 速率 — 管理后台 → 设置 → 网络 → 速率限制 — 中
常见问题排查
遇到问题不要慌,大多数情况都是资源不够或配置不对。
[!WARNING] 502 错误 是 GitLab 最常见的问题,排查思路:
free -m查内存——十有八九是内存不够,组件没完全启动sudo gitlab-ctl status看哪个组件挂了sudo gitlab-ctl tail puma看 Puma 日志- 如果是刚装完或刚重启,等 2-3 分钟再试(GitLab 启动慢是正常的)
- 实在内存不够就按上面的调优配置减负
[!NOTE] 无法发送邮件:检查 SMTP 配置是否正确,可以用
sudo gitlab-rails console进去手动发一封测试邮件排查:Notify.test_email('test@example.com', '测试', '测试邮件内容').deliver_now
[!NOTE] 性能问题:用
top或htop看资源占用,大概率是内存吃紧。如果 Sidekiq 占用过高,降低并发数;如果 Puma 占用过高,减少 worker 数量。调完别忘了sudo gitlab-ctl reconfigure。
写在最后
自建 GitLab 的过程并不复杂,真正的挑战在于后期的维护和调优。建议上线前做好监控和告警,定期检查备份是否可用(别等到要恢复的时候才发现备份是坏的),升级前仔细看 changelog。把这些习惯养成了,GitLab 就能稳稳地为团队服务。更多配置细节可参考 GitLab 官方文档。
Footnotes
-
根据 GitLab 官方文档,最低要求 4GB 内存才能正常运行所有组件,推荐 8GB 以上。详见 GitLab installation requirements。 ↩