使用Docker部署GitLab服务并启用HTTPS

使用官方提供的 Docker 镜像部署 GitLab 非常方便,相关的安装配置文档也非常详细。本文主要是对一次成功的部署流程进行记录,方便下次快捷部署。

启动容器前的准备工作

拉取官方镜像

官方提供了「社区版」和「企业版」两种镜像,这里采用「社区版」进行部署,执行以下命令拉取最新的 Docker 镜像。如果需要其他的镜像标签,请查阅官方镜像仓库

1
docker pull gitlab/gitlab-ce:latest

创建挂载目录

在宿主机创建以下目录,这些目录将在启动 Docker 容器时进行挂载:

1
2
3
mkdir -p /data/gitlab-data/config
mkdir -p /data/gitlab-data/logs
mkdir -p /data/gitlab-data/data

调整配置文件

GitLab 通过 gitlab.rb 文件进行配置,我们需要调整外部链接、邮件、SSL 认证等配置。

配置邮件发送服务

1
2
3
4
5
6
7
8
9
10
gitlab_rails['gitlab_email_from'] = 'gitlab@your_domain.com'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "gitlab@your_domain.com"
gitlab_rails['smtp_password'] = "your_email_password"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

以上是腾讯企业邮箱的配置示例,部分邮箱服务商可能不支持第三方客户端以邮箱密码进行登录,那么就需要去服务商处获取别的授权密码进行登录。

开启 HTTPS

1
2
3
4
external_url 'https://gitlab.your_domain.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/fullchain.cer"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/your_domain.com.key"

external_url会影响 GitLab 中创建项目的 URL 地址,如果不配置,则默认使用容器的 hostname,即容器 ID,这里需要配置为 GitLab 服务的域名。

ssl_certificatessl_certificate_key用于配置 HTTPS 所需要的证书,这两份证书需要在启动 GitLab 时挂载到容器中。注意,如果external_url使用 https,那么这里就必须自己生成证书挂载进来,而不能依赖容器内部的 Nginx 自动生成证书,否则将无法访问 GitLab。

SSH 配置

1
2
gitlab_rails['gitlab_ssh_host'] = 'gitlab.your_domain.com'
gitlab_rails['gitlab_shell_ssh_port'] = 1022

gitlab_shell_ssh_port这里的端口会影响 GitLab 项目的 ssh 地址,所以直接配置宿主机映射的端口。

启动容器

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
--name gitlab \
--hostname gitlab.your_domain.com \
-p 10443:443 \
-p 1022:22 \
--restart always \
-v /path/to/your/certs:/etc/gitlab/ssl \
-v /data/gitlab-data/config:/etc/gitlab \
-v /data/gitlab-data/logs:/var/log/gitlab \
-v /data/gitlab-data/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

hostname和配置文件中的external_url对应,去掉协议名称。

由于我们使用 HTTPS 进行访问,所以这里将 443 端口映射出来即可,不必映射 80 端口。同样,ssh 的端口也要映射出来(如果不使用 SSH 协议进行代码的 pull 和 push,这里就不需要映射 SSH 端口),宿主机选择的 ssh 端口要和配置文件中gitlab_shell_ssh_port配置的端口一致。

GitLab 容器启动可能需要几分钟,执行docker logs -f 容器ID可以观察启动日志。

宿主机 Nginx 配置

这部分配置是可选的,主要是对 GitLab 服务做一个反向代理,以下是配置示例,都是非常基础的 HTTPS Server 配置,就不再赘述了。

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
server {
listen 80;
server_name gitlab.your_domain.com;
rewrite ^(.*) https://$host$1 permanent;
}

server {
listen 443 ssl;
server_name gitlab.your_domain.com;

ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_certificate /home/admin/.acme.sh/your_domain.com/fullchain.cer;
ssl_certificate_key /home/admin/.acme.sh/your_domain.com/your_domain.com.key;
ssl_trusted_certificate /home/admin/.acme.sh/your_domain.com/ca.cer;

ssl_dhparam /home/admin/.acme.sh/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

# 将请求代理到 GitLab 容器
location / {
proxy_redirect off;
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 https://127.0.0.1:10443;
}

# 对 GitLab 的静态资源访问也要做转发,否则页面样式可能出错
location ~ .*\.(js|css|png)$ {
proxy_pass https://127.0.0.1:10443;
}
}

搞定,收工!

容器启动成功后,打开浏览器访问 https://gitlab.your_domain.com 就可以看到 GitLab 的首页了。如果需要关闭注册入口,在Admin Area -> Settings -> Sign-up Restrictions位置将Sign-up enabled关闭掉即可。