一、背景

Gitlab 系列1 --- 安装

二、备份

1. 备份相关的配置

在Gitlab配置/etc/gitlab/gitlab.rb中,与备份相关的配置主要集中在### Backup Settings中,如下图:

docker gitlab备份 恢复 gitlab备份恢复特定库_Git

(1) 备份种类

Gitlab的配置主要分为配置和数据(包括数据库和附件)。上图的配置主要适用于数据备份。

(2) 数据备份存放路径

gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

(3) Gitaly软件路径

Gitlab的备份任务使用Gitaly创建和恢复仓库的备份。

gitlab_rails['backup_gitaly_backup_path'] = /opt/gitlab/embedded/bin/gitaly-backup

(4) 备份存活时间

默认604800秒,即7天时间。

gitlab_rails['backup_keep_time'] = 604800

该配置项同时适用于配置和数据备份。当运行备份任务时(比如gitlab-ctl backup-etc命令),超过'backup_keep_time'指定时间的备份将会被删除。

如果你不希望删除过期的备份,在命令后添加--no-delete-old-backups参数:

sudo gitlab-ctl backup-etc --no-delete-old-backups

2. 备份配置文件

(1) 所有的配置文件都保存在 /etc/gitlab 目录下。

(2) 如果希望备份全部的配置文件,可以直接运行以下命令:

sudo gitlab-ctl backup-etc

该命令会将配置文件创建成一个tar文件并存放在/etc/gitlab/config_backup/目录下,如果你想指定保存tar文件的目录,则运行:

sudo gitlab-ctl backup-etc --backup-path <DIRECTORY>

(3) 最少备份

/etc/gitlab/gitlab-secrets.json
/etc/gitlab/gitlab.rb

3. 备份数据文件

(1). 备份文件格式:

[TIMESTAMP]_gitlab_backup.tar

 例如:1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar,TIMESTAMP是1493107454_2018_04_25_10.6.4-ce,它实际上包含了软件版本号。

(2) 备份命令

sudo gitlab-backup create

该命令包含如下参数:

a. STRATEGY

当执行备份命令的时候,如果此时数据有改变,则备份程序会报"file changed as we read it"错误并引起备份失败。如果在备份过程中添加以下参数可以避免该问题的出现:

sudo gitlab-backup create STRATEGY=copy

该参数会使备份程序通过复制数据文件到一个临时目录的方式来避免该问题,当然副作用也是显而易见的,这种方式会导致2倍的存储空间占用。

b. 自定义备份文件名称

上面我们提到备份文件格式,我们可以通过指定BACKUP参数来覆盖[TIMESTAMP]参数:

sudo gitlab-backup create BACKUP=dump

这样,生成出的文件名为:

dump_gitlab_backup.tar

c. 增量备份

sudo gitlab-backup create INCREMENTAL=yes PREVIOUS_BACKUP=<timestamp_of_backup>

INCREMENTAL=yes意思是启用增量备份;

PREVIOUS_BACKUP是指定上一次备份的[TIMESTAMP],也就是备份文件的前缀。

d. 备份文件权限

默认情况下,备份文件的权限为0600,即只允许创建者读写;我们在配置文件/etc/gitlab/gitlab.rb中将权限改为“允许创建者读写,允许其他用户读取”0644:

gitlab_rails['backup_archive_permissions'] = 0644
sudo gitlab-ctl reconfigure

4. 恢复Gitlab

(1) 如果是做Gitlab的迁移,那么首先需要恢复配置文件,并应用新的配置:

sudo cp /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.bak
sudo cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak

sudo mv -rf gitlab-secrets.json /etc/gitlab/gitlab-secrets.json
sudo mv -rf gitlab.rb /etc/gitlab/gitlab.rb

重新配置:

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

检查配置结果:

sudo gitlab-rake gitlab:check SANITIZE=true

(2) 首先需要准备好备份文件,备份文件默认存储在Gitlab宿主机的 /var/opt/gitlab/backups目录下:

/var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar

(3) 备份文件需要指定所有者为git:

sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar

(4) 暂停puma和sidekiq

sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq

校验:

sudo gitlab-ctl status

(5) 恢复数据

sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce

(6) 重启服务

sudo gitlab-ctl restart
sudo gitlab-ctl status

三、使用Crontab创建定时任务进行自动备份

1. Crontab定时任务

(1) 编辑crontab配置:

sudo su -
crontab -e

(2) 在配置文件中添加:

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

该行显示为每天2点进行自动备份。

2. 增强备份

如果在备份结束之后需要将备份文件传输到另一台服务器,则可以使用脚本来完成:

(1) 创建脚本

vi gitlab_backup.sh

(2) 初始化内容:

#!/bin/bash

#本机备份目录
backup_dir=/var/opt/gitlab/backups

#备份主机备份目录
target_backup_dir=/home/git/backup

#获取最新的备份文件名称
backup_file=`ls -tl | grep tar | head -n 1 |awk '{print $9}'`

#备份Gitlab
/opt/gitlab/bin/gitlab-backup create

#复制备份文件到另一台机器
scp ${backup_dir}/${backup_file} root@[目标主机IP]:${target_backup_dir}

(3) 更新Crontab:

0 2 * * * gitlab_backup.sh

四、参考

https://docs.gitlab.com/omnibus/settings/backups.html

https://docs.gitlab.com/ee/raketasks/backup_restore.html