## 前言
前端时间公司服务被矿机攻击,整个gitlab服务被矿机杀死,导致公司内部的git服务全面宕机,整个回复过程苦不堪言,在此就就不一一赘述了。一句话,勤冷备,多热备。
## 正文
### 备份配置
- 修改备份文件目录
可以通过`/etc/gitlab/gitlab.rb`配置文件来修改默认存放备份文件的目录
`gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"`
修改完成之后使用`gitlab-ctl reconfigure`命令重载配置文件即可
- 设置备份过期时间
编辑`/etc/gitlab/gitlab.rb`文件
找到`gitlab_rails['backup_keep_time'] = 604800`,备份时间以秒为单位
- gitlab自动备份
创建定时任务
```bash
crontab -e
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create
```
### 原gitlab备份
> 注意,备份时需要保持gitlab处于正常运行状态。
- 在任意目录下执行备份命令
```bash
gitlab-rake gitlab:backup:create
```
> 如果没有更改过gitlab备份文件的配置信息,那么使用以上命令会在`/var/opt/gitlab/backups`目录下创建一个名称类似为`1576260022_2019_12_13_11.1.4_gitlab_backup.tar`的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的`1576260022_2019_12_13_11.1.4`是备份创建的日期,这里只是一个示例,注意后续备份还原使用你自己的日期编号。
- 将配置文件进行备份
- `/etc/gitlab/gitlab.rb` 配置文件须备份
- `/var/opt/gitlab/nginx/conf nginx`配置文件
- `/etc/postfix/main.cfpostfix` 邮件配置备份
### gitlab迁移
> - 迁移有两大要点:
> - 在新服务器上安装相同版本的gitlab
> - 将备份生成的备份文件发送到新服务器的相同目录下
>
> 此两点有任何不一致,都可能导致数据迁移失败。
- 在新服务器上运行一个相同版本的gitlab服务
- 在老服务器上将备份文件发送至新服务器的相应目录下
```bash
scp /var/opt/gitlab/backups/1576260022_2019_12_13_11.1.4_gitlab_backup.tar root@你的IP地址:/var/opt/gitlab/backups/
```
- gitlab数据恢复
停止相关数据连接服务
```bash
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
```
修改权限,如果是从本服务器恢复可以不修改
```bash
chmod 777 /var/opt/gitlab/backups/1576260022_2019_12_13_11.1.4_gitlab_backup.tar
```
从`1576260022_2019_12_13_11.1.4`编号备份中恢复
```bash
gitlab-rake gitlab:backup:restore BACKUP=1576260022_2019_12_13_11.1.4
```
按照提示输入两次yes并回车
![][image-1]
- 启动gitlab
```bash
gitlab-ctl start
```
- 浏览新的gitlab服务地址,使用原gitlab的账号登陆页面,登陆成功即数据迁移完成。
> 在实际情况中访问gitlab可能是用域名访问,我们可以修改gitlab配置文件中的url再进行备份,这样就不会影响迁移过程,恢复完成后需要进行的只是修改域名对应的dns解析ip地址
### gitlab升级(可选)
> 此操作不是必要的,只为数据迁移前后gitlab版本不统一时的备用方案。
- 关闭gitlab服务
```bash
gitlab-ctl stop
```
- 备份
```
gitlab-rake gitlab:backup:create
```
- 下载新版gitlab的rpm包安装,安装时选择升级
> 安装的过程中可能会出现报错,`Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]'`,解决方法为设置权限:`chmod 2770 /var/opt/gitlab/git-data/repositories`
- 安装成功后重新加载配置并启动
```bash
gitlab-ctl reconfigure
gitlab-ctl restart
```
### gitlab更改默认的nginx(可选)
- 编辑`/etc/gitlab/gitlab.rb`文件
在文件内找到如下位置,不启用Nginx
```bash
nginx['enable'] = false
```
- 检查默认nginx配置文件,并迁移至新Nginx服务
nginx配置文件,包含gitlab-http.conf文件
```bash
/var/opt/gitlab/nginx/conf/nginx.conf
```
gitlab核心nginx配置文件
```bash
/var/opt/gitlab/nginx/conf/nginx.conf
```
- 重启 nginx、gitlab服务
```bash
gitlab-ctl restart
systemctl restart nginx.service
```
> 访问可能出现报502。原因是nginx用户无法访问gitlab用户的socket文件。 重启gitlab需要重新授权
>
> ```bash
> chmod -R o+x /var/opt/gitlab/gitlab-rails
> ```
## 后记
感谢[原作者][text-1]的辛勤付出~
enjoy~
[image-1]: https://blog.chihiro.org.cn/upload/2019/12/gitlab%E6%95%B0%E6%8D%AE%E8%BF%98%E5%8E%9F-1a8e1ce0e0c0476e8f854eec5bcf0055.png
[text-1]: https://www.cnblogs.com/ssgeek/p/9392104.html

Gitlab备份、迁移、恢复和升级