在 Ubuntu VPS 上自托管 GitLab CE 安装

GitLab.com 对小团队来说是免费的,但在您自己的 VPS 上托管 GitLab 社区版(Community Edition) 可以完全控制敏感代码库、支持离线工作,并消除按座位收费的成本。GitLab CE 包含 Git 仓库托管、CI/CD 管道、问题跟踪、wiki 和容器注册表,全部基于开源。对于需要完全数据隐私的团队、有合规要求的企业以及希望避免云服务月费上涨的开发者而言,自托管 GitLab 是理想选择。

系统要求和硬件规划

成功部署 GitLab CE 首先需要确保 VPS 配置符合最低要求。GitLab 是一个功能丰富的应用,包含众多后台服务(web 服务器、数据库、后台作业处理等),因此硬件规划至关重要。

在实际部署中,8GB RAM 是生产环境的理想起点。如果团队规模较小且主要进行轻量级开发,4GB 配置也可以接受,但需要禁用一些非关键服务(如 Elasticsearch、Prometheus 和 Grafana)来保持系统稳定性。

内存管理建议:在 4–6GB VPS 上,安装完成后立即优化内存配置。通过在 gitlab.rb 中禁用 Elasticsearch、Grafana 和 AlertManager,可以节省超过 1GB 的内存。调整后运行 sudo gitlab-ctl reconfigure 使设置生效。定期监控内存使用情况,使用 free -h 命令检查。

预安装检查和准备工作

在开始安装前,需要进行几个重要的准备步骤。首先确保系统包已更新到最新版本,这不仅能获得安全补丁,还能避免依赖包版本冲突。其次,检查网络连接和 DNS 解析,确保 VPS 能够访问 GitLab 的官方软件库和 Let's Encrypt 证书服务。最后,验证域名 DNS 指向是否正确配置。

获取 root 或 sudo 权限是必要的,因为 GitLab 的安装和配置需要系统级别的访问权限。建议在开始前关闭不必要的防火墙规则,或至少开放 HTTP(80)和 HTTPS(443)端口。如果使用 SSH 密钥登录,确保 SSH 服务处于正常运行状态,因为后续可能需要通过 SSH 访问 VPS。

第一步:安装系统依赖和准备

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl openssh-server ca-certificates tzdata perl

这个命令完成两个任务:首先更新包管理器的索引列表,确保能获取到最新的软件包版本。openssh-server 确保 SSH 服务可用,ca-certificates 用于验证 HTTPS 连接的 SSL 证书。tzdata 提供时区数据,重要的是 GitLab 内部的日志和备份时间戳需要准确的时区信息。

第二步:添加 GitLab 官方软件库

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

该脚本从 GitLab 官方源下载配置信息,自动将 GitLab 软件库添加到系统包管理器。这确保安装的 GitLab 版本是官方提供、更新最及时、安全补丁最全的版本。直接从官方源安装(而不是从旧版 apt 缓存)能保证获得最新的特性和安全更新。

第三步:设置域名并安装 GitLab CE

sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ce

在执行此命令前,必须将 gitlab.example.com 替换为您实际的域名,并确保该域名的 DNS A 记录已指向 VPS 的 IP 地址。设置 HTTPS URL 会自动触发 Let's Encrypt 免费 SSL 证书的申请和安装。整个安装过程通常需要 10–15 分钟,期间系统会下载 GitLab 包、初始化数据库和配置所有必要的服务。

如果安装失败,最常见的原因是 DNS 解析问题。可以通过 nslookup gitlab.example.com 验证域名是否正确指向 VPS IP。如果 DNS 尚未生效,可以暂时使用 HTTP(不使用 EXTERNAL_URL 中的 https),安装完成后再配置 SSL。

第四步:获取初始 Root 管理员密码

sudo cat /etc/gitlab/initial_root_password
# 输出会显示一个随机生成的密码
# 该密码有效期仅为 24 小时

GitLab 在安装完成后会自动生成一个随机的 root 用户密码。这个密码保存在 /etc/gitlab/initial_root_password 文件中,有效期只有 24 小时,过期后无法再次查看,因此需要立即记录。使用用户名 root 和此密码登录 GitLab Web 界面,登录成功后应立即修改密码为更强安全的密码,建议使用至少 16 字符、包含大小写字母、数字和特殊符号的复杂密码。

第五步:配置 GitLab 服务参数

sudo nano /etc/gitlab/gitlab.rb

这个文件是 GitLab 的主配置文件,包含所有系统级别的设置。编辑此文件需要管理员权限。配置项众多,下面列出最常用的关键配置:

# 基本设置 — GitLab 访问地址
external_url 'https://gitlab.example.com'

# SMTP 邮件配置 (使用 Gmail 应用专用密码示例)
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "your-app-specific-password"
gitlab_rails['smtp_domain'] = "gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = 'GitLab Server'

# 禁用开放注册(如果只允许特定用户访问)
gitlab_rails['gitlab_signup_enabled'] = false

# 备份保留时间(这里设为 7 天)
gitlab_rails['backup_keep_time'] = 604800

# 时区设置(重要)
gitlab_rails['time_zone'] = 'UTC'

配置完成后,需要运行重新配置命令应用所有设置变更:

sudo gitlab-ctl reconfigure

这个命令会重新读取 gitlab.rb 文件,检查配置是否有效,然后重启相关服务使新配置生效。过程中会输出大量日志信息,最后应显示 "gitlab Reconfigured!" 表示成功。

SMTP 邮件配置详解

GitLab 需要邮件功能来发送账户通知、密码重置邮件和流水线状态通知。如果不配置 SMTP,用户将无法接收到重要的系统通知。常见的邮件服务选项包括:

配置后可以在 GitLab 管理界面测试邮件发送功能。确保邮件能正确发送,否则用户在使用过程中会遇到功能障碍。

第六步:安装 GitLab Runner 用于 CI/CD

GitLab Runner 是负责执行 CI/CD 流水线的代理程序。虽然可以在同一 VPS 上安装,但这会占用相当多的系统资源。对于生产环境,强烈建议在单独的 VPS 上部署 Runner。

# 添加 GitLab Runner 官方软件库
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash

# 安装 GitLab Runner
sudo apt-get install gitlab-runner -y

注册 Runner 与 GitLab 实例连接

安装后需要注册 Runner,使其能与 GitLab 实例进行通信:

# 获取注册令牌的步骤:
# 1. 在浏览器中访问 https://gitlab.example.com/admin/runners
# 2. 点击 "New instance runner" 或 "Register runner"
# 3. 复制显示的 registration token

# 使用 Shell executor 的注册示例
sudo gitlab-runner register \
  --url https://gitlab.example.com \
  --registration-token YOUR_REGISTRATION_TOKEN \
  --executor shell \
  --description "shell-runner-01"

如果更倾向于使用 Docker 容器来隔离 CI/CD 作业(推荐做法),可以使用 Docker executor:

sudo gitlab-runner register \
  --url https://gitlab.example.com \
  --registration-token YOUR_TOKEN \
  --executor docker \
  --docker-image alpine:latest \
  --description "docker-runner-01"

Docker executor 提供更好的隔离性和可重现性,每个作业都在独立的容器中运行,避免了全局环境污染。这对于运行多个项目、处理不同的依赖版本特别有用。

CI/CD 流水线配置示例

在 GitLab 项目中创建 .gitlab-ci.yml 文件来定义自动化流程。以下是一个完整的项目构建、测试和部署流程示例:

stages:
  - build
  - test
  - deploy

variables:
  NODE_ENV: "production"

build_job:
  stage: build
  image: node:18-alpine
  script:
    - echo "开始构建..."
    - npm install
    - npm run build
    - echo "构建完成"
  artifacts:
    paths:
      - dist/
    expire_in: 1 hour
  only:
    - main
    - develop

test_job:
  stage: test
  image: node:18-alpine
  script:
    - npm install
    - npm test
    - echo "所有测试通过"
  coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
  only:
    - merge_requests

deploy_job:
  stage: deploy
  image: alpine:latest
  script:
    - apk add --no-cache openssh-client rsync
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo "$DEPLOY_KEY" > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
    - rsync -avz dist/ $DEPLOY_USER@$DEPLOY_HOST:/var/www/app/
  only:
    - main
  when: manual

这个示例定义了三个阶段的流程:

备份和灾难恢复

定期备份是运维工作中最关键的环节。失去代码库备份可能导致无法恢复的数据损失。GitLab 提供了简单的备份工具:

# 手动创建备份
sudo gitlab-backup create

# 查看备份文件列表
ls -lh /var/opt/gitlab/backups/

# 设置每天凌晨 2 点自动备份的 cron 任务
(crontab -l; echo "0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1") | crontab -

备份过程中 GitLab 会创建一个包含所有数据库、文件和配置的压缩档案,文件名格式为 TIMESTAMP_gitlab_backup.tar。根据数据库大小,备份可能需要数分钟到数十分钟。

备份完成后,应该将备份文件复制到远程存储(如 AWS S3、NAS 或另一个服务器),这样即使主 VPS 故障也能恢复数据。可以使用 rsync 或 s3cmd 自动同步备份:

# 示例:使用 rsync 同步到 NAS 服务器
0 3 * * * rsync -avz /var/opt/gitlab/backups/ backup-user@backup-server:/backups/gitlab/ --delete

关键备份文件:除了 /var/opt/gitlab/backups/ 目录外,必须单独备份 /etc/gitlab/gitlab-secrets.json 和 /etc/gitlab/gitlab.rb 文件。gitlab-secrets.json 包含加密密钥,没有它即使有备份归档也无法解密数据库内容。这两个文件应该与备份文件一起保存到安全位置,最好使用不同的存储介质。

监控和日志查看

定期检查 GitLab 服务状态和日志是及时发现问题的方法。GitLab 提供了一套便利的命令行工具:

# 查看所有 GitLab 服务的状态
sudo gitlab-ctl status

# 重启 GitLab 服务
sudo gitlab-ctl restart

# 查看特定服务的实时日志
sudo gitlab-ctl tail postgresql
sudo gitlab-ctl tail nginx
sudo gitlab-ctl tail gitaly

# 检查内存和 CPU 使用情况
sudo gitlab-ctl status | grep -E "(memory|process)"

# 进入交互式 Ruby 控制台调试
sudo gitlab-rails console

日志对于故障排查至关重要。常见的问题包括数据库连接错误、SMTP 邮件发送失败、SSH 密钥权限问题等。通过查看日志可以快速定位问题根源。

内存优化和性能调整

在资源有限的 VPS 上运行 GitLab 需要仔细调整配置以获得最佳性能。以下是针对 4–6GB RAM 的 VPS 的优化建议:

# 在 /etc/gitlab/gitlab.rb 中添加或修改以下参数:

# 禁用 Prometheus 监控(节省约 200 MB)
prometheus_monitoring['enable'] = false

# 禁用 Grafana 仪表板(节省约 100 MB)
grafana['enable'] = false

# 禁用 AlertManager 告警系统
alertmanager['enable'] = false

# 禁用 Node Exporter(Prometheus 依赖)
node_exporter['enable'] = false

# 减少 Puma Web 服务器的工作进程数(默认为 4)
puma['worker_processes'] = 2
puma['min_threads'] = 2
puma['max_threads'] = 4

# 减少 Sidekiq 后台作业处理的并发数
sidekiq['concurrency'] = 5
sidekiq['max_retries'] = 3

# 禁用 GitLab Pages(如果不需要)
pages['enable'] = false

# 启用数据库连接池优化
gitlab_rails['db_pool'] = 10

应用这些优化后,需要重新配置 GitLab:

sudo gitlab-ctl reconfigure && sudo gitlab-ctl restart

重启后系统内存占用会明显减少。可以使用 free -h 和 top 命令监控内存使用情况,确保有充足的空闲内存(建议保持至少 500 MB 的空闲内存)。

安全加固建议

在生产环境中部署 GitLab 需要考虑多方面的安全因素。首先,启用防火墙并只开放必要的端口(HTTP 80、HTTPS 443 和 SSH 22),如果不需要 SSH git 访问可以关闭端口 22。其次,定期更新系统包和 GitLab 本身以获得最新安全补丁。启用 GitLab 的两因素认证(2FA)功能,要求管理员和所有用户使用强密码。考虑配置 LDAP/Active Directory 集成进行企业级身份验证。定期审计用户权限,删除不再活跃的账户。

另外,配置 SSH 密钥是比密码更安全的认证方式。在 /etc/ssh/sshd_config 中禁用密码登录,仅允许 SSH 密钥认证。配置 fail2ban 防止暴力破解攻击。如果 GitLab 实例公开在互联网上,考虑在前面配置 WAF(Web 应用防火墙)来阻止恶意流量。

常见问题排查

问题:安装时 SSL 证书申请失败
原因通常是 DNS 解析问题。确保域名的 DNS A 记录已指向 VPS IP,可能需要等待 DNS 传播(最长 48 小时)。使用 nslookup gitlab.example.com 验证。如果 DNS 尚未生效,可以临时使用 HTTP 安装,稍后再配置 HTTPS。

问题:启动后出现 502 Bad Gateway 错误
通常表示 Puma Web 服务器没有正常启动或 PostgreSQL 数据库不可用。运行 sudo gitlab-ctl status 检查各个服务的状态。查看日志 sudo gitlab-ctl tail 了解详细错误信息。如果是内存不足导致的,尝试减少工作进程数。

问题:邮件无法发送
首先检查 SMTP 配置是否正确,特别是用户名密码是否准确。尝试在 GitLab 控制台测试邮件发送。确保 VPS 能够访问邮件服务器(检查防火墙规则)。查看 mail.log 或 /var/log/syslog 了解具体错误。

版本更新和维护

GitLab 通常每月 22 号发布新版本。虽然不需要每个版本都升级,但建议至少每季度更新一次以获得重要的安全补丁和功能改进。升级过程相对简单:

# 升级前先创建备份
sudo gitlab-backup create

# 升级 GitLab
sudo apt update
sudo apt install gitlab-ce

# 系统会自动处理数据库迁移
# 升级完成后可验证
sudo gitlab-ctl status

升级通常会导致短暂的服务中断(5–10 分钟),建议在非工作时段进行。升级前也应该查看 GitLab 发行说明,了解是否有重大变更需要手工调整。

需要为 GitLab 自托管准备 VPS 吗?

AsiaGB VPS 提供 8GB RAM 及以上配置,完全拥有 root 权限,完美适合运行 GitLab CE。起价仅需 500 泰铢/月。SSD 存储、99% 正常运行时间保证,支持快速安装和迁移。

查看 VPS 方案