Contents
  1. 1. 系统环境
  2. 2. Docker compose
    1. 2.1. 安装
    2. 2.2. 配置文件
  3. 3. Gitlab安装
  4. 4. Gitlab恢复备份
    1. 4.1. 上传备份文件
    2. 4.2. 恢复备份
  5. 5. 致谢&参考

git代码托管无疑是广大程序员们的福音,线上产品除了强大的Github,允许免费自建线上私有库的bitbucket,可以在本地搭建自有git服务的,首推gitlab了,这里就不打广告了,直接进入正题,这篇blog就详细介绍一下搭建gitlab服务,以及备份和恢复时遇到的一些问题以及解决的办法。

系统环境

按照惯例,还是列一下我们用到的系统环境和软件版本信息:

  • RHEL/CentOS 7
  • Dokcer & Docker compose

一个完善的gitlab本地环境包括3个必备的组建,首先是gitlab本身,然后是数据库postgresql还有redis,如果我们依次去搭建这些环境,过程会很痛苦(在github上发现sameersbn的docker-gitlab之前,我尝试着按照gitlab的官方指南手动搭建,有点累。。。),所以借助docker-compose基本上就是一键搭建了。

Docker compose

安装

Docker compose是啥就不多科普了,自行google去,compose的安装详见官网install compose,提醒几点:

  1. 如果是在Mac环境下,docker自带了compose,无需另行安装
  2. 如果是linux环境下,首先确保以下依赖包安装好了py-pip, python3-dev, libffi-dev, openssl-dev, gcc, libc-dev, rust, cargo and make
  3. gitlab本身还是挺吃CPU和内存的,笔者的顶配MBP19,跑gitlab还有点点反应慢,而且安装和恢复备份时,更是耗时许久,所以有条件的话,还是在服务器上安装处理吧

配置文件

我们假设你计划将gitlab安装到/app/gitlab目录下,那么整个目录结构如下:

1
2
3
4
5
6
/app/gitlab                 -- 根目录
├── data -- 存放数据文件目录
├──gitlab -- gitlab数据文件
├──redis -- redis数据文件
├──postgresql -- postgresql数据文件
├── docker-compose.yml -- compose的配置文件

实例的配置文件可以到docker-compose.yml实例这里查看,我们直接把我修改好的关键配置参数贴出来

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
version: '3'

services:
redis:
restart: always
# 这里可以选择最新版本
image: sameersbn/redis:4.0.9
command:
- --loglevel warning --protected-mode no
volumes:
# 冒号前的是我们的本地路径 Z表示允许容器之间共享访问
- /app/gitlab/data/redis:/var/lib/redis:Z

postgresql:
restart: always
# 同理版本号可换
image: sameersbn/postgresql:10
volumes:
- /app/gitlab/data/postgresql:/var/lib/postgresql:Z
environment:
- DB_USER=your user's account
- DB_PASS=account password
- DB_NAME=database name
- DB_EXTENSION=pg_trgm

gitlab:
restart: always
# 注意这里的版本号,如果是新迁移的gitlab,需要和你备份中的gitlab大版本保持一致
image: sameersbn/gitlab:11.10.4
depends_on:
- redis
- postgresql
ports:
# 端口映射
- "10080:80"
- "10022:22"
volumes:
# 同理冒号前的为本地目录
- /app/gitlab/data/gitlab:/home/git/data:Z
environment:
- DEBUG=false

- DB_ADAPTER=postgresql
- DB_HOST=postgresql
- DB_PORT=5432
- DB_USER=your user's account
- DB_PASS=account password
- DB_NAME=database name

- REDIS_HOST=redis
- REDIS_PORT=6379

- TZ=Asia/Shanghai
- GITLAB_TIMEZONE=Beijing

- GITLAB_HTTPS=false
- SSL_SELF_SIGNED=false

- GITLAB_HOST=your host's ip address
- GITLAB_PORT=10080
- GITLAB_SSH_PORT=10022
- GITLAB_RELATIVE_URL_ROOT=
- GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string
- GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string
- GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string

- GITLAB_ROOT_PASSWORD=root user's passwrod
- GITLAB_ROOT_EMAIL=root user's email

- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
- GITLAB_NOTIFY_PUSHER=false

- GITLAB_EMAIL=email address
- GITLAB_EMAIL_REPLY_TO=email address
- GITLAB_INCOMING_EMAIL_ADDRESS=email address

# 自动备份
- GITLAB_BACKUP_SCHEDULE=daily
- GITLAB_BACKUP_TIME=01:00

# 邮件服务信息
- SMTP_ENABLED=true
- SMTP_DOMAIN=smtp.mxhichina.com
- SMTP_HOST=smtp.mxhichina.com
- SMTP_PORT=465
- SMTP_USER=
- SMTP_PASS=
- SMTP_STARTTLS=true
- SMTP_TLS=true
- SMTP_AUTHENTICATION=login

重要的信息我都在注释中完善了,完整的配置文件可以去github上拉取。

Gitlab安装

配置好了docker compose之后,gitlab的安装就异常简单了,首先cd到我们的yml文件所在目录下,本文示例为/app/gitlab,然后直接执行以下命令

1
docker-compose up -d

Tips:

  1. 如果遇到ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-4f95b57fe060 -j RETURN: iptables: No chain/target/match by that name错误,需要重启docker,systemctl restart docker之后就好了
  2. -d命令(detach mode)只显示容器的创建信息,如果不带-d的话,命令行会一直输出容器内的一些运行日志
  3. 初次安装可能要耗费5分钟左右,取决于你的服务器配置以及网络带宽。

待安装完成后,就可以访问localhost:10080地址来进行本地gitlab的操作了,当然如果碰到502等情况,那是因为虽然容器运行了,但是内部的某些服务还没有完全起来,耐心一点,刷新页面试一试就好。

Gitlab恢复备份

当所有容器都运行之后,我们会在/app/gitlab/data/gitlab目录下发现一系列目录,其中backups目录就是存放gitlab的备份文件地址,每天自动生成的备份会存放在这个目录下。如果你想恢复一份其他地方来的gitlab仓库,只需要把对应的tar备份文件放到该目录下,然后执行恢复备份的相关命令就好了。
这里我们就详细记录下如何恢复一个已有的gitlab仓库。

注:当恢复一个已有的gitlab仓库文件时,需要保持gitlab的版本号一致

上传备份文件

将你手头的备份文件上传至/app/gitlab/data/gitlab/backups目录下,同时修改该文件的权限和目录权限保持一致,否则后续操作会提示文件权限问题。

恢复备份

正常情况下,直接执行以下命令即可完成文件的恢复:

1
docker-compose run --rm gitlab app:rake gitlab:backup:restore BACKUP=***

我们假设目录下存放的备份文件是1529921023_2018_06_25_11.0.0_gitlab_backup.tar,则命令行中输入的名字只需要1529921023_2018_06_25_11.0.0即可。
在gitlab版本11.10.4,就是笔者的这个版本,利用compose自动恢复备份的命令有bug,会提示GRPC::Unavailable: 14:Connect Failed,所以参见restoring backup leads to error这个方法可以手动恢复备份。

  1. Starting the gitlab container
  2. Enter the gitlab’s bash shell
  3. Execute /sbin/entrypoint.sh app:rake gitlab:backup:restore to restore a backup
  4. When restore finish, just restart gitlab container, and all is done.
1
2
docker exec -it gitlab_gitlab_1 bash
/sbin/entrypoint.sh app:rake gitlab:backup:restore

命令执行过程中,会列出来存放于backups目录下的所有备份文件,这个时候,需要在命令行中输入完整的文件名称,例如本文中的1529921023_2018_06_25_11.0.0_gitlab_backup.tar,备份就会继续执行下去了。

接下来就是漫长的等待恢复过程了,恢复成功后,gitlab相关的所有信息,包括snappets也都会一并恢复。

致谢&参考

Contents
  1. 1. 系统环境
  2. 2. Docker compose
    1. 2.1. 安装
    2. 2.2. 配置文件
  3. 3. Gitlab安装
  4. 4. Gitlab恢复备份
    1. 4.1. 上传备份文件
    2. 4.2. 恢复备份
  5. 5. 致谢&参考