使用Docker安装配置GitLab CE
本文介绍使用Docker在本地安装GitLab CE。写作本文时,使用的GitLab版本是13.5.4。
基本安装
使用Docker安装GitLab最基本的命令如下:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
上例中,容器名和容器系统的 hostname
都设置为 my-gitlab
。后续示例中,也基本会使用这个配置。容器这里只映射了 80
端口,其他的端口配置会在后续示例中说明。
容器启动成功后,可以在浏览器中通过 http://localhost 地址访问。在第一次访问里,会提示设置 root 密码:
映射目录
GitLab中主要三个目录需要被映射出来,分别是
- /etc/gitlab : 配置文件目录。GitLab的主要配置文件 gitlab.rb 保存在这个目录
- /var/opt/gitlab :GitLab的运行目录和数据保存目录
- /var/log/gitlab : GitLab的日志目录
如下例将这三个目录映射到宿主机:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
配置域名
GitLab的外部域名配置会影响URL生成和其他多个方面。例如在使用前文中的方式启动GitLab容器后,生成的clone URL如下图:
这个URL很可能使用的不是期望的对外域名。本节会介绍两种调整的方式。
指定容器hostname
在启动GitLab容器时,指定 hostname
:
docker run --name "my-gitlab" \
--hostname "my-gitlab.com" \
-p 80:80 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
当没有在配置文件 config/gitlab.rb 中配置 external_url
时,GitLab会读取系统的 hostname
作为域名:
修改配置
更可靠的方式是修改 config/gitlab.rb 中的 external_url
:
external_url 'http://my-gitlab.com'
保存后可以在GitLab容器中执行以下命令来查看配置变更:
# docker exec -it my-gitlab gitlab-ctl diff-config
diff --git a/etc/gitlab/gitlab.rb b/opt/gitlab/etc/gitlab.rb.template
index 5f49511..c322a57 100644
--- a/etc/gitlab/gitlab.rb
+++ b/opt/gitlab/etc/gitlab.rb.template
@@ -30,7 +30,6 @@
##! address from AWS. For more details, see:
##! https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
# external_url 'GENERATED_EXTERNAL_URL'
-external_url 'http://my-gitlab.com'
## Roles for multi-instance GitLab
##! The default is to have no roles enabled, which results in GitLab running as an all-in-one instance.
接下来可以执行以下命令使配置变更生效:
docker exec -it my-gitlab gitlab-ctl reconfigure
命令执行成功后,可以看到和设置容器hostname
同样的效果。
创建新项目
创建新项目时显示的项目URL前缀只和浏览器当前host有关,和其他配置没有关系,也不会影响其他地方的URL。比如修改本地 hosts 文件将域名设置为一个任意值后,访问GitLab:
开启HTTPS
如果要在GitLab自带的Nginx上开启HTTPS, 需要进行以下配置。
首先,在启动容器时需要添加443端口映射,例如:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
-p 443:443 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
然后修改 config/gitlab.rb 中的 external_url
,使用HTTPS:
external_url 'https://my-gitlab.com'
执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使变更生效。gitlab会在 config/ssl 目录下生成自签名证书,但因为没有CA认证,所以重配置命令最后会报证书检查错误,不过不影响配置生效。
现在可以使用浏览器访问 https://my-gitlab.com
了。同样由于证书没有CA认证,浏览器会有安全警告,需要手动接受证书或者访问会被阻止。
配置证书
如果有CA认证证书,可以按照以下步骤安装和配置。
首先将认证证书和密钥文件放置在 config/ssl 目录下,然后修改NGINX的SSL证书配置。例如:
nginx['ssl_certificate'] = "/etc/gitlab/ssl/my-gitlab.com.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/my-gitlab.com.key"
这里假设已经按照上文的方式将 /etc/gitlab 目录映射到宿主机上。当然,证书和密钥也可以放在其他容器可以访问到的目录下,对应修改配置中的目录地址就可以了。
保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使变更生效。接下来就可以完全正常的通过浏览器访问安全地址了。
注意,必须要将 external_url
配置为HTTPS地址,GitLab才会开启HTTPS,只配置证书不会开启HTTPS。
配置HTTP跳转
当HTTPS开启之后,GitLab会关闭HTTP访问。此时可以配置GitLab将HTTP请求转发到HTTPS,但不能只以HTTP方式访问。
修改 config/gitlab.rb 添加以下配置:
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80
保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使变更生效。此时,再访问HTTP地址,就会跳转到HTTPS。
配置SSH端口
使用Docker部署GitLab,由于一般22端口已经被宿主服务器使用了,需要将GitLab SSH服务的22端口映射到其他端口。接下来以使用8122端口为例。
在创建GitLab容器里,将22端口映射到8122端口:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
-p 8122:22 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
然后在 config/gitlab.rb 中添加以下配置:
gitlab_rails['gitlab_shell_ssh_port'] = 8122
保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使变更生效。此时,可以看到项目中的clone URL发生了变化:
注意,这个配置只会使页面上显示的URL发生变化,并不会使GitLab容器里的SSH服务监听的端口发生变化。
关闭自带NGINX
GitLab自带的NGINX可以关闭,但此时需要配置Workhorse服务,因为默认情况下Workhorse只监听Unix Socket。
在 config/gitlab.rb 中添加以下配置:
nginx['enable'] = false
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "0.0.0.0:8181"
上例中的配置将使Workhorse监听8181端口。保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使变更生效。
注意:在启动容器时需要将Workhorse监听的端口映射出来。
使用外部PostgreSQL数据库
GitLab默认使用自带的PostgreSQL数据库,但在正式环境中会希望使用外部的数据库。可以按照以下步骤进行配置。
注意:要使用GitLab对应的数据库版本,此文使用的是PostgreSQL 11.10。可以查考官方文档PostgreSQL Requirements,最好使用Minimum version。
创建数据库role
建议给GitLab创建单独的role用来访问数据库。这个role需要有创建数据库的权限,因为GitLab在初始化数据库时需要创建新库。例如,创建名为 gitlab
的role:
CREATE ROLE gitlab WITH LOGIN PASSWORD 'mypassword' SUPERUSER;
GitLab在初始化数据库的时候,需要superuser权限去执行一些操作。
配置GitLab并初始化数据库
GitLab在默认配置下使用自带的PostgreSQL数据库。如果要使用外部数据库,需要在 config/gitlab.rb 中添加以下配置:
postgresql['enable'] = false
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "mypassword"
gitlab_rails['db_host'] = "192.168.1.18"
gitlab_rails['db_port'] = 5432
这里的配置使用了前一小节中创建的role。 db_host
和 db_port
根据环境做对应的调整。
保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使配置生效。但此时重载配置的命令最后会报错,如果错误内容是提示PostrgreSQL中数据库不存在,这是正常现象,可以继续执行下一步操作。如果报错内容是其他错误,则需要根据错误内容调整环境配置。
接下来需要对数据库进行初始化,执行以下命令:
docker exec -it my-gitlab gitlab-rake gitlab:setup
注意:这个操作会将配置文件中指定数据库中的数据清空,如果数据库已经存在,请根据自身情况备份数据。
操作正常完成后,GitLab已经开始使用外部数据库了。
建议此时去掉数据库账号的superuser权限:
ALTER ROLE gitlab NOSUPERUSER;
使用外部Redis
GitLab默认使用自带的Redis。如果需要使用外部Redis,需要在 config/gitlab.rb 中添加以下配置:
redis['enable'] = false
gitlab_rails['redis_host'] = "192.168.1.18"
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_password'] = "mypass"
gitlab_rails['redis_database'] = 0
以上配置中,redis_host
,redis_port
和redis_database
根据环境指定。如果Redis没有设置密码,则不需要 gitlab_rails['redis_password']
项。
保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使配置生效。
关闭自带监控报警
GitLab自带prometheus,altermanger,node_exporter和gitlab_exporter,可以通过添加以下配置将这些服务全部关闭:
prometheus_monitoring['enable'] = false
保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure
使配置生效。
配置Nginx反向代理
通常情况下都会在GitLab前放置一个Nginx做为服务的反向代理。这时,需要对Nginx和GitLab的配置都做出调整。
例如,首先在用来做反向代理的Nginx中,添加以下服务配置:
upstream gitlab-workhorse {
server 192.168.1.18:8181;
}
server {
listen *:80;
server_name my-gitlab;
server_tokens off;
gzip on;
proxy_set_header Host $http_host_with_default;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_cache off;
proxy_pass http://gitlab-workhorse;
}
}
以上配置中,假设GitLab服务监听的是 192.168.1.18 上的 8181 端口。X-Real-IP
和X-Forwarded-For
两个Header用来向GitLab服务传递客户端的真实IP。
为了让GitLab后端能够正常从从X-Real-IP
和 X-Forwarded-For
中读取客户端的IP,需要在 config/gitlab.rb 添加以下配置:
nginx['real_ip_trusted_addresses'] = ['192.168.1.0/24', '172.17.0.0/24']
当Nginx代理也是Docker容器时,其IP有可能是172.17.0.0网段,所以这里也在配置中添加了这个网段。
注意:无论GitLab自带的Nginx服务是否开启,都需要添加这个配置