此文章适用于因更换服务器或者 gitlab 安装方式变更(普通方式 <=> docker)进行数据迁移,或者日常备份还原。
前提条件:备份和还原的 gitlab 版本一致!
gitlab 版本查看命令:gitlab-rake gitlab:env:info
PS:如果是 docker 安装方式,请先登录容器在执行该命令,登录容器命令:docker exec -it gitlab /bin/bash
1 数据备份(操作备份服务器)
执行备份命令,如果是 docker 安装需要先登录到 gitlab 容器
gitlab-rake gitlab:backup:create
命令执行后,会在 /var/opt/gitlab/backups/
目录下生成一个类似于 1666142751_2022_10_19_13.6.7_gitlab_backup
备份文件,如果是 docker 安装,该文件在生成容器时配置的挂载路径中。
注意:备份中会提示“gitlab.rb 和 gitlab-secrets.json 中存在敏感信息”,不需要管。
2 拷贝数据
将备份文件、gitlab.rb、gitlab-secrets.json(后面两个文件在 /etc/gitlab
目录中,docker 安装请查阅对应的挂载目录)上传到还原服务器临时目录上。
上传的方法就不详细说明了,小编这边是使用的 Secure CRT 通过 SSH 连接备份服务器,先将文件保存在 Secure CRT 安装电脑上。然后再连接还原服务器,将文件上传至临时目录。
3 还原数据(操作还原服务器)
3.1 复制还原包
将临时目录中的 1666142751_2022_10_19_13.6.7_gitlab_backup
文件复制到 /var/opt/gitlab/backups/
目录下(docker 安装复制到对应的挂载目录下)
3.2 修改 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
如果是 docker 安装,在执行下面的操作之前,请先登录到 gitlab 容器中
3.2.1 修改 postgresql.conf
vim /var/opt/gitlab/postgresql/data/postgresql.conf
修改配置:
listen_addresses = '*'
说明:修改端口监听地址,默认监控 localhost,* 代表 all
3.2.2 修改 pg_hba.conf
vim /var/opt/gitlab/postgresql/data/pg_hba.conf
增加配置:
local all all trust
host all all 127.0.0.1/32 trust
3.2.3 重启 gitlab
gitlab-ctl restart
3.2.4 修改 postgresql 权限
$ su - gitlab-psql$ /opt/gitlab/embedded/bin/psql -h 127.0.0.1 gitlabhq_productiongitlabhq_production=# ALTER USER gitlab WITH SUPERUSER;ALTER ROLEgitlabhq_production=# \q$ exit
3.3 执行恢复命令
gitlab-rake gitlab:backup:restore BACKUP=1666142751_2022_10_19_13.6.7
BACKUP
后面的标签是备份文件名前面部分
3.4 复制 gitlab.rb 和 gitlab-secrets.json
将 gitlab.rb、gitlab-secrets.json
复制到 /etc/gitlab
目录下(docker 安装复制到对应的挂载目录下)
注意:请仔细检查 gitlab.rb 文件中以下配置是否正确,如果不正确可能导致浏览器无法访问 gitlab
external_url
gitlab_rails['gitlab_ssh_host']
gitlab_rails['gitlab_shell_ssh_port']
nginx['listen_port']
PS:nginx['listen_port']
不指定 nginx 会默认监听 external_url
的端口,若 external_url
没有指定端口,则 nginx 监听 80 端口