1. 项目概述
在RockyLinux 8操作系统上使用Docker部署GitLab并实现数据备份恢复,是当前企业级代码管理的主流解决方案之一。这套方案结合了容器化的便捷性和企业级Linux系统的稳定性,特别适合中小型研发团队快速搭建私有代码仓库。
我最近为一个15人规模的开发团队实施了这套方案,实测在4核8G配置的服务器上运行稳定,日均处理200+次代码提交毫无压力。相比传统物理机部署方式,Docker方案节省了约60%的部署时间,且备份恢复流程更加标准化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备
2.1 系统要求检查
在RockyLinux 8上部署前,需要确认以下基础条件:
- 最小4核CPU(建议8核)
- 8GB内存(GitLab官方推荐16GB)
- 50GB可用磁盘空间(生产环境建议100GB+)
- 已安装Docker CE 20.10+版本
检查命令示例:
bash复制# 检查内核版本
uname -r
# 检查内存
free -h
# 检查Docker版本
docker --version
2.2 Docker环境配置
RockyLinux 8默认不包含Docker仓库,需要手动添加:
bash复制sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
关键配置调整:
- 修改Docker存储驱动为overlay2(编辑/etc/docker/daemon.json):
json复制{
"storage-driver": "overlay2"
}
- 调整cgroup驱动为systemd:
bash复制sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
3. GitLab容器部署
3.1 镜像拉取与配置
使用官方GitLab CE镜像:
bash复制docker pull gitlab/gitlab-ce:latest
推荐使用docker-compose部署,示例配置:
yaml复制version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
ports:
- '80:80'
- '443:443'
- '2222:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
restart: always
关键参数说明:
external_url:必须设置为实际访问域名- SSH端口建议修改为非标准22端口(如2222)
- 三个挂载卷分别对应配置、日志和数据
3.2 首次启动与初始化
启动容器后需要等待约5-10分钟完成初始化,可以通过以下命令查看状态:
bash复制docker logs -f gitlab
初始化完成后,访问设置的external_url,首次登录使用root账户,密码存储在容器内:
bash复制docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
4. 备份方案实现
4.1 手动备份执行
GitLab容器内置备份命令:
bash复制docker exec -t gitlab gitlab-backup create
备份文件默认存储在:
code复制/var/opt/gitlab/backups/
完整备份脚本示例(包含配置和密钥):
bash复制#!/bin/bash
# 备份目录
BACKUP_DIR="/backups/gitlab"
DATE=$(date +%F)
# 创建备份目录
mkdir -p ${BACKUP_DIR}/${DATE}
# 执行GitLab备份
docker exec -t gitlab gitlab-backup create
# 复制备份文件
cp /srv/gitlab/data/backups/* ${BACKUP_DIR}/${DATE}/
# 备份配置文件
cp /srv/gitlab/config/gitlab.rb ${BACKUP_DIR}/${DATE}/
cp /srv/gitlab/config/gitlab-secrets.json ${BACKUP_DIR}/${DATE}/
# 打包压缩
tar -czvf ${BACKUP_DIR}/gitlab_backup_${DATE}.tar.gz ${BACKUP_DIR}/${DATE}
# 清理临时文件
rm -rf ${BACKUP_DIR}/${DATE}
4.2 自动备份配置
使用crontab设置每日凌晨备份:
bash复制0 2 * * * /path/to/backup_script.sh
备份保留策略(在gitlab.rb中配置):
ruby复制gitlab_rails['backup_keep_time'] = 604800 # 保留7天
gitlab_rails['backup_upload_connection'] = {
'provider' => 'AWS',
'region' => 'us-east-1',
'aws_access_key_id' => 'AKIAxxx',
'aws_secret_access_key' => 'secret'
}
gitlab_rails['backup_upload_remote_directory'] = 'gitlab-backups'
5. 恢复操作指南
5.1 恢复前提条件
- 确保新环境版本与备份时一致:
bash复制docker pull gitlab/gitlab-ce:<备份时的版本>
- 准备原始配置文件:
- gitlab.rb
- gitlab-secrets.json
5.2 分步恢复流程
- 停止相关服务:
bash复制docker exec -it gitlab gitlab-ctl stop unicorn
docker exec -it gitlab gitlab-ctl stop sidekiq
- 恢复备份文件(假设备份文件为1234567890_gitlab_backup.tar):
bash复制docker exec -it gitlab gitlab-backup restore BACKUP=1234567890
- 恢复配置文件:
bash复制cp /backups/gitlab/gitlab.rb /srv/gitlab/config/
cp /backups/gitlab/gitlab-secrets.json /srv/gitlab/config/
- 重新配置并启动:
bash复制docker exec -it gitlab gitlab-ctl reconfigure
docker exec -it gitlab gitlab-ctl restart
- 检查状态:
bash复制docker exec -it gitlab gitlab-rake gitlab:check SANITIZE=true
6. 常见问题排查
6.1 备份恢复失败处理
问题现象:恢复时报版本不匹配错误
解决方案:
- 检查备份文件中的版本信息:
bash复制tar -tf backup_file | grep backup_information.yml
- 拉取对应版本镜像:
bash复制docker pull gitlab/gitlab-ce:<特定版本>
6.2 容器启动问题
问题现象:容器反复重启
排查步骤:
- 查看日志:
bash复制docker logs gitlab
- 常见原因:
- 端口冲突(特别是SSH 22端口)
- 挂载卷权限问题(chown -R 998:998 /srv/gitlab)
- 磁盘空间不足
6.3 性能优化建议
- 调整unicorn worker数量(编辑gitlab.rb):
ruby复制unicorn['worker_processes'] = 4 # 建议为CPU核心数+1
- 配置Sidekiq并发数:
ruby复制sidekiq['max_concurrency'] = 10
- 启用缓存:
ruby复制gitlab_rails['redis_cache_instance'] = 'redis://redis.example.com:6379'
7. 进阶维护技巧
7.1 版本升级策略
- 小版本升级(如13.1.0 → 13.1.1):
bash复制docker pull gitlab/gitlab-ce:latest
docker-compose down
docker-compose up -d
- 大版本升级(如13.x → 14.x):
- 先升级到当前系列的最后一个版本
- 按照官方升级路径逐步升级
- 每次升级前完整备份
7.2 监控配置
推荐使用Prometheus + Grafana监控方案,GitLab内置Prometheus,只需配置grafana:
- 启用GitLab内置Prometheus(gitlab.rb):
ruby复制prometheus['enable'] = true
prometheus['listen_address'] = '0.0.0.0:9090'
- Grafana数据源配置:
- URL: http://gitlab-container-ip:9090
- 导入官方GitLab仪表板(ID: 10826)
7.3 高可用方案
对于关键业务环境,建议采用:
- 数据库分离:
- 使用外部PostgreSQL数据库
- 配置(gitlab.rb):
ruby复制gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_host'] = 'postgres.example.com'
- 文件存储分离:
- 使用NFS或对象存储(S3兼容)
- 示例S3配置:
ruby复制gitlab_rails['object_store']['enabled'] = true
gitlab_rails['object_store']['connection'] = {
'provider' => 'AWS',
'aws_access_key_id' => 'access-key',
'aws_secret_access_key' => 'secret'
}
8. 安全加固措施
8.1 基础安全配置
- 修改默认SSH端口(gitlab.rb):
ruby复制gitlab_rails['gitlab_shell_ssh_port'] = 2222
- 强制HTTPS:
ruby复制external_url 'https://gitlab.example.com'
nginx['redirect_http_to_https'] = true
- 密码复杂度策略:
ruby复制gitlab_rails['password_compLEXity_required'] = true
8.2 定期维护任务
- 仓库清理:
bash复制docker exec -it gitlab gitlab-rake gitlab:cleanup:project_uploads
docker exec -it gitlab gitlab-rake gitlab:cleanup:orphan_job_artifact_files
- 数据库优化:
bash复制docker exec -it gitlab gitlab-rake pg:vacuum:analyze
- 日志轮转(gitlab.rb):
ruby复制logging['logrotate_frequency'] = "daily"
logging['logrotate_size'] = "100M"
9. 灾备方案设计
9.1 多级备份策略
- 本地每日增量备份:
bash复制docker exec -t gitlab gitlab-backup create SKIP=db,uploads
- 每周全量异地备份:
- 使用rclone同步到云存储
- 示例命令:
bash复制rclone copy /backups/gitlab remote:gitlab-backups
- 配置版本控制:
- 将gitlab.rb纳入Git管理
- 使用Ansible管理服务器配置
9.2 快速恢复演练
建议每季度执行恢复测试:
- 准备测试环境
- 随机选择一个备份文件
- 执行完整恢复流程
- 验证数据一致性
测试脚本示例:
bash复制#!/bin/bash
# 创建测试容器
docker run --name gitlab-test -d \
-v /tmp/gitlab-test/config:/etc/gitlab \
-v /tmp/gitlab-test/logs:/var/log/gitlab \
-v /tmp/gitlab-test/data:/var/opt/gitlab \
gitlab/gitlab-ce:<版本>
# 执行恢复
docker exec -it gitlab-test gitlab-ctl stop unicorn
docker exec -it gitlab-test gitlab-ctl stop sidekiq
docker exec -it gitlab-test gitlab-backup restore BACKUP=<备份文件>
# 验证
docker exec -it gitlab-test gitlab-rake gitlab:check SANITIZE=true
