灾难起源
起因是服务器 root 文件系统内存较小,只有 50G,经常爆仓。
于是乎,就把 gitlab 整体移动到内存相对较大 home 文件系统下。
这不,转移了,我人直接裂开来。
噩耗!!!
我打开命令窗口,口嚼香糖,一顿蜻蜓点水,在键盘上滑过 cp -R /app /home,刹那间,整整几个 G 的文件便搬了家。当然,其中包含着这个星期来所备份的文件。
然而,此时的我仍然在享受着香糖在口腔带来的愉悦,却不知下一秒,gitlab 的明天与意外哪个会先来。
我对着 gitlab 满心许下祝福,轻轻地敲下:
$ cd /home/app/docker/gitlab
$ docker-compose up
而此刻,等待我的却是,无尽的无尽。

有个 gitaly 服务启动失败!
失格!!!
啊,这……
在重新尝试多次启动无果后,似乎走上了一条不归路。
漆黑的命令窗口,如同深渊,凝视着你的凝视。
随着:
$ docker rm `docker ps -a | grep Exited | awk '{print $1}'`
$ docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
命令的执行,似乎变得清净起来。
清除了停止的容器与无用的镜像。干净的环境,总会为 gitlab 带来好运吧。然而,到头来还是一场梦。
依然启动不了 gitaly 服务,而带来的后果,就是仓库页面数据读取的失败。

其他页面功能正常,仓库页面访问返回 503。
返璞!!!
既然是转移之后出现的错误,那我再转移回来会报错吗?
随着我把命令喂给窗口后,gitlab 回到了原本属于它的家乡。正如同古诗句“乡音无改鬓毛衰”,此刻的 gitlab 与 它生长的 /app 环境却那么的格格不入。
依然是启动不了 gitaly,那么,gitaly 启动失败跟仓库页面 503 有什么关系呢?
Gitaly 是一个 Git RPC
服务,用于处理 GitLab 进行的所有 git 调用。
后台服务,专门负责访问磁盘以高效处理 git 操作,并缓存耗时操作。所有 git 操作都通过 Gitaly 处理。
即是 gitaly 是 gitlab 使用的处理读取 git 的桥梁服务,gitaly 开不起来,那么 gitlab 的 git 仓库数据的读取便是失了效。
归真!!!
经过一番查找,定位问题为数据卷挂载目录下 /app/volumes/gitlab/gitlab/repositoies/ 这个文件夹。
执行 ls,列出目录下文件:
+gitaly @hashed @pools
有三个文件,试着把 +gitaly 文件夹删掉,重新启动 docker gitlab,发现会重新生成 +gitaly 文件夹,此时的 gitlab,好像一个捉迷藏玩的很好的孩子,藏了很久终于被发现了一样。
仓库页面已经可以打开了,除了代码仓库显示为空仓库,其他数据也可以读取了。

执行 ls -a,大家都摊牌,别藏着掖着了:
$ ls -a
+gitaly .gitaly-metadata @hashed @pools
发现有一个隐藏的文件 .gitaly-metadata,查看 cat .gitaly-metadata:
{"gitaly_filesystem_id":"c19d98bb-9bf7-4579-b120-c6e33902c225"}
估计就是这个生成的配置文件系统 ID 指向失效了,导致找不到 git 仓库地址。
尝试过去查找 gitaly_filesystem_id 的意义,发现源码是 ruby 函数生成,精力有限,遂无深究。
人祸湮灭
时间旅行
没错,就是恢复备份。
执行
$ cd /app/docker/gitlab
$ docker-compose run --rm gitlab app:rake gitlab:backup:restore
执行中,会让选择恢复的备份文件,输入备份 tar 包完整名称,回车即可。
如:1593450065_2020_06_29_13.0.6_gitlab_backup.tar
但是,很不幸,出现权限问题。


精准夺权
遇到阻碍,那就夺权。
目标是备份文件 tar 包下所有文件的用户组与所有者,都修改为 root 用户。
把备份文件 tar 包拖出来,解压到 backup 文件夹,修改权限到 root 用户组与 root 所有者。

修改 backup 文件夹里面所有文件为用户组 root
chgrp -R root backup
修改 backup 文件夹里面所有文件为所有者 root
chown -R root backup
然后将夺权后的文件再重新打包为 tar 包。
继续执行:
$ cd /app/docker/gitlab
$ docker-compose run --rm gitlab app:rake gitlab:backup:restore

虽然还有报权限错误,因为 tar.gz 包里面没有夺权,但是问题不大。
柳暗花明
回到 docker-compose.yml 目录,启动容器!
$ cd /app/docker/gitlab
$ docker-compose up
柳暗花明又一村,我胡汉三又回来了!
