跨服务器迁移基于Docker的Gitlab

这两天将gitlab从内网迁移到了外网,以便更好的与外部合作伙伴及客户进行协作。

两台服务器都是 CentOS 7.2,Docker上运行的OMNIBUS版本的gitlab容器。迁移的步骤在网上有不少人记录,有的直接拷贝数据文件和配置文件的,有的是通过gitlab的备份命令来将数据备份,再用恢复命令的。由于这个容器版本的数据与配置都在/srv/gitlab文件夹下面,我就采取了第一种方式,步骤大约是这样的:

1,新服务器上安装Docker环境,配置一切,gitlab跑起来,只不过是一个新的站点而已,如何安装可以参考我这篇文章

2,关停旧服务器,然后将配置与数据文件拷贝到新服务器;

3,新服务器关停原容器,将拷贝过来的服务器配置到容器的数据与配置文件夹中去,然后开起来;

4,以上每一步都做到的话,其实就可以了。

但是实际上还是有点曲折,容易遇到坑,迁移的几个要点记录如下:

1,尽量保证新老服务器上的Docker版本一致,这是出于保险起见。不过本人操作过程中其实有不一致的情况,差了前后一个版本(新服务器的高一个版本,正好是操作的这两天出来的,当时没注意到。),没出问题,毕竟gitlab 容器本来就支持通过拉取latest的镜像来构建新版本gitlab,新版本第一次启动的时候会自动对数据进行migration。

2,新服务器上搭建环境的时候,注意看swap分区是否有创建,没有的话,需要创建,参见我这篇文章

3,从旧服务器拷贝文件到新服务器,要注意文件的权限,尤其是owner会变化,导致新服务器跑不起来。原因是gitlab那些数据文件实际上是容器内的postgreSQL、redis等多个组件各自读写的,具有不同的owner。但通过SFTP或者SCP等方式传到新服务器后,owner变成了操作传输动作的账号。这是一个挺大的坑,很多地方都没有明确提到这一点,也没有特别说明如何解决,后来在官方文档里面某一页的末尾处看到提到了一句,笼统的说遇到文件权限问题时候可以运行如下命令:

sudo docker exec gitlab update-permissions
sudo docker restart gitlab

确实执行之后,问题就解决了。

顺便说一下,当时遇到这个文件权限问题的时候,症状是gitlab容器不停的重启,也没法命令行连进去执行命令。通过查看gitlab日志文件夹,发现reconfigure和sshd两个文件夹有日志产出。其中reconfigure文件夹里面的日志,有提到文件操作权限出错的问题。可惜具体报错信息没有记录下来。