1. GitLab部署概述
GitLab作为当前最流行的开源代码托管平台之一,已经成为开发团队不可或缺的协作工具。不同于简单的代码仓库,GitLab提供了一整套完整的DevOps解决方案,包括代码管理、CI/CD流水线、项目管理、安全扫描等功能。根据2023年Stack Overflow开发者调查,超过65%的企业选择GitLab作为其内部代码管理平台。
选择自建GitLab而非使用SaaS版本(GitLab.com)的主要原因包括:
- 数据主权要求:某些行业(如金融、医疗)对代码存储有严格的合规要求
- 定制化需求:需要深度集成内部系统或修改工作流程
- 性能考量:大型代码库在本地网络环境访问更快速
- 成本控制:超过一定用户规模后,自建方案更具经济性
2. 部署环境准备
2.1 硬件需求评估
对于中小型团队(5-50人),建议配置:
- CPU:4核以上(推荐8核)
- 内存:8GB起步(推荐16GB)
- 存储:至少100GB SSD(代码仓库)+ 独立数据盘(用于备份)
- 网络:1Gbps内网带宽
注意:GitLab对I/O性能敏感,务必使用SSD存储。机械硬盘会导致响应时间显著增加。
2.2 操作系统选择
官方支持的主流Linux发行版:
- Ubuntu LTS(推荐20.04/22.04)
- CentOS/RHEL 7+
- Debian 10+
以Ubuntu 22.04为例,基础环境配置:
bash复制# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install -y curl openssh-server ca-certificates postfix
2.3 防火墙配置
确保以下端口开放:
- HTTP: 80/TCP
- HTTPS: 443/TCP
- SSH: 22/TCP
- SMTP: 25/TCP(如启用邮件通知)
bash复制sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
3. 安装方式对比与选择
3.1 Omnibus包安装(推荐)
官方提供的全能包方案,包含所有依赖:
bash复制# 添加GitLab仓库
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
# 安装社区版(CE)
sudo EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ce
优势:
- 一键式安装,依赖自动解决
- 内置Nginx、PostgreSQL、Redis等组件
- 官方维护升级路径
3.2 Docker部署方案
适合需要快速测试或资源隔离的场景:
bash复制docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
注意事项:
- 数据卷必须持久化,否则重启后数据丢失
- 资源消耗较大,建议分配至少4GB内存给容器
- 性能略低于原生安装
3.3 离线安装方案
在内网环境下的安装步骤:
- 在有外网机器下载离线包:
bash复制
wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/focal/gitlab-ce_16.2.1-ce.0_amd64.deb/download.deb - 传输到目标服务器后安装:
bash复制sudo dpkg -i gitlab-ce_16.2.1-ce.0_amd64.deb - 手动解决依赖:
bash复制sudo apt-get install -f
4. 初始配置详解
4.1 关键配置文件修改
主配置文件路径:/etc/gitlab/gitlab.rb
必须修改的核心参数:
ruby复制external_url 'https://gitlab.example.com' # 必须与访问URL一致
# 邮件服务配置(以Gmail为例)
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "your_email@gmail.com"
gitlab_rails['smtp_password'] = "your_password"
gitlab_rails['smtp_domain'] = "gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'your_email@gmail.com'
应用配置变更:
bash复制sudo gitlab-ctl reconfigure
4.2 管理员账户初始化
首次访问Web界面(https://your-server-ip)时:
- 设置root用户密码(12位以上,含特殊字符)
- 登录后立即启用双因素认证(2FA)
- 创建至少一个备用管理员账户
4.3 备份策略配置
自动备份设置:
ruby复制# /etc/gitlab/gitlab.rb 中添加
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
gitlab_rails['backup_keep_time'] = 604800 # 保留7天
手动执行备份:
bash复制sudo gitlab-backup create
备份文件包含:
- 数据库(PostgreSQL)
- 仓库数据
- 附件
- CI日志
- 配置(需单独备份/etc/gitlab)
5. 日常运维与问题排查
5.1 服务管理命令
常用操作命令:
bash复制# 启动所有服务
sudo gitlab-ctl start
# 停止所有服务
sudo gitlab-ctl stop
# 重启单个组件(如sidekiq)
sudo gitlab-ctl restart sidekiq
# 查看服务状态
sudo gitlab-ctl status
# 检查日志(实时查看)
sudo gitlab-ctl tail
5.2 常见问题解决
问题1:账户待审批(Account Pending Approval)
- 现象:用户注册后无法登录,提示"your account is pending approval"
- 解决方案:
- 管理员登录后进入"Admin Area -> Users"
- 找到相应用户点击"Approve"
- 或关闭审批要求:
Admin Area -> Settings -> General -> Sign-up restrictions取消勾选"Require admin approval"
问题2:API认证失败(Login failed. Check API token or GitLab version)
- 可能原因:
- API令牌过期/被撤销
- GitLab版本不兼容
- 网络策略阻止访问
- 排查步骤:
- 重新生成访问令牌
- 检查GitLab版本是否匹配客户端要求
- 测试网络连通性:
curl -v https://gitlab.example.com/api/v4/version
问题3:SSH密钥认证失败
- 典型错误:
bash复制
git@gitlab.example.com: Permission denied (publickey). - 解决流程:
- 确认本地密钥已添加到ssh-agent:
bash复制
ssh-add -l - 检查GitLab中的公钥配置:
- 用户设置 -> SSH Keys
- 确保公钥完整粘贴(包括开头的
ssh-rsa和结尾的注释)
- 测试连接:
bash复制
ssh -T git@gitlab.example.com
- 确认本地密钥已添加到ssh-agent:
5.3 性能优化建议
数据库调优参数示例:
ruby复制# /etc/gitlab/gitlab.rb
postgresql['shared_buffers'] = "4GB" # 建议为总内存的25%
postgresql['work_mem'] = "16MB" # 复杂查询用内存
postgresql['maintenance_work_mem'] = "512MB" # 维护操作内存
Sidekiq并发调整:
ruby复制sidekiq['max_concurrency'] = 20 # 默认10,根据CPU核心数调整
sidekiq['min_concurrency'] = 5
6. 高级配置与集成
6.1 与IDE集成(IntelliJ IDEA)
- 安装GitLab插件:
- Preferences -> Plugins -> 搜索"GitLab Projects"
- 配置连接:
- 添加GitLab服务器(URL + 个人访问令牌)
- 克隆项目:
- 通过"Get from VCS"选择GitLab仓库
- 提交代码:
- 提交时自动触发CI流水线(需.gitlab-ci.yml配置)
6.2 CI/CD流水线配置
基础.gitlab-ci.yml示例:
yaml复制stages:
- build
- test
- deploy
build_job:
stage: build
script:
- echo "Compiling the code..."
- make build
artifacts:
paths:
- bin/
test_job:
stage: test
script:
- echo "Running tests..."
- make test
deploy_prod:
stage: deploy
script:
- echo "Deploying to production..."
- scp bin/* prod-server:/opt/app
only:
- main
6.3 监控与日志分析
Prometheus监控集成:
ruby复制# /etc/gitlab/gitlab.rb
prometheus['enable'] = true
prometheus['listen_address'] = 'localhost:9090'
grafana['enable'] = true
关键监控指标:
- HTTP请求延迟(gitlab_rails_http_requests_duration_seconds)
- Sidekiq队列积压(sidekiq_enqueued_jobs)
- 仓库存储使用量(gitlab_repository_storage_usage_bytes)
日志分析建议:
bash复制# 查找高延迟请求
sudo grep -E 'duration=[0-9]{4,}' /var/log/gitlab/nginx/gitlab_access.log
# 监控Sidekiq异常
sudo tail -f /var/log/gitlab/gitlab-rails/sidekiq.log | grep -i error
7. 安全加固措施
7.1 基础安全配置
强制HTTPS:
ruby复制# /etc/gitlab/gitlab.rb
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
密码策略:
ruby复制gitlab_rails['password_authentication_enabled_for_web'] = true
gitlab_rails['password_min_length'] = 12
gitlab_rails['password_require_number'] = true
gitlab_rails['password_require_symbol'] = true
7.2 定期维护任务
- 版本升级:
bash复制# 查看可用更新 sudo apt update sudo apt list --upgradable # 执行升级(先备份) sudo apt install gitlab-ce sudo gitlab-ctl reconfigure - 仓库整理:
- 定期执行仓库压缩:
bash复制sudo gitlab-rake gitlab:cleanup:project_uploads sudo gitlab-rake gitlab:cleanup:orphan_job_artifact_files
- 定期执行仓库压缩:
- 监控磁盘使用:
bash复制sudo gitlab-rake gitlab:artifacts:check sudo gitlab-rake gitlab:lfs:check
7.3 灾备恢复演练
恢复流程测试:
- 准备新服务器(相同版本OS)
- 安装相同版本GitLab:
bash复制sudo apt install gitlab-ce=<version> - 恢复备份:
bash复制# 复制备份文件(如_2023_08_01_16.2.1_gitlab_backup.tar) sudo cp /var/opt/gitlab/backups/_2023_08_01_16.2.1_gitlab_backup.tar /var/opt/gitlab/backups/ # 停止相关服务 sudo gitlab-ctl stop unicorn sudo gitlab-ctl stop sidekiq # 执行恢复(会要求输入备份密码) sudo gitlab-backup restore BACKUP=_2023_08_01_16.2.1 # 恢复配置文件 sudo cp /etc/gitlab/gitlab-secrets.json /etc/gitlab/ sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/ # 重新配置 sudo gitlab-ctl reconfigure sudo gitlab-ctl restart
在实际生产环境中,我强烈建议将GitLab部署在负载均衡器后方,并配置至少一个只读副本(Geo节点)以实现高可用。对于超过100人的开发团队,应考虑将PostgreSQL数据库独立部署以提升性能。
