本文简单介绍Gitlab的备份/恢复操作。
概述
在个人服务器上通过Docker搭建了Gitlab。今天在Gitlab上创建Group的时候返回了500
错误,调试了一段时间问题都没有得到解决。自该容器搭建以来经历了若干升级和意外断电,估计因此出现了问题。
经过考虑之后决定先把Gitlab的数据备份,然后通过重新创建Gitlab容器和数据恢复的办法进行修复。尽管修复的过程出现了一些异常,但总体上还是比较顺利的完成了修复。
下文将简单介绍该过程,但在展开之前有两点务必了解:
- 在Gitlab出现问题后有可能会导致备份数据失败,务必在备份成功之后再执行后续的操作。
- 恢复数据成功的前提是Gitlab的版本与备份数据的Gitlab版本相同。
备份
进入Gitlab容器后执行下面命令进行备份。
gitlab-backup create
备份文件会保存在容器的/var/opt/gitlab/backups/
目录下以tar
文件进行保存,文件名类似:1673231242_2023_01_09_15.5.4_gitlab_backup.tar
。
然而上面命令只对备份常规数据,用户的敏感数据存储于/etc/gitlab/gitlab-secrets.json
以及/etc/gitlab/gitlab.rb
,用户【必须】手动进行备份。
恢复数据
在重新创建Gitlab容器后(注意版本需要和备份文件的版本一致),执行下面操作:
配置PostgreSQL
在开始执行恢复之前需要先对PostgreSQL做一些配置,否则在执行恢复的时候可能会出现类似下面的异常报错。
Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm
ERROR: must be owner of extension btree_gist
ERROR: must be owner of extension btree_gist
ERROR: must be owner of extension pg_trgm
- 修改
/var/opt/gitlab/postgresql/data/postgresql.conf
,找到属性listen_addresses
,执行配置:
listen_addresses = '*'
- 修改
/var/opt/gitlab/postgresql/data/pg_hba.conf
,在文件最后添加内容:
local all all trust
host all all 127.0.0.1/32 trust
- 重启服务。
gitlab-ctl restart
- 将
gitlab
设置为超级用户:
这部分的终端的交互内容大致如下:
# su - gitlab-psql
$ /opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production
psql (13.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
gitlabhq_production=# ALTER USER gitlab WITH SUPERUSER;
ALTER ROLE
gitlabhq_production=# \q
$ exit
#
上面终端内容的大意大致如下:
-
su - gitlab-psql
,切换成用户gitlab-psql
。 -
/opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_production
, 打开gitlabhq_production
数据库。执行该命令后会打印相应信息并且提示符变成gitlabhq_production=#
。 -
ALTER USER gitlab WITH SUPERUSER;
,把用户gitlab
修改为超级用户。 -
\q
,退出SQL。 -
exit
,退出gitlab-psql
用户。
拷贝备份文件
把前面备份的tar文件拷贝到/var/opt/gitlab/backups/
;以及把gitlab-secrets.json
以及gitlab.rb
拷贝到/etc/gitlab
,并确保这些文件的权限。
假定已经通过工具(譬如FTP工具)把相应文件上传到容器的/tmp
目录下:
mv /tmp/1673231242_2023_01_09_15.5.4_gitlab_backup.tar /var/opt/gitlab/backups/
chown git:git /var/opt/gitlab/backups/1673231242_2023_01_09_15.5.4_gitlab_backup.tar
chmod g-rwx,o-rwx /var/opt/gitlab/backups/1673231242_2023_01_09_15.5.4_gitlab_backup.tar
mv /tmp/gitlab.rb /tmp/gitlab-secrets.json /etc/gitlab/
chown root:root /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab.rb
chmod g-rwx,o-rwx /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab.rb
执行恢复
- 停掉
unicorn
和sidekiq
。
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
- 执行恢复
gitlab-backup restore force=yes
# 如果/var/opt/gitlab/backups/下有多个备份文件,可以执行下面命令指定恢复的目标
gitlab-backup restore force=yes BACKUP=1673231242_2023_01_09_15.5.4
重置、重启、自检
执行下面命令执行重置、重启以及自检。
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-rake gitlab:check SANITIZE=true
在执行gitlab-rake gitlab:check SANITIZE=true
的时候可能会出现报错,类似:
Internal API available: FAILED - Internal API error (502)
gitlab-shell self-check failed
Try fixing it:
Make sure GitLab is running;
Check the gitlab-shell configuration file:
sudo -u git -H editor /opt/gitlab/embedded/service/gitlab-shell/config.yml
Please fix the error above and rerun the checks.
又或者:
Sidekiq: ... Running? ... no
Try fixing it:
sudo -u git -H RAILS_ENV=production bin/background_jobs start
For more information see:
doc/install/installation.md in section "Install Init Script"
see log/sidekiq.log for possible errors
Please fix the error above and rerun the checks.
这可能是因为重启Gitlab后,部分服务还没完全启动以至于自检出现报错,稍等一会再重新执行自检可能就会顺利通过。
数据恢复的流程至此结束。
其他相关操作
最后这里列出一些涉及的操作。
# 进入gitlab容器
docker exec -it gitlab bash
# 创建gitlab容器
docker run -d --name gitlab \
-v /data/app/gitlab/config:/etc/gitlab \
-v /data/app/gitlab/logs:/var/log/gitlab \
-v /data/app/gitlab/data:/var/opt/gitlab \
--restart always \
--hostname gitlab.windfant.top \
gitlab/gitlab-ce:15.5.4-ce.0