GitLab备份与迁移完全指南
GitLab作为一个完整的DevOps平台,其数据对于组织至关重要。无论是版本升级、服务器迁移还是灾难恢复,掌握GitLab的备份和迁移技术都是系统管理员的必备技能。本文将详细介绍GitLab的备份策略和各种场景下的迁移方法。
目录
- GitLab备份基础知识
- Omnibus GitLab备份
- Docker环境下的GitLab备份
- Kubernetes环境下的GitLab备份
- 迁移场景一:同版本服务器间迁移
- 迁移场景二:GitLab版本升级迁移
- 迁移场景三:从自托管迁移到GitLab.com
- 迁移场景四:从其他Git平台迁移到GitLab
- 迁移场景五:云平台间的GitLab迁移
- 备份验证与恢复测试
- 自动化备份策略
- 常见问题与故障排除
GitLab备份基础知识
GitLab备份主要包含以下内容:
- 数据库(PostgreSQL或MySQL)
- 代码仓库数据
- GitLab配置文件
- CI/CD流水线数据
- 上传的文件和附件
- LFS对象
- CI构建产物
- Registry容器镜像
GitLab提供了内置的备份工具,可以创建包含所有必要数据的单一备份文件。默认情况下,备份不包括以下内容,需要单独考虑:
- GitLab配置文件(/etc/gitlab)
- SSH主机密钥
- 自定义的Omnibus GitLab配置
备份保留策略
建议实施以下备份保留策略:
- 每日备份保留7天
- 每周备份保留4周
- 每月备份保留12个月
- 每年备份永久保存
Omnibus GitLab备份
Omnibus是最常见的GitLab安装方式,下面详细介绍其备份流程。
创建备份
# 创建完整备份
sudo gitlab-backup create
# 创建不包含某些组件的备份
sudo gitlab-backup create SKIP=artifacts,lfs,container_registry,packages
备份文件默认保存在/var/opt/gitlab/backups
目录下,文件名格式为<timestamp>_<gitlab_version>_gitlab_backup.tar
。
配置备份路径和权限
编辑GitLab配置文件:
sudo vim /etc/gitlab/gitlab.rb
修改备份路径:
gitlab_rails['backup_path'] = '/mnt/gitlab-backup'
应用配置并确保权限正确:
sudo gitlab-ctl reconfigure
sudo chown git:git /mnt/gitlab-backup
备份GitLab配置文件
sudo cp -r /etc/gitlab /etc/gitlab.$(date +%Y%m%d)
sudo tar -czf gitlab_config_$(date +%Y%m%d).tar.gz /etc/gitlab
备份SSH密钥
sudo tar -czf gitlab_ssh_$(date +%Y%m%d).tar.gz /etc/ssh/ssh_host_*
Docker环境下的GitLab备份
创建备份
# 对于使用docker run启动的GitLab
docker exec -t <container_name> gitlab-backup create
# 对于使用docker-compose启动的GitLab
docker-compose exec gitlab gitlab-backup create
备份配置文件
# 备份docker-compose.yml
cp docker-compose.yml docker-compose.yml.$(date +%Y%m%d)
# 备份环境变量文件
cp .env .env.$(date +%Y%m%d)
# 备份挂载的配置卷
docker cp <container_name>:/etc/gitlab ./gitlab-config-$(date +%Y%m%d)
Kubernetes环境下的GitLab备份
使用Helm Chart部署的GitLab
# 获取GitLab pod名称
kubectl get pods -n <namespace> | grep task-runner
# 在task-runner pod中执行备份
kubectl exec -it <task-runner-pod> -n <namespace> -- backup-utility
# 将备份文件从pod复制到本地
kubectl cp <namespace>/<task-runner-pod>:/var/opt/gitlab/backups/<backup-file> ./
使用GitLab Operator部署的GitLab
# 创建备份CRD
cat <<EOF | kubectl apply -f -
apiVersion: apps.gitlab.com/v1beta1
kind: GitLabBackup
metadata:
name: gitlab-backup-$(date +%Y%m%d)
namespace: <namespace>
spec:
gitlabInstance: <gitlab-instance-name>
backupStorageRef:
name: <backup-storage-name>
EOF
迁移场景一:同版本服务器间迁移
这是最简单的迁移场景,适用于服务器硬件升级或数据中心迁移。
步骤1:在源服务器上创建完整备份
sudo gitlab-backup create
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab-secrets.json /path/to/backup/location/
步骤2:将备份文件传输到目标服务器
# 使用scp传输
scp /var/opt/gitlab/backups/<backup-file> user@new-server:/var/opt/gitlab/backups/
scp /path/to/backup/location/gitlab.rb /path/to/backup/location/gitlab-secrets.json user@new-server:/etc/gitlab/