迁移前需确保新旧服务器GitLab版本完全一致(如旧服务器为14.6.0,新服务器需先安装14.6.0)。版本不一致会导致数据结构不兼容,引发恢复失败或功能异常。
使用GitLab自带工具备份所有关键数据(仓库、数据库、配置、CI/CD设置等):
# 进入GitLab备份目录
cd /var/opt/gitlab/backups
# 创建全量备份(RAILS_ENV=production表示生产环境)
sudo gitlab-rake gitlab:backup:create RAILS_ENV=production
备份文件默认以时间戳_版本号_gitlab_backup.tar格式命名(如1725431200_2024_09_04_16.2.4_gitlab_backup.tar)。
额外备份配置文件(避免配置丢失):
sudo cp /etc/gitlab/gitlab.rb /path/to/backup/ # 主配置文件
sudo cp /etc/gitlab/gitlab-secrets.json /path/to/backup/ # 敏感信息(如数据库密码、加密密钥)
将备份文件及配置文件复制到新服务器(使用scp命令,需输入新服务器密码):
scp /var/opt/gitlab/backups/*.tar root@new_server_ip:/var/opt/gitlab/backups/
scp /path/to/backup/gitlab.rb root@new_server_ip:/etc/gitlab/
scp /path/to/backup/gitlab-secrets.json root@new_server_ip:/etc/gitlab/
根据新服务器操作系统选择安装方式(以CentOS为例,使用YUM包管理器):
# 添加GitLab官方仓库(以14.6.0为例)
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# 安装指定版本
sudo yum install -y gitlab-ce-14.6.0-ce.0.el7.x86_64
确保新服务器备份目录权限正确(属主为git用户):
cd /var/opt/gitlab/backups
sudo chown git:git *.tar # 修改备份文件属主
sudo chmod 777 *.tar # 临时开放权限(恢复后建议改回755)
# 停止相关服务(避免数据冲突)
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
# 恢复备份(BACKUP参数为备份文件名中的时间戳部分)
sudo gitlab-rake gitlab:backup:restore BACKUP=1725431200_2024_09_04_16.2.4
# 恢复过程中会提示确认,输入"yes"继续
sudo gitlab-ctl start # 启动所有服务
sudo gitlab-ctl status # 检查服务状态(确保所有服务均为"run")
http://new_server_ip),使用原管理员账号(root)登录,确认项目、用户、CI/CD配置等是否完整。git clone http://new_server_ip/username/project.git
确认当前GitLab版本(用于确定升级路径):
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION # RPM安装
# 或
cat /usr/lib/gitlab/embedded/service/gitlab-rails/VERSION # Debian安装
GitLab升级必须遵循逐步升级原则(不能跨大版本直接升级),避免数据损坏。例如:
升级前必须备份所有数据(步骤同迁移备份),防止升级失败导致数据丢失。
升级前停止GitLab关键服务(避免数据冲突):
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
# 可选:停止Nginx(若使用自定义配置)
sudo gitlab-ctl stop nginx
根据安装方式选择升级命令(以RPM包为例):
# 下载新版本rpm包(以14.0.12为例)
wget https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-14.0.12-ce.0.el7.x86_64.rpm
# 安装新版本(--nobest忽略依赖冲突,--skip-broken跳过损坏包)
sudo rpm -Uvh --nobest --skip-broken gitlab-ce-14.0.12-ce.0.el7.x86_64.rpm
# 重新配置GitLab(应用新版本设置)
sudo gitlab-ctl reconfigure
# 重启所有服务
sudo gitlab-ctl restart
# 检查服务状态
sudo gitlab-ctl status
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
若从13.X直接升级到14.X,可能因传统存储未转换导致失败。需先执行哈希存储迁移:
sudo gitlab-rake gitlab:storage:migrate_to_hashed
若升级系统glibc到2.28及以上,PostgreSQL可能无法正常启动。需手动备份并还原PostgreSQL数据:
# 备份PostgreSQL数据
sudo -u postgres pg_dumpall > /tmp/pg_backup.sql
# 卸载旧版本GitLab(保留数据目录)
sudo yum remove gitlab-ce
# 重新安装GitLab
sudo yum install gitlab-ce-新版本.rpm
# 恢复PostgreSQL数据
sudo -u postgres psql -f /tmp/pg_backup.sql
若内网环境无法使用SMTP,需通过控制台绕过邮箱验证:
# 进入GitLab控制台
sudo gitlab-rails console -e production
# 强制确认管理员账号(root)
admin = User.find_by_username("root")
admin.confirmed_at = Time.zone.now
admin.save!
# 强制确认所有未验证用户
User.where('LENGTH(confirmation_token) = 32').where(confirmed_at: nil).find_each { |u| u.confirmed_at = Time.now; u.save }
exit
gitlab-ctl status),及时处理异常。