本文介绍定时自动备份GitLab;Gitlab安装在Centos7上,备份位置是局域网上另一台Windows电脑上的共享目录。Gitlab支持全量和增量备份,全量备份完成后会生成一个tar包,通过该tar包即可还原备份;但实测备份数据达大时,备份完成后打 tar 包时会报错。但全量备份时可以跳过生成 tar 包,这会极大的节约资源消耗,因此一般都推荐跳过;但跳过打 tar 包会使备份数据保留在中间目录中,创建新备份时,这些文件将被覆盖;即,不打 tar 包时,系统上只能有一个备份。
方案一:全量备份一次,并在执行备份时跳过生成 tar 包,然后在全量备份的基础之上进行增量备份,但增量备份只支持存储库,不支持增量备份其它数据;
方式二:(推荐)定时全量备份,以确保所有数据都被完整备份。
1.0>. 在Windows系统上创建共享目录,并确保能够正常访问;
2.0>. 在Centos7上安装 cifs-utils,请参考Linux离线安装软件:https://www.sidoc.cn/doc/1459.html
cifs-utils
用于在 Linux 中支持和实现CIFS
协议。CIFS
协议是用于在不同计算机之间共享文件和资源的一种网络协议。cifs-utils
提供了在 Linux 系统上使用mount
命令挂载CIFS
共享的工具和文件系统类型。它包含了必要的工具和库,使得 Linux 操作系统能够与 Windows 共享文件夹进行交互。
在 VMware ESXi 中导出虚拟系统时,要先在虚拟系统的“CD/DVD驱动器
”配置中取消“打开电源时连接
”选项;否则导出后的映像无法再次导入,会提示无法连接到原系统CD/DVD驱动器所连接的镜像。
1.0> 编辑配置文件:
vim /etc/gitlab/gitlab.rb
2.0> 配置备份路径:
gitlab_rails['backup_path'] = '/var/opt/gitlab/backups/windows_share' # 备份位置
将局域网上另一台Windows电脑上的目录挂载到本地Linux的指定目录上;这样一来,在Linux上在向挂载目录中存放、删除文件,就相当于操作另一台Windows电脑上的共享目录。
1.0> 运行Gitlab的用户是“git”,因此要获取“git”用户的用户ID和组ID
## 获取用户"git"的用户ID
id -u git
## 获取用户“git”的组ID
id -g git
2.0> 在linux中挂载Windows共享文件夹
## a. 临时挂载(用于测试) -------------------------------------------------------------------------
## 系统重启或当前会话结束后会临时挂载会自动解除
## 参数一:windows共享文件夹的完整路径
## 参数二:linux本地的挂载目录
## 参数三:username:windows共享文件夹访问用户名
## 参数四:password:windows共享文件夹访问密码
## 参数五:uid:挂载目录的属主用户ID
## 参数六:gid:挂载目录的属主组ID
## 参数七:dir_mode:挂载目录中文件夹的权限
## 参数八:file_mode:挂载目录中文件的权限
mount.cifs //192.168.10.104/gitlab-backup /var/opt/gitlab/backups/windows_share -o username=EDY,password=nwadmin,uid=996,gid=994,dir_mode=0700,file_mode=0700
## b. 永久挂载 --------------------------------------------------------------------------------
## 编辑fstab配置文件,该文件用于定义系统启动时需要自动挂载的文件系统
vim /etc/fstab
## 在文件尾部添加如下内容
//192.168.10.104/gitlab-backup /var/opt/gitlab/backups/windows_share cifs username=EDY,password=nwadmin,uid=996,gid=994,dir_mode=0700,file_mode=0700
## 验证 /etc/fstab 文件语法错误,并重新加载
mount -a
注:Gitlab在备份时会检查备份目录的权限;备份目录的属主必须为Gitlab的运行用户“git”,并且备份目录的权限必须为700,即只有属主可读写,更大或更小的权限都会导致Gitlab报错。
3.0> 挂载操作的常用命令
注:不要给同一个Linux目录挂载多个windwos共享目录,否则可能会发生意想不到的错误;因为每一次挂载都是叠加的,会导致多个Windows共享目录同时挂载到同一个Linux目录上;
注:不要将同一个Windows共享目录挂载到多个Linux目录上,否则可能导致以前的挂载目录在使用时发生意想不到的错误。
## 查看已挂载的目录
df -h
## 卸载已挂在的目录
sudo umount /var/opt/gitlab/backups/windows_share
4.0> 使Gitlab配置生效
sudo gitlab-ctl reconfigure
5.0> 执行备份Gitlab
注:备份过程中不要编辑备份目录,否则会导致GitLab备份中断和异常。
注:因为 gitlab.rb 和 gitlab-secrets.json 文件中包含敏感信息,因此备份时不包含这两文件,需要自行手动备份,详见下方“定时备份”
## SKIP=tar表示不要将备份文件打成tar包,这会使备份的文件和目录保留在中间文件的目录中,创建新备份时,这些文件将被覆盖,因为不打tar包时,系统上只能有一个备份;
sudo gitlab-backup create SKIP=tar
6.0> 还原备份
注:还原时,Gitlab必须处于启动状态,并将备份和还原的Gitlab版本必须完全相同。
sudo gitlab-backup restore
## 切换到超级用户(root)
sudo su -
## 编辑 crontab 文件以创建定时任务
crontab -e
## 在 crontab 文件中添加以下内容,以安排每天凌晨 2 点进行自动备份
0 2 * * * /opt/gitlab/bin/gitlab-backup create SKIP=tar CRON=1
## 因为 gitlab.rb 和 gitlab-secrets.json 中包含敏感信息,因此备份时不包含这两文件,需要自行手动备份:
0 2 * * * /bin/cp -f /etc/gitlab/gitlab.rb /var/opt/gitlab/backups/windows_share/git-data/gitlab.rb
0 2 * * * /bin/cp -f /etc/gitlab/gitlab-secrets.json /var/opt/gitlab/backups/windows_share/git-data/gitlab-secrets.json
CRON=1
指示备份脚本隐藏所有进度输出,以减少 cron 垃圾邮件;但在排查备份问题时,请替换CRON=1
为--trace
以便输出详细记录。
Gitlab备份官方文档:https://docs.gitlab.com/ee/administration/backup_restore/backup_gitlab.html