在安装 gitlab 的时候,有使用命令sudo gitlab-rake gitlab:backup:create备份用户数据。该备份路径是默认配置中的路径,我们可以对其进行修改。

此外,仅仅是备份在 gitlab 的主机中对数据丢失也有风险,例如硬盘坏了。

所以这里我简单列举了 gitlab-ce userdata(用户数据)备份到本机其它位置、备份到远程主机 2 种方式。

更多的,gitlab 还默认支持将用户数据备份到云端,配置中列示有 Amazon S3、Digital Ocean Spaces、 Google Cloud Storage 等。

具体详细的内容,可以查看官网的Backing up and restoring GitLab

常规备份设定——备份到本机其它位置

打开/etc/gitlab/gitlab.rb文件,找到Backup Settings区块。
可以看到,默认的备份地址配置gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

所以,只需要修改这一句,调整路径,例如gitlab_rails['backup_path'] = "/home/{username}/gitlab,后续备份的用户数据,就在/home/{username}/gitlab 下了。
{username}为你的主机名。

备份到远程主机

备份到远程主机,一开始不是很清楚这个配置设定,看着那段英文字翻译成中文没有看懂,假装配置几次失败后,就放弃了。使用了透过 ssh 使用 scp 指令,编写脚本文件,将 gitlab 主机的用户数据,copy 到其它主机。

以上做法是 ok 的,实际运行这么久也没什么问题。不管,这里我还是说明一下,如何使用 gitlab 的配置完成备份时一并备份到远程主机。
当然,前提条件是,在局域网内,可以直接访问指定位置。如果本来就无法访问,那肯定是这么配置都没用的。

仔细查看官方文档的说明,整理出实现步骤:

  1. 将远程主机路径,挂载到 gitlab 主机,
  2. 将挂载地址的所有权赋予 git 账号,
  3. 在 gitlab.rb 中配置备份设定,
  4. 重新加载配置文件运行 gitlab。

ubuntu 中挂载远程主机共享文件夹

一般情况下,我们在 ubuntu 中,点击‘其它位置’–>’连接到服务器’–>输入服务器地址–>输入授权账号密码网域等,就可以直接访问到对应的位置。此次的挂载效果类似。

我的示例,是将 gitlab 服务器的用户数据,备份到一台 windows 系统的远程主机,所以需要将 windows 指定文件夹,挂在到 gitlab 所在的 ubuntu 系统。

1 gitlab 主机安装 cifs 工具

gitlab 主机是 ubuntu,运行sudo apt-get install cifs-utils即可。

2 新加需要挂载的目标文件夹

我的示例,是想把 windows 系统中的//192.168.XX.XX/share/GitlabBackupDir挂载到 ubuntu 中的/mnt/backups中。
所以执行mkdir /mnt/backups去创建对应文件夹,权限不够在前面加sudo

3 挂载文件夹
一般直接使用 mount 指令的话,是临时挂载,计算机重启之后就没有了。现在这个场景,比较适合永久挂在,所以调价配置到文件为佳。
在挂载前,仔细阅读一下官网这句话:

The directory pointed to by the local_root key must be owned by the git user when mounted (mounting with the uid= of the git user for CIFS and SMB) or the user that you are executing the backup tasks under (for Omnibus packages, this is the git user).

经过我的测试分析,它的意思大概说明,这个挂载的地址,本例中为/mnt/backups,必须是执行挂载动作时的 git 用户,或者执行备份作业是的用户。使用 Omnibus packages 安装的 gitlab,这个执行的用户,就是 git 用户。

什么意思呢,简单理解就是,这个挂载地址文件夹的拥有者,必须是 git 用户。

到这里,我们再来添加挂载配置。

打开/etc/fstab文件,在最后添加以下内容:

{被挂载的远程主机源路径}    {gitlab主机的目标路径}    cifs    auto,username={远程主机的用户名},password={远程主机用户名的密码},domain={远程主机的网域},gid={ubuntu下git用户的gid},uid={ubuntu下git用户的uid}    0 0

空白留个 tab 键间隔或者空格就好了。各个间隔的参数含义,配置文件有说明,分别是

如果获取 git 用户的 uid 和 gid?在终端中输入id git即可。
其它用户就是id {user}
我的挂载命令就是

//192.168.XX.XX/share/GitlabBackupDir  /mnt/backups  cifs  auto,username=XXX,password=XXX,domain=XXX,gid=998,uid=998  0  0

要让挂载立即生效,执行sudo mount -a即可。
查看是否挂载成功,执行mount查看,应该可以看到类似如下一句:

……
//192.168.XX.XX/share/GitlabBackupDir on /mnt/backups type cifs (rw,relatime,vers=2.1,cache=strict,username=XXX,domain=XXX,uid=998,forceuid,gid=998,forcegid,addr=192.168.XX.XX,file_mode=0755,dir_mode=0755,soft,nounix,serverino,mapposix,rsize=1048576,wsize=1048576,bsize=1048576,echo_interval=60,actimeo=1)
……

说明挂载成功。

额外说一句,如果只有临时挂载,重启就没有了,那就不写到配置文件,只需要在终端执行:

mount -t cifs {被挂载的远程主机源路径} {gitlab主机的目标路径} -o username="{username}",password="{password}",domain={domain}

注意:

  • 如果是 windows10 系统,可能需要在最末加一句 vers=2.0,写在配置文件也是一样要加。
  • 终端中输入 option 要加引号。写到配置时,不要加,否则会报错。
  • 如果没有网域,当然就不用添加这个参数。

到这里挂载文件夹和赋予所有权给 git 用户已完成。

修改 gitlab.rb 对应配置文件

打开/etc/gitlab/gitlab.rb文件,找到

# gitlab_rails['backup_upload_connection'] = {
#   'provider' => 'AWS',
#   'region' => 'eu-west-1',
#   'aws_access_key_id' => 'AKIAKIAKI',
#   'aws_secret_access_key' => 'secret123'
# }
# gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'
# gitlab_rails['backup_multipart_chunk_size'] = 104857600

最好复制一份,修改为:

gitlab_rails['backup_upload_connection'] = {
  'provider' => 'Local',
  'local_root' => '/mnt/backups'
}
gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'

这个配置完成,那么在执行 geilab 备份时,会在/mnt/backups文件夹下创建gitlab_backups子文件夹,并放入该次备份的用户数据。
又因为这个路径,实际是 windows 下//192.168.XX.XX/share/GitlabBackupDir的挂载路径,所以实际上,用户数据的备份文件,就在这里。

以上,就完成了备份到远程主机的操作。配置好之后可能执行sudo gitlab-rake gitlab:backup:create命令测试一下,看是否在上述的路径下备份了用户数据。

当然,备份到 U 盘,外挂硬盘什么的,操作类似,不重复。至于备份到云,我没有这个条件,但是文檔也写得比较清楚,照做即可。

此外,编写脚本,使用其它系统指令也可以实现类似的效果,这个不用 gitlab 进行配置,所以不赘述。

实现定时备份

可以将备份操作写到 cron 定时备份任务中去,那么就可以省略手动备份的操作了。

这个比较简单,在终端执行sudo crontab -e,或者

sudo su -
crontab -e

系统自动备份的话,用户还是用 root 较好
选择一个编辑器,在最末,加一句(示例是每天凌晨 2 点进行备份,等级优先)

0 2 * * * /opt/gitlab/bin/gitlab-backup create CRON=1

注意,GitLab 12.1 及之前的版本, 使用 0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1.

保存,重启 cron 服务

sudo service cron restart

后续要修改,可以直接修改其文件,位置在/var/spool/cron/crontabs文件夹,如果是 root 账户,这里面就有个 root 文件。如果是其它用户{user},那就是{user}文件。