GitLab 安装、备份、恢复与升级

GitLab 安装、备份、恢复与升级

1 前置工作

1.1 操作系统

准备一台装有 Centos7(8) Linux 操作系统的机器。
由于要安装 docker ,根据 docker 官方说明,支持 x86_64 / amd64 和 ARM64 / AARCH64 两种架构的操作系统,本示例安装的 x86_64 Centos7 Linux (之前开始用 GitLab 时,官方还未正式支持 Centos8)。
Centos7 系统镜像下载地址:http://isoredirect.centos.org/centos/7/isos/x86_64/
Centos8 系统镜像下载地址:http://isoredirect.centos.org/centos/8/isos/x86_64/
如果系统还没安装,可以通过该地址进行下载镜像,进行系统安装。
根据本人经验(官方未找到相关说明), 机器配置至少 8G 内存(目前在用的机器一般使用都是在 6G 左右),4核 2U 。当然,配置越高越好。
以下为当前示例机器刚启动服务时的资源占用情况:
image.png

1.2 Docker 安装(资源仓库在线安装)

使用该方式的前提条件是所安装的机器可以连接互联网。

1.2.1 移除机器上旧版本相关安装内容

新机器可以不做该操作

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

1.2.2 使用仓库进行安装

1.2.2.1 安装 yum-utils

1
sudo yum install -y yum-utils

1.2.2.2 添加 docker 仓库源

1
2
3
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

1.2.3 安装 docker 相关

1
sudo yum install docker-ce docker-ce-cli containerd.io

image.png

1.2.4 启动 docker

1
sudo systemctl start docker

1.2.5 测试 docker 安装是否成功

1
sudo docker run hello-world

1.2.6 设置开机启动

1
sudo systemctl enable docker

1.2.7 安装 Compose

  1. 运行命令下载 Compose
1
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 应用执行权限
1
sudo chmod +x /usr/local/bin/docker-compose
  1. 验证安装结果
1
docker-compose --version

img

2 GitLab 安装

2.1 设置 GitLab 卷位置(docker 宿主机的文件目录)

在命令行执行以下命令:

1
export GITLAB_HOME=/srv/gitlab

GitLab容器使用主机挂载的卷来存储持久数据:

主机位置 容器位置 用途
$GITLAB_HOME/data /var/opt/gitlab 应用存储应用数据
$GITLAB_HOME/logs /var/log/gitlab 用于存储应用日志
$GITLAB_HOME/config /etc/gitlab 用于存储 GitLab 配置文件

2.2 安装

  1. 创建 docker-compose.yml 文件在你的 linux 主机上

docker-compose.yml 建议备份该文件,用于后续升级。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
web:
image: 'gitlab/gitlab-ee:latest'
container_name: gitlab2021
restart: always
hostname: '192.168.44.6'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.44.6:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '8929:8929'
- '2224:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'

如果安装一个版本是为了恢复以前 gitlab 的数据,需要保证 image 版本一致。image: ‘gitlab/gitlab-ee:latest’ latest  需要换成指定版本的号,例如我这里是 13.6.1-ee.0

image.png

  1. 拉取 GitLab 镜像 并后台启动

在 docker-compose.yml 文件目录下执行以下命令

1
docker-compose up -d

该操作会等待比较久,大概1000M的下载量。

  1. 访问地址测试是否安装成功

本例中的访问地址为:http://192.168.44.6:8929/users/sign_in

2.3 配置

本例中 GitLab 系统的配置文件在该目录下($GITLAB_HOME/config): /srv/gitlab/config/gitlab.rb

2.3.1 LDAP

该配置主要用于开启公司域账号登录。

  1. 在 /srv/gitlab/config/gitlab.rb 文件中添加以下配置:

可以在该文件中搜索 ldap ,找到指定注释掉的地方,将该内容粘贴进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' ###! **remember to close this block with 'EOS' below**
main: # 'main' is the GitLab 'provider ID' of this LDAP server
label: '域用户'
host: '192.168.0.xx'
port: 389
uid: 'sAMAccountName'
bind_dn: 'CN=xxxx,OU=研发xx,OU=思路xx,DC=domain,DC=solution,DC=com'
password: 'xxxxx'
encryption: 'plain' # "tls" or "ssl" or "plain"
#bind_dn: 'OU=思路xx,DC=domain,DC=solution,DC=com'

active_directory: true
allow_username_or_email_login: true
block_auto_created_users: false
base: 'dc=domain,dc=solution,dc=com'
user_filter: '(userPrincipalName=*)'
EOS
  1. 执行命令使配置生效

gitlab2021 为 docker 容器ID或者容器名称,运行后最后一行为“gitlab Reconfigured!”才说明是加载新配置成功,否则就是根据报错信息找错误。

1
docker exec -t gitlab2021 gitlab-ctl reconfigure
  1. 执行命令查看 ldap 配置是否正常

执行命令后能查询出用户信息列表即正常

1
docker exec -t gitlab2021 gitlab-rake gitlab:ldap:check

image.png

2.3.2 SMTP

该配置主要用于开启使用公司 exchange服务器的 SMTP协议 发送邮件通知。

  1. 在 /srv/gitlab/config/gitlab.rb 文件中添加以下配置:

可以在文件中搜索 smtp ,按照以下配置解开注释并修改值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "192.168.0.x"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "zhangsan"
gitlab_rails['smtp_password'] = "xxxxxx"
gitlab_rails['smtp_domain'] = "thsdomain"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_ssl'] = false
gitlab_rails['smtp_force_ssl'] = false

gitlab_rails['smtp_openssl_verify_mode'] = 'none'

gitlab_rails['gitlab_email_enabled'] = true

gitlab_rails['gitlab_email_from'] = 'zhangsan@xxx.ths.com.cn'

gitlab_rails['gitlab_email_display_name'] = 'git server'
  1. 执行命令使配置生效
1
docker exec -t gitlab2021 gitlab-ctl reconfigure
  1. 依次输入以下命令,检查 smtp 配置是否正确
1
2
3
4
5
6
// 进入容器所在的 bash
docker exec -it gitlab2021 bin/bash
// 在容器所在的 bash 中执行 gitlab-rails console
gitlab-rails console -e production
// 测试邮件发送,如无错误产生,查看目标邮箱是否有邮件收到
Notify.test_email('liuyx@xxx.ths.com.cn','Message Subject','message Body').deliver_now

3 备份

3.1 编写备份脚本

在 linux 上创建备份脚本文件,本例中在目录 /srv 下创建 gitlab_backup.sh,内容为以下内容:

该脚本会执行指定 GitLab 所在容器内的备份命令,备份除了 artifacts 外的所有内容(配置文件除外),gitlab2021为容器ID或容器名称

1
2
#! /bin/bash
docker exec -t gitlab2021 gitlab-backup create SKIP=artifacts

如需手动立即执行备份,可在该脚本文件所在目录下命令行窗口执行以下命令或直接执行脚本内命令:

1
sh gitlab_backup.sh

image.png

3.2 编写自动上传备份文件到远程服务器脚本(ssh 免密上传)

在 linux 上创建备份脚本文件,本例中在目录 /srv 下创建 auto_backup_to_remote.sh,内容为以下内容:

该脚本执行后会将本机指定目录下的备份文件上传到远程服务器的指定目录上。远程的备份的服务器需要支持SSH 免密上传,windows 系统配置可参看另外一篇文章https://ths.js.org/2021/02/04/Windows-OpenSSH%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/ 《Windows OpenSSH 安装与配置》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/bash

# gitlab 备份路径,该路径为 gitlab 默认的备份路径

LocalBackDir=/srv/gitlab/data/backups

# 远程备份服务器 gitlab备份文件将传送到该路径

RemoteBackDir=/gitlabDataBackup

# 远程备份服务器 登录账户

RemoteUser=administrator

# 远程备份服务器 IP地址

RemoteIP=192.168.0.231

#当前系统日期

DATE=`date +"%Y-%m-%d"`

#Log存放路径

LogFile=$LocalBackDir/log/$DATE.log

# 查找 本地备份目录下 时间为60分钟之内的,并且后缀为.tar的gitlab备份文件

# BACKUPFILE_SEND_TO_REMOTE=$(find /data/gitlabData/backups -type f -mmin -60 -name '*.tar*')
BACKUPFILE_SEND_TO_REMOTE=$(find /srv/gitlab/data/backups -type f -mmin -60 -name '*.tar*')
#新建日志文件

touch $LogFile

#追加日志到日志文件

echo "Gitlab auto backup to remote server, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile

echo "---------------------------------------------------------------------------" >> $LogFile

# 输出日志,打印出每次scp的文件名

echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile



#备份到远程服务器

scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP:$RemoteBackDir

# 查找本地备份路径下,超过3天 且文件后缀为.tar 的 Gitlab备份文件 然后删除

find $LocalBackDir -type f -mtime +3 -name '*.tar*' -exec rm {} \;
echo "删除$(find $LocalBackDir -type f -mtime +3 -name '*.tar*')3天前文件成功, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile

#追加日志到日志文件

echo "---------------------------------------------------------------------------" >> $LogFile

3.3 设置系统定时任务,执行脚本

编辑 /etc/crontab 系统配置文件,新增以下内容:

该配置会在凌晨两点执行备份脚本,3点执行备份上传远程服务器脚本。

1
2
00 02    * * *   root   sh /srv/gitlab_backup.sh
00 03 * * * root /srv/auto_backup_to_remote.sh

重启服务

1
systemctl restart crond

3.4 配置文件备份

以上备份命令不会备份配置文件,需手动进行备份。
备份文件路径:/srv/gitlab/config(建议整个目录都备份)
gitlab.rb 每次修改配置后需要进行备份。
gitlab-secrets.json 建议进行迁移或者升级前进行备份。

GitLab提供的备份 Rake 任务不存储配置文件。主要原因是包含了用于双因素身份验证的加密信息和 CI/CD 安全变量。将加密信息与密钥存储在同一位置就违背了使用加密的目的。

4 恢复

在执行恢复之前,需要安装好一个正常的 GitLab ,版本要跟备份文件的 GitLab 版本一致。

4.1 恢复配置文件

将 gitlab.rb 、 gitlab-secrets.json等config目录之前备份的文件拷贝到新安装的 GitLab 对应目录下(本示例为/srv/gitlab/config)

4.2 恢复数据

  1. 将要恢复的备份数据拷贝到将要恢复的 GitLab 所在的机器上(/srv/gitlab/data/backups/)。

image.png

  1. 依次执行以下命令
1
2
3
4
5
6
docker exec -it gitlab2021 bin/bash
gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq
# Verify
gitlab-ctl status
  1. 指定在第一步拷贝过来的备份文件进行恢复
1
2
# 接着第二步中的命令继续执行以下命令
gitlab-backup restore BACKUP=1616176926_2021_03_19_13.6.1-ee

img
出现以上内容,输入 yes 继续。
恢复过程中出现以下错误,可以忽略(目前没有发现有什么影响)。
image.png

  1. 启动
1
gitlab-ctl start

4.3 常见问题

  1. 在执行恢复数据时,出现以下问题

image.png
分析:备份文件与要恢复的 GitLab 版本要保持一致。
解决:方法一,安装与备份文件相同的版本的 GitLab 后进行备份
方法二,将老系统升级到与新的 GitLab 版本一致,然后手动立即进行一次备份生成备份文件,使用该备份文件进行还原。

  1. 未完待续…..

5 升级

5.1 执行升级操作

  1. 升级前需要先进行手动备份。
  2. 找到最初安装 GitLab 时的 docker-compose.yml 文件,在该目录下执行以下命令

注意查看该文件内的 image 配置项,如果是 gitlab/gitlab-ee:latest ,则可安装最新的企业版本,也可修改latest 指定版本

1
2
3
export GITLAB_HOME=/srv/gitlab
docker-compose pull
docker-compose up -d
  • 执行以上命令后需等待几分钟(以下截图属于正常现象),几分钟后查看 GitLab 网址是否正常。

image.png
image.png
升级前截图:
image.png
升级后截图:

image.png

5.2 常见问题

  1. 镜像文件下载完成后,启动失败。

image.png
分析:可能是网络原因。
解决:重新执行即可。

作者

刘莹鑫

发布于

2021-04-17

更新于

2021-08-04

许可协议

CC BY-NC-SA 4.0

评论