前因
作为一个垃圾佬,云服务器那么贵的事,当然不会考虑高性能的,所以之前一只在洋垃圾工作站上搭建了内网的Gitlab,公网访问使用一个低配服务器做内网穿透使用,问题比较多,频繁掉线,家里断电,猫踩到工作站(机箱上真暖和)导致工作站关机都会导致服务中断。趁着各大云厂商服务器降价,采购了一个2C4G的云服务器,用作GItlab的服务器,而且还能玩玩其他的。
迁移准备
为了迁移顺利做了两手准备
- 将整个虚拟机磁盘文件备份
- 将整个gitlab的数据目录备份
由于之前用的docker版的gitlab,所以备份工作比较顺利
在云服务器上安装docker等必要软件,此时不得不吐槽251大厂的外网速度,docker按照官方教程下载了2个小时
开始迁移
旧服务器数据备份
进入docker内
gitlab-backup create STRATEGY=copy
会有以下警告,大意是说敏感性信息不会包含在备份中(gitlab.rb,gitlab-secrets.json)
Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
推送备份到目标服务器
scp /var/opt/gitlab/backups/* root@xxx.xxx.xxx.xxx:/srv
推送docker-compose.yml到目标服务器
scp /usr/local/docker/gitlab/docker-compose.yml root@xxx.xxx.xxx.xxx:/srv
启动目标服务器的Gitlab
docker-compose up -d
复制备份到backups
这一步注意,是复制到docker内的/var/opt/gitlab/backups
开始还原
例如你的备份文件叫 1583931743_2020_03_11_12.6.1_gitlab_backup.tar
则还原只需要
gitlab-backup restore BACKUP=1583931743_2020_03_11_12.6.1
也就是他会默认加上_gitlab_backup.tar
然后坑的地方来了。这个就尴尬了,然后还原失败。
由于我安装的镜像tag 是 latest
原服务器Gitlab版本 : 12.6.1
目标服务器GItlab版本:12.8.6
下载12.6.1太慢了,国内的网哦,一言难尽,所以我选择将原服务器的Gitlab镜像打包,传到目标服务器
打包原服务器Gitlab镜像,并推送
docker save -o gitlab-ce-lastest.tar gitlab/gitlab-ce:latest
scp gitlab-ce-lastest.tar root@xxx.xxx.xxx.xxx:/srv
目标服务器load镜像
先删除原来的镜像,load,然后查看以下是不是完成了,最后一定要改tag
docker rmi gitlab/gitlab-ce:latest
docker load --input gitlab-ce-lastest.tar
docker ps
docker tag gitlab/gitlab-ce:latest gitlab/gitlab-ce:12.6.1-ce.0
接下来就要先删除原来运行的数据,我的在/srv/gitlab 中,注意别把备份删了
利用docker-compose 启动镜像
启动完成后,再次操作还原,就可以还原回来了。
最后处理
备份的时候说了,不会处理gitlab.rb , gitlab-secrets.json
所以目标服务器依然需要改一下gitlab.rb
,最少external_url
需要改一下
反思
docker一定不要用latest
作为迁移而言,哪怕迁移失败,也要保证原数据没问题,原数据一定要提前先备份,以防不测。
附件
修正过后的 docker-compose.yml
version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce:12.6.1-ce.0'
container_name: "gitlab"
restart: always
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- /srv/gitlab/config:/etc/gitlab
- /srv/gitlab/data:/var/opt/gitlab
- /srv/gitlab/logs:/var/log/gitlab