GitLab幕后故事——备份恢复篇
本文的 GitLab 备份恢复包括日常运行场景和实例迁移部署场景
参考: archives.docs.gitlab.com/14.10/ee/ra…
非 Omnibus GitLab 软件包安装方式,需要 Rsync:
yum install -y rsync
apt-get install rsync
一、GitLab 备份
1、文件备份
文件清单
(1) GitLab 文件:
- 查找authorized_keys:
getent passwd git | cut -d: -f6 | awk '{print $1"/.ssh/authorized_keys"}'
- 备份项:
-
# 配置文件 /etc/gitlab/gitlab.rb # 敏感信息文件(数据库加密密钥、 CI/CD 变量以及用于双因素身份验证的变量) /etc/gitlab/gitlab-secrets.json # 公钥文件 /var/opt/gitlab/.ssh/authorized_keys # 邮件服务器配置 /etc/postfix/main.cfpostfix
-
(2) nginx相关文件:
- 检查默认nginx配置文件,并迁移至新Nginx服务
- 备份项:
-
# nginx配置文件,包含gitlab-http.conf文件 /var/opt/gitlab/nginx/conf/nginx.conf # gitlab核心nginx配置文件 /var/opt/gitlab/nginx/conf/gitlab-http.conf /etc/nginx/conf.d/test-betawm-com.conf
-
文件打包
mkdir gitlab_backup-files
cd gitlab_backup-files/
cp /var/opt/gitlab/.ssh/authorized_keys .
cp /etc/gitlab/gitlab.rb .
cp /etc/gitlab/gitlab-secrets.json .
- 生成压缩包:
tar -zcvf gitlab_backup-files.tar.gz ./
2、数据备份
相关配置
gitlab.rb
文件:-
# 备份存档目录 gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" # 备份存档权限 gitlab_rails['backup_archive_permissions'] = 0644 # 备份生命周期为7天(604800 seconds) gitlab_rails['backup_keep_time'] = 604800
-
备份命令
- 默认备份目录:
/var/opt/gitlab/backups/
(1) Linux安装(Omnibus 包)
- GitLab 12.1 及之前版本:
gitlab-rake gitlab:backup:create
- GitLab 12.2 及之后版本:
gitlab-backup create
(2) Docker安装
- GitLab 12.1 及之前版本:
docker exec -t <container name> gitlab-rake gitlab:backup:create
- GitLab 12.2 及之后版本:
docker exec -t <container name> gitlab-backup create
gitlab-backup 备份说明
可选参数:
- BACKUP: 备份文件名为
[TIMESTAMP]_gitlab_backup.tar
,该参数可以自定义[TIMESTAMP]
部分的名称 - STRATEGY=copy: 添加此参数不需要停止服务,但是需要增加一倍存储空间
- SKIP: 备份中排除特定目录
- GITLAB_BACKUP_MAX_CONCURRENCY: 同时备份的最大项目数。默认为逻辑CPU的数量(在GitLab14.1及之前版本中,默认为1)
- GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY: 每个存储上同时备份的最大项目数。默认为2(在GitLab14.1及更早版本中,默认为1)
- INCREMENTAL=yes: 增量备份
执行备份:
sudo gitlab-backup create STRATEGY=copy GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=2
针对数据量较大的情况:
- 场景:
- ssh连接服务器都会有会话时长的限制,备份大文件可能会出现由于ssh远程连接时超时而备份中断的情况
- 方案一、服务端更改配置:
- 修改配置文件
/etc/ssh/sshd_config
-
# 如果客户端长时间没有操作,断开的时间为:ClientAliveInterval * ClientAliveCountMax # 指定了服务器端向客户端发送消息的间隔,单位为s #ClientAliveInterval 0 # 服务器端发送消息后客户端没有响应的次数限制,达到自动断开 #ClientAliveCountMax 3
- 修改配置文件
- 方案二、命令后台执行:
nohup gitlab-backup create STRATEGY=copy GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=2 > /log/gitlab-backup_log.txt 2>&1 &
备份说明
目录名称 | 备份文件说明 |
---|---|
db | 数据库备份,主要为PostgreSQL数据内容 |
uploads | 附件数据备份 |
repositories | Git仓库数据备份 |
builds | CI Job输入日志等数据备份 |
artifacts | CI Job构件数据备份 |
lfs | LFS对象数据备份 |
registry | 容器镜像备份 |
pages | GitLab Pages content数据备份 |
3、停止GitLab服务
- 为保障数据一致性和数据完整性,停止GitLab服务防止用户操作
gitlab-ctl stop
gitlab-ctl status
二、GitLab 恢复
Linux安装(Omnibus 包)
1、文件准备
- 传送备份文件包
- 解压压缩包:
tar -zxvf gitlab_backup-files.tar.gz ./
- 恢复配置文件:
mv /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bak
mv gitlab_backup-files/gitlab.rb /etc/gitlab/
- 恢复db secret信息:
cp gitlab_backup-files/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json
chown git.git /etc/gitlab/gitlab-secrets.json
- 恢复公钥文件:
cp gitlab_backup-files/authorized_keys /var/opt/gitlab/.ssh/authorized_keys
chown git.git /var/opt/gitlab/.ssh/authorized_keys
- 其他文件根据使用情况恢复
2、数据恢复前置条件
- 安装了与创建备份的 GitLab Omnibus 完全相同的版本和类型 (CE/EE) 。
- 至少执行过一次:
gitlab-ctl reconfigure
- GitLab正在运行(
sudo gitlab-ctl start
) - 备份的数据tar文件位于配置文件(
gitlab.rb
)中描述的备份目录(gitlab_rails['backup_path']
)中,默认值为/var/opt/gitlab/backups
,它需要归git用户所有:cp xxxxx-ce_gitlab_backup.tar /var/opt/gitlab/backups/
chown git:root /var/opt/gitlab/backups
chown git.git /var/opt/gitlab/backups/xxxxx-ce_gitlab_backup.tar
chmod -R 755 /var/opt/gitlab/backups
- 停止连接到数据库的进程。让GitLab的其余部分保持运行:
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
- 检查状态:
gitlab-ctl status
3、gitlab-backup 备份说明
可选参数:
BACKUP=timestamp_of_backup
:如果存在多个备份,则需要(_gitlab_backup.tar之前的部分)force=yes
:不询问是否应重新生成authorized_keys 文件,并假定“是”以警告有关数据库表被删除、启用“写入authorized_keys 文件”设置以及更新LDAP 提供程序
恢复备份:
- GitLab 12.1 及之前版本:
gitlab-rake gitlab:backup:restore
- GitLab 12.2 及之后版本:
gitlab-backup restore BACKUP=xxxx-ce
- 手动恢复期间需要多次输入yes
报错解决:
-
Unpacking backup ..rake aborted! Errno:EBADF:Bad file descriptor Q io_fillbuf fd:0 <STDIN>
- 为备份文件赋权:
chown git.git /var/opt/gitlab/backups/xxxxx-ce_gitlab_backup.tar
针对数据量较大的情况:
- 后台执行:
nohup gitlab-backup restore force=yes BACKUP=xxxx-ce > /log/gitlab-backup_restore.log 2>&1 &
- 直接使用
gitlab-backup restore BACKUP=xxxx-ce
,导致恢复备份会中断
- 解决方案 ———— GitLab非交互恢复的方法:
- ① 命令中指定
force=yes
- ② HereDocument的方式:(不适用于后台执行)
-
gitlab-rake gitlab:backup:restore BACKUP=1597188417 <<EOF > yes > yes > EOF
-
- ① 命令中指定
4、后续操作
(示例为GitLab 12.2 及之后版本,GitLab 12.1 及之前版本使用gitlab-rake gitlab:backup:restore
命令替换)
- 重新配置、重启 GitLab:
gitlab-ctl reconfigure
gitlab-ctl restart
- 检查数据库值可以被解密(13.1版本以上):
gitlab-rake gitlab:doctor:secrets
- 完整性检查:
gitlab-rake gitlab:check SANITIZE=true
gitlab-rake gitlab:artifacts:check
gitlab-rake gitlab:lfs:check
gitlab-rake gitlab:uploads:check
Docker安装
1、停止连接到数据库的进程
docker exec -it <name of container> gitlab-ctl stop puma
docker exec -it <name of container> gitlab-ctl stop sidekiq
2、检查状态
docker exec -it <name of container> gitlab-ctl status
3、恢复备份
docker exec -it <name of container> gitlab-backup restore BACKUP=xxxx-ce
4、重新启动
docker restart <name of container>
5、完整性检查
docker exec -it <name of container> gitlab-rake gitlab:check SANITIZE=true
三、GitLab 定期备份
前置准备
yum install vixie-cron
yum install crontabs
crontab 说明
- 定期备份需要借助 crond 服务工具
- crontab定时调度任务指令说明:
-
# Example of job definition: # .---------------- minute (0 - 59) 分钟 # | .------------- hour (0 - 23) 小时 # | | .---------- day of month (1 - 31) 日期 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 月份 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 星期 # | | | | | # * * * * * user-name command to be executed
-
配置定期备份
定期备份计划:
- 每天增量备份,每周全量备份,备份生命周期8天
配置定时任务:
- root用户下操作
crontab -e
- GitLab 12.2 及之后版本:
-
# CRON=1 备份脚本隐藏报错外的所有进度输出 # 每天2点增量备份一次 0 2 * * * /opt/gitlab/bin/gitlab-backup create GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=2 CRON=1 INCREMENTAL=yes # 每周日晚11点全量备份一次 0 23 * * 0 /opt/gitlab/bin/gitlab-backup create GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY=2 CRON=1
- GitLab 12.1 及之前版本:
-
# 每周日晚11点全量备份一次 # 每天2点增量备份一次 0 2 * * * root /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1 INCREMENTAL=yes # CRON=1 备份脚本隐藏报错外的所有进度输出 0 23 * * 0 root /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
重新加载配置:
service crond reload
重启cron服务:
service crond restart
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbbebh
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01