GitLab CE 指南:轻松自托管你的代码仓库
在现代软件开发流程中,版本控制系统(VCS)是不可或缺的基石。Git 作为目前最流行、最强大的分布式版本控制系统,被全球数百万开发者广泛使用。而 GitLab,则是在 Git 的基础上构建的一个完整的 DevOps 平台,它不仅提供了强大的代码仓库管理功能,还集成了项目管理、CI/CD(持续集成/持续部署)、安全扫描、监控等一系列开发运维所需的功能。
GitLab 提供了两种主要的版本:企业版(Enterprise Edition, EE)和社区版(Community Edition, CE)。GitLab EE 包含所有 CE 的功能,并额外提供了一些面向大型企业的高级特性和官方支持,是付费产品。而 GitLab CE 则是完全免费且开源的,它包含了绝大多数开发团队日常所需的核心功能,并且允许用户 自托管(Self-Hosted)。
为什么要选择自托管 GitLab CE?
虽然 GitLab.com 提供了便捷的 SaaS 服务,但自托管 GitLab CE 具有其独特的优势:
- 数据完全掌控: 你的代码、项目数据、用户信息等所有资产都存储在你自己的服务器上,不受第三方服务提供商的政策限制,拥有最高级别的数据主权和隐私保护。这对于有严格数据合规性要求的组织尤其重要。
- 高度定制化: 你可以根据自身需求自由配置服务器资源、网络环境、存储方案,甚至可以修改 GitLab CE 的源代码(遵循其开源协议)以满足特殊需求。
- 成本效益(潜在): 对于已经拥有服务器资源或用户量较大的团队,相比于付费的 SaaS 服务或 GitLab EE,自托管 CE 在长期来看可能更具成本效益,因为它免除了许可证费用。当然,需要考虑硬件和运维人力成本。
- 网络隔离与安全: 可以将 GitLab CE 部署在内部网络中,与公网隔离,进一步增强代码和项目的安全性,降低外部攻击风险。
- 不受平台限制: 无需担心 SaaS 平台可能出现的服务中断、价格调整或功能变更对你的工作流程产生影响。
当然,自托管也意味着你需要承担服务器的购买/租赁、部署、配置、维护、备份、升级和安全防护等责任。但这正是本指南将要详细阐述的内容,旨在帮助你轻松驾驭 GitLab CE 的自托管之旅。
一、 准备工作:环境与要求
在开始安装 GitLab CE 之前,你需要准备好合适的运行环境。
-
服务器硬件:
- CPU: 官方建议至少 4 核(推荐 8 核以获得更好性能),这是支持少量并发用户的基本要求。对于更大规模的团队(如数百用户),需要更多核心。
- 内存 (RAM): 官方建议至少 8 GB RAM(推荐 16 GB RAM)。这是运行 GitLab 所有组件(包括 PostgreSQL, Redis, Puma/Unicorn, Sidekiq 等)的 最低要求。实际内存需求会随用户数、项目复杂度、CI/CD 使用频率等因素显著增加。内存不足是 GitLab 性能问题最常见的原因之一。
- 存储空间: 初始安装大约需要 2.5 GB 的空间。但你的代码仓库、CI/CD 产生的构建物 (Artifacts)、容器镜像库等会持续消耗大量空间。建议至少准备 50 GB 的可用空间,并根据预估的代码量和使用情况规划,推荐使用 SSD 以获得更好的 I/O 性能。考虑使用逻辑卷管理(LVM)以便后续灵活扩容。
- 操作系统: GitLab CE 官方推荐并主要支持以下 Linux 发行版(64位):
- Ubuntu (推荐 LTS 版本, 如 20.04, 22.04)
- Debian (推荐稳定版)
- CentOS / RHEL (推荐 7.x 或兼容版本如 Rocky Linux, AlmaLinux 8.x)
- openSUSE Leap
-
网络配置:
- 静态 IP 地址或固定域名: 服务器需要有一个固定的 IP 地址或一个可以通过 DNS 解析的域名,以便用户和其他服务能够稳定地访问 GitLab 实例。
- 防火墙规则: 需要配置防火墙,至少允许以下端口的入站连接:
80
(HTTP): 用于初始访问和 Let’s Encrypt 证书验证(如果使用)。443
(HTTPS): 用于安全的 Web 访问,是推荐的主要访问方式。22
(SSH): 用于 Git 通过 SSH 协议进行代码操作,以及服务器远程管理。你也可以为 GitLab 配置一个非标准的 SSH 端口。
- DNS 解析: 如果你打算使用域名访问 GitLab,确保该域名已正确配置 A 记录(或 AAAA 记录)指向你服务器的公网 IP 地址。
-
邮件服务 (SMTP): GitLab 需要发送邮件用于用户注册确认、密码重置、通知等。你需要准备一个 SMTP 服务器的信息(地址、端口、用户名、密码、认证方式),可以是公司自建的邮件服务器,也可以是第三方邮件服务提供商(如 Gmail, SendGrid, Mailgun 等)。
-
基础软件: 在安装 GitLab CE 之前,确保系统已安装一些基础工具,如
curl
,openssh-server
,ca-certificates
。某些系统可能还需要安装邮件发送代理(如postfix
或sendmail
),尽管 GitLab Omnibus 包通常会处理邮件发送,但有一个本地 MTA 有时能简化配置。
二、 安装 GitLab CE:推荐使用 Omnibus 包
GitLab 官方强烈推荐使用 Omnibus 包进行安装。这是一个包含了 GitLab 及其所有依赖项(Nginx, PostgreSQL, Redis, Sidekiq, Puma 等)的预编译软件包,极大地简化了安装和配置过程。
以下以 Ubuntu 20.04/22.04 LTS 为例说明安装步骤(其他支持的系统类似,只需将 apt
替换为相应的包管理器命令,如 yum
或 zypper
):
-
更新系统并安装依赖:
bash
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl openssh-server ca-certificates tzdata perl
# 可选:安装 Postfix 用于邮件发送(如果不想配置外部 SMTP,Postfix 是个简单选择)
# sudo apt install -y postfix
# 在 Postfix 配置界面,通常选择 'Internet Site',并设置系统邮件名称为你的 GitLab 域名。 -
添加 GitLab 官方软件源:
GitLab 提供了一个脚本来帮助添加其官方 APT/YUM 仓库。
bash
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
# 对于 CentOS/RHEL 系统,使用 script.rpm.sh
# curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash -
安装 GitLab CE 包:
执行安装命令。这会下载并安装最新稳定版的 GitLab CE。
bash
sudo apt install gitlab-ce
# 对于 CentOS/RHEL 系统
# sudo yum install gitlab-ce
这个过程可能需要一些时间,因为它会下载几百兆的软件包并解压。
安装完成后,GitLab CE 的所有文件默认位于 /opt/gitlab/
目录下,配置文件位于 /etc/gitlab/gitlab.rb
,日志文件位于 /var/log/gitlab/
下的各个子目录,数据(仓库、数据库等)则存储在 /var/opt/gitlab/
下。
三、 初始配置:让 GitLab 跑起来
安装完成后,最重要的一步是配置 GitLab 的访问 URL。
-
编辑主配置文件:
使用你喜欢的文本编辑器(如nano
,vim
)打开/etc/gitlab/gitlab.rb
文件。
bash
sudo nano /etc/gitlab/gitlab.rb -
设置
external_url
:
找到external_url
这一行(可能被注释掉了),将其修改为你计划用于访问 GitLab 的 URL。强烈建议使用 HTTPS。- 如果你有域名
gitlab.example.com
并打算使用 HTTPS:
ruby
external_url 'https://gitlab.example.com' - 如果你暂时只使用 IP 地址
192.168.1.100
并且先用 HTTP(不推荐生产环境):
ruby
external_url 'http://192.168.1.100'
注意: 这个 URL 非常重要,GitLab 会用它来生成仓库克隆地址、邮件中的链接等。请确保设置正确。
- 如果你有域名
-
(可选)配置 Let’s Encrypt 自动获取 SSL 证书:
如果你设置了external_url
为https://...
并且使用的是一个公网可访问的域名,GitLab Omnibus 包可以自动为你申请和续签 Let’s Encrypt 免费 SSL 证书。确保以下配置被启用(取消注释并设为true
):
ruby
letsencrypt['enable'] = true
# 可选:设置接收 Let's Encrypt 通知的邮箱
# letsencrypt['contact_emails'] = ['[email protected]']
# 注意:确保服务器的 80 端口对公网开放,Let's Encrypt 需要通过 HTTP-01 方式验证域名所有权。
如果你的服务器在内网,或者使用自己的 SSL 证书,则需要手动配置 Nginx 的 SSL 证书路径(参考gitlab.rb
文件中的nginx['ssl_certificate']
和nginx['ssl_certificate_key']
配置项)。 -
应用配置并启动 GitLab:
保存/etc/gitlab/gitlab.rb
文件后,运行以下命令。这个命令会读取配置文件,生成 GitLab 各个组件所需的实际配置文件,并(重新)启动所有服务。
bash
sudo gitlab-ctl reconfigure
首次运行reconfigure
可能需要几分钟时间,因为它需要设置数据库、编译资源等。后续修改配置后也需要运行此命令。 -
访问 GitLab 并设置初始密码:
reconfigure
成功完成后,在浏览器中访问你设置的external_url
。你应该能看到 GitLab 的登录页面。- 初始管理员账号: 用户名为
root
。 - 设置密码: 首次访问时,系统通常会要求你为
root
用户设置一个新密码。按照提示操作即可。如果未提示,或者忘记了密码,可以通过命令行重置(参考 GitLab 官方文档)。
- 初始管理员账号: 用户名为
至此,你的 GitLab CE 实例已经基本运行起来了!你可以使用 root
账号登录,开始探索 GitLab 的世界。
四、 核心功能与基本使用
登录后,你可以开始使用 GitLab 的核心功能:
- 用户管理: 在 Admin Area (管理员区域,通常通过顶部导航栏的扳手图标进入) -> Overview -> Users 中,你可以创建新用户、管理现有用户、设置用户权限等。对于私有实例,建议在 Admin Area -> Settings -> General -> Sign-up restrictions 中禁用用户注册,改为管理员手动创建账号。
- 群组 (Groups): 用于组织项目和管理成员权限。可以创建群组,将用户添加到群组,并赋予不同的角色(Guest, Reporter, Developer, Maintainer, Owner)。项目可以属于用户个人,也可以属于群组。
- 项目 (Projects): 这是代码仓库的核心。你可以创建新项目(空的,或从模板创建,或导入现有仓库),或者 Fork 其他项目。在项目页面,你可以:
- 克隆仓库: 获取仓库的 HTTPS 或 SSH 克隆地址。
- 代码浏览: 查看文件、提交历史、分支、标签。
- Issue 跟踪: 创建、分配、讨论和管理任务、Bug 或功能请求。
- 合并请求 (Merge Requests, MRs): 这是代码审查和协作的核心流程。开发者在自己的分支上工作,完成后创建 MR 请求将代码合并回主分支(如
main
或master
),Maintainer 可以审查代码、评论、批准并合并。 - CI/CD Pipelines: 配置
.gitlab-ci.yml
文件定义自动化构建、测试和部署流程。 - Wiki: 编写项目文档。
- Settings: 配置项目相关的各种选项,如成员权限、仓库设置、CI/CD 变量、集成等。
五、 关键配置与维护
自托管意味着你需要关注实例的长期健康运行。
-
邮件 (SMTP) 配置(如果初始未配):
如果 GitLab 需要发送邮件(强烈建议),你需要配置 SMTP。编辑/etc/gitlab/gitlab.rb
,找到gitlab_rails['smtp_enable']
相关部分,取消注释并填入你的 SMTP 服务器信息:
“`ruby
gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “smtp.example.com”
gitlab_rails[‘smtp_port’] = 587
gitlab_rails[‘smtp_user_name’] = “your_smtp_username”
gitlab_rails[‘smtp_password’] = “your_smtp_password”
gitlab_rails[‘smtp_domain’] = “example.com” # Usually your email domain
gitlab_rails[‘smtp_authentication’] = “login” # Or ‘plain’, ‘cram_md5’
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_tls’] = false # Set to true if using SMTPS (usually port 465)Set the ‘From’ address for emails sent by GitLab
gitlab_rails[‘gitlab_email_from’] = ‘[email protected]’
gitlab_rails[‘gitlab_email_reply_to’] = ‘[email protected]’
修改后,务必运行 `sudo gitlab-ctl reconfigure`。之后可以通过 Rails 控制台测试邮件发送:
bash
sudo gitlab-rails console -e production在控制台中输入:
Notify.test_email(‘[email protected]’, ‘Email Subject’, ‘Email Body’).deliver_now
退出控制台: exit
“`
-
备份与恢复:
这是自托管最重要的任务之一! GitLab 提供了内置的备份工具。- 创建备份:
bash
sudo gitlab-backup create
该命令会备份数据库、所有仓库、附件、CI/CD 构建物等。备份文件默认存储在/var/opt/gitlab/backups/
目录下,文件名类似1678886400_2023_03_15_15.8.1-ce_gitlab_backup.tar
。
注意: 这个备份 不包含/etc/gitlab/gitlab.rb
配置文件和 SSL 证书文件(/etc/gitlab/ssl/
)。你需要单独备份这些文件! - 自动化备份: 使用
cron
定时任务定期执行gitlab-backup create
。例如,每天凌晨 2 点执行备份:
crontab
0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1
CRON=1
会抑制命令的正常输出,只在出错时输出。 - 备份策略: 制定合理的备份策略,包括备份频率、保留周期、以及将备份文件复制到远程、安全的存储位置(如另一台服务器、对象存储等)。
- 恢复备份: 恢复是一个更复杂的过程,通常需要在全新的、相同版本的 GitLab 实例上进行。大致步骤如下(请务必参考官方最新文档进行操作!):
- 停止连接数据库的服务:
sudo gitlab-ctl stop puma unicorn sidekiq
- 确保数据库仍在运行:
sudo gitlab-ctl status postgresql
- 执行恢复命令,指定备份文件名(不含
.tar
后缀):sudo gitlab-backup restore BACKUP=timestamp_of_backup
- 恢复
/etc/gitlab/gitlab.rb
和/etc/gitlab/ssl/
文件。 - 重新应用配置并重启:
sudo gitlab-ctl reconfigure
,然后sudo gitlab-ctl start
- 进行健康检查:
sudo gitlab-rake gitlab:check SANITIZE=true
- 停止连接数据库的服务:
- 创建备份:
-
升级 GitLab CE:
GitLab 频繁发布新版本,包含新功能、性能改进和重要的安全修复。保持更新非常重要。- 阅读发布说明: 在升级前,务必查阅你当前版本到目标版本之间的所有版本的发布说明(尤其是 major 版本升级),了解是否有重大变更、弃用功能或特定的升级步骤。
- 备份: 在执行任何升级操作前,务必创建完整备份!
- 升级步骤(以 APT 为例):
bash
# 1. 更新包列表
sudo apt update
# 2. 查看可用版本(可选)
# sudo apt-cache policy gitlab-ce
# 3. 安装指定版本(如果需要)或最新版
# sudo apt install gitlab-ce=<version> 或直接
sudo apt install gitlab-ce
# 4. reconfigure 不会自动运行,升级后通常需要手动运行
# 但升级包有时会自动触发某些迁移,耐心等待安装完成
# 5. 检查状态
sudo gitlab-ctl status
# 6. 如果有必要,根据提示运行 reconfigure 或其他命令
# sudo gitlab-ctl reconfigure
# 7. 有时需要运行数据库迁移等升级后任务
# sudo gitlab-ctl upgrade
# 8. 再次检查状态和功能是否正常 - 逐步升级: 避免跨多个 major 版本直接升级,最好遵循官方推荐的升级路径。
-
监控与日志:
- 日志文件: GitLab 各组件的日志位于
/var/log/gitlab/
下的子目录(如nginx/
,postgresql/
,puma/
,sidekiq/
等)。当出现问题时,这些日志是排查的首要入口。可以使用sudo gitlab-ctl tail <service_name>
实时查看日志。 - 系统资源监控: 使用
top
,htop
,vmstat
,iostat
等工具监控 CPU、内存、磁盘 I/O。GitLab 本身也带有 Prometheus 监控和 Grafana 图表(可在 Admin Area -> Monitoring 中启用和访问),提供对 GitLab 内部性能指标的深入洞察。
- 日志文件: GitLab 各组件的日志位于
六、 安全加固
保护你的代码和数据至关重要。
- 保持更新: 及时应用 GitLab 的安全补丁和版本更新。
- HTTPS 强制: 确保始终使用 HTTPS 访问,可以在
gitlab.rb
中配置 Nginx 强制跳转 HTTP 到 HTTPS。 - 强密码策略与 2FA: 强制用户使用强密码,并鼓励(或强制)启用双因素认证(2FA)。
- SSH 密钥安全: 教育用户妥善保管自己的 SSH 私钥。定期审查部署密钥 (Deploy Keys) 和项目/群组的访问令牌 (Access Tokens)。
- 防火墙精细化: 除了允许必要的端口(80, 443, SSH),阻止所有其他不必要的入站连接。考虑限制 SSH 访问来源 IP。
- 禁用或限制用户注册: 对于内部使用的 GitLab 实例,务必禁用公共注册。
- 定期安全审计: 检查用户权限、项目可见性设置、CI/CD 变量的安全性等。
- 操作系统安全: 保持底层操作系统的安全更新,配置好系统防火墙(如
ufw
或firewalld
)。 - 备份安全: 确保备份文件的存储安全,防止未授权访问。
七、 性能调优与故障排除
- 性能瓶颈: 最常见的瓶颈是内存不足和磁盘 I/O 慢。监控资源使用情况,根据需要增加 RAM 或使用更快的存储(SSD)。
- 调整 Worker 数量: 在
/etc/gitlab/gitlab.rb
中可以调整 Puma (Web 服务器) 和 Sidekiq (后台作业处理器) 的 worker 数量和线程数,以更好地利用 CPU 资源。但这需要根据你的服务器核心数和内存进行仔细调整,并进行测试。参考官方文档中的建议值。 - 数据库调优: 对于大型实例,可能需要调整 PostgreSQL 的配置(如
shared_buffers
,work_mem
)。 - 故障排除工具:
sudo gitlab-ctl status
: 查看所有 GitLab 组件的运行状态。sudo gitlab-ctl tail
: 实时查看所有或指定服务的日志。sudo gitlab-rake gitlab:check SANITIZE=true
: 运行全面的健康检查,检查配置、目录权限、仓库完整性等(SANITIZE=true
会隐藏敏感信息)。sudo gitlab-rails console
: 进入 Rails 控制台,可以执行更高级的诊断和修复操作(需谨慎使用)。- 官方文档与社区: GitLab 拥有非常详尽的官方文档和活跃的社区论坛,是解决问题的宝贵资源。
结语
自托管 GitLab CE 为你和你的团队提供了无与伦比的代码管理控制权、灵活性和数据安全性。虽然它需要投入一定的运维精力,但借助强大的 Omnibus 安装包和丰富的文档资源,整个过程比想象中要容易得多。
通过遵循本指南的步骤,从准备环境、安装配置,到日常使用、备份维护和安全加固,你应该能够成功部署并管理一个稳定、高效的 GitLab CE 实例。记住,持续学习、定期维护、关注安全是保障自托管服务长期健康运行的关键。现在,开启你的 GitLab 自托管之旅,掌控你的代码世界吧!