Ubuntu 使用 Docker 安装 Gitlab

前言

最近帮公司重新搭建了 Gitlab,中间遇到了一些坑,折腾了不少时间,在此记录供大家参考。


正文

安装 Docker CE

卸载旧版本

如果有使用旧版本的 Docker (称为 docker 或者 docker-engine),请使用下列命令卸载。

1
2
3
$ sudo apt-get remove docker \
docker-engine \
docker.io

安装前准备

Ubuntu 14.04

从 Ubuntu 14.04 开始,一部分内核模块移到了可选内核模块包 (linux-image-extra-*) ,以减少内核软件包的体积。正常安装的系统应该会包含可选内核模块包,而一些裁剪后的系统可能会将其精简掉。AUFS 内核驱动属于可选内核模块的一部分,作为推荐的 Docker 存储层驱动,一般建议安装可选内核模块包以使用 AUFS。

如果系统没有安装可选内核模块的话,可以执行下面的命令来安装可选内核模块包:

1
2
3
4
5
$ sudo apt-get update
$ sudo apt-get install \
linux-image-extra-$(uname -r) \
linux-image-extra-virtual

使用 APT 安装

由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。

1
2
3
4
5
6
7
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

添加国内下载源(官方源在注释中)

首先为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

1
2
3
4
5
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

然后,向 source.list 中添加 Docker 软件源:

1
2
3
4
5
6
7
8
9
10
11
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 官方源
# $ sudo add-apt-repository \
# "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
# $(lsb_release -cs) \
# stable"

以上命令会添加稳定版本的 Docker CE APT 镜像源,如果需要测试或每日构建版本的 Docker CE 请将 stable 改为 test 或者 nightly。

安装 Docker CE

更新 apt 软件包缓存,并安装 docker-ce:

1
2
3
$ sudo apt-get update
$ sudo apt-get install docker-ce

使用脚本自动安装

同时也可以选择使用下列脚本快速安装:

1
2
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

执行脚本自动安装 Docker CE。

启动 Docker CE

1
2
$ sudo systemctl enable docker
$ sudo systemctl start docker

Ubuntu 14.04 请用下列命令启动:

1
$ sudo service docker start

安装 Gitlab

我们使用 sameersbn/gitlab Gitlab 镜像,Github 地址:https://github.com/sameersbn/docker-gitlab
首先我们安装 docker-compose

1
sudo pip install docker-compose -U

然后下载 sameersbn/gitlab Gitlab 镜像的 docker-compose.yml 文件:

1
wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
version: '2'
services:
redis:
restart: always
image: sameersbn/redis:4.0.9-1
command:
- --loglevel warning
volumes:
# redis 储存空间挂载到外部
- /data/gitlab/redis:/var/lib/redis:Z
postgresql:
restart: always
image: sameersbn/postgresql:10
volumes:
# postgresql 储存空间挂载到外部
- /data/gitlab/postgresql:/var/lib/postgresql:Z
environment:
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production
- DB_EXTENSION=pg_trgm
gitlab:
restart: always
# 此处应注意修改为 9.2.5 版本,最新版通过 repo by URL 从其他仓库迁移过来的项目使用 create merge request 时会出现 503 bug
image: sameersbn/gitlab:9.2.5
depends_on:
- redis
- postgresql
ports:
# 将容器中的 80、443、22 端口映射到宿主机
- "127.0.0.1:10080:80"
- "127.0.0.1:10443:443"
- "10022:22"
volumes:
# gitlab 储存空间挂载到外部
- /data/gitlab/gitlab:/home/git/data:Z
environment:
- DEBUG=false
- DB_ADAPTER=postgresql
- DB_HOST=postgresql
- DB_PORT=5432
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production
- REDIS_HOST=redis
- REDIS_PORT=6379
- TZ=Asia/Kolkata
- GITLAB_TIMEZONE=Kolkata
- GITLAB_HTTPS=false
- SSL_SELF_SIGNED=false
# 此处需要改为你访问 gitlab 的域名或者IP
- GITLAB_HOST=xxx
# 如果访问时使用 http 为 80,https 则为 443
- GITLAB_PORT=80
- GITLAB_SSH_PORT=10022
- GITLAB_RELATIVE_URL_ROOT=
# 为了安全起见可以使用 pwgen -Bsv1 64 命令生成随机的 64 个字符串值替换下面三个变量的值
- 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
# 需要设置一个默认的 root 用户邮箱,密码不填第一次登录会让你自己设置
- GITLAB_ROOT_PASSWORD=
- GITLAB_ROOT_EMAIL=xxx@xxx.xxx
- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true
- GITLAB_NOTIFY_PUSHER=false
- GITLAB_EMAIL=notifications@example.com
- GITLAB_EMAIL_REPLY_TO=noreply@example.com
- GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com
- GITLAB_BACKUP_SCHEDULE=daily
- GITLAB_BACKUP_TIME=01:00
# 以下为 QQ 企业邮箱配置
- SMTP_ENABLED=true
- SMTP_DOMAIN=exmail.qq.com
- SMTP_HOST=smtp.exmail.qq.com
- SMTP_PORT=465
- SMTP_USER=xxx@xxx.xxx
- SMTP_PASS=password
- SMTP_STARTTLS=true
# SMTP_TLS 选项原始配置文件中没有,默认为 false,使用 QQ 企业邮箱一定要加上,否则无法发送邮件
- SMTP_TLS=true
- SMTP_AUTHENTICATION=login
- IMAP_ENABLED=false
- IMAP_HOST=imap.gmail.com
- IMAP_PORT=993
- IMAP_USER=mailer@example.com
- IMAP_PASS=password
- IMAP_SSL=true
- IMAP_STARTTLS=false
- OAUTH_ENABLED=false
- OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=
- OAUTH_ALLOW_SSO=
- OAUTH_BLOCK_AUTO_CREATED_USERS=true
- OAUTH_AUTO_LINK_LDAP_USER=false
- OAUTH_AUTO_LINK_SAML_USER=false
- OAUTH_EXTERNAL_PROVIDERS=
- OAUTH_CAS3_LABEL=cas3
- OAUTH_CAS3_SERVER=
- OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false
- OAUTH_CAS3_LOGIN_URL=/cas/login
- OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate
- OAUTH_CAS3_LOGOUT_URL=/cas/logout
- OAUTH_GOOGLE_API_KEY=
- OAUTH_GOOGLE_APP_SECRET=
- OAUTH_GOOGLE_RESTRICT_DOMAIN=
- OAUTH_FACEBOOK_API_KEY=
- OAUTH_FACEBOOK_APP_SECRET=
- OAUTH_TWITTER_API_KEY=
- OAUTH_TWITTER_APP_SECRET=
- OAUTH_GITHUB_API_KEY=
- OAUTH_GITHUB_APP_SECRET=
- OAUTH_GITHUB_URL=
- OAUTH_GITHUB_VERIFY_SSL=
- OAUTH_GITLAB_API_KEY=
- OAUTH_GITLAB_APP_SECRET=
- OAUTH_BITBUCKET_API_KEY=
- OAUTH_BITBUCKET_APP_SECRET=
- OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=
- OAUTH_SAML_IDP_CERT_FINGERPRINT=
- OAUTH_SAML_IDP_SSO_TARGET_URL=
- OAUTH_SAML_ISSUER=
- OAUTH_SAML_LABEL="Our SAML Provider"
- OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient
- OAUTH_SAML_GROUPS_ATTRIBUTE=
- OAUTH_SAML_EXTERNAL_GROUPS=
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=
- OAUTH_CROWD_SERVER_URL=
- OAUTH_CROWD_APP_NAME=
- OAUTH_CROWD_APP_PASSWORD=
- OAUTH_AUTH0_CLIENT_ID=
- OAUTH_AUTH0_CLIENT_SECRET=
- OAUTH_AUTH0_DOMAIN=
- OAUTH_AZURE_API_KEY=
- OAUTH_AZURE_API_SECRET=
- OAUTH_AZURE_TENANT_ID=

注:请注意有注释的变量!
主要有以下几个关键点:

  1. 将 Redis、PostgreSQL、Gitlab 的储存空间挂载到外部;
  2. sameersbn/gitlab 镜像的版本建议使用 10 以下,这里使用的 9.2.5。否则可能会有 bug;
  3. 设置 GITLAB_HOSTGITLAB_PORT,GITLAB_HOST 会在仓库地址中得到体现,如果你用域名访问此处就为域名,用 IP 访问此处为 IP。GITLAB_PORT 取决于访问 gitlab 的协议,http 为 80,https 则为 443;
  4. 设置一个 root 邮箱;
  5. 使用 QQ 企业邮箱发送邮件一定要加上 SMTP_TLS=true, 否则邮件发送不了。其他邮箱配置请参考 Gitlab 官方配置

在配置文件 docker-compose.yml 所在目录下执行下列命令启动 Gitlab:

1
sudo docker-compose up -d

Nginx 配置

http 协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
upstream gitlab {
server 127.0.0.1:10080;
}
server {
server_name git.xxx.xxx;
listen 80;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gitlab;
}
}

https 协议

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
upstream gitlab {
server 127.0.0.1:10080;
}
server {
listen 80;
server_name git.xxx.xxx;
rewrite ^/(.*)$ https://git.xxx.xxx/$1 permanent;
}
server {
server_name git.xxx.xxx;
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/xxx.crt;
ssl_certificate_key /etc/nginx/xxx.key;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://gitlab;
}
}

载入 Gitlab Nginx 配置

配置好相应的协议的配置文件,执行下列命令使其生效:

1
sudo nginx -s reload

访问域名即可进入 gitlab 首页。

参考

  1. Ubuntu 安装 Docker CE
  2. sameersbn/docker-gitlab
给我加个菜?