本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html
本文做者: 苏洋前端
建立时间: 2019年04月10日 统计字数: 6199字 阅读时间: 13分钟阅读 本文连接: soulteary.com/2019/04/10/…nginx
以前曾不止一次的介绍过 GitLab 在容器中的安装使用。考虑到多数使用场景都是在内网环境下,因此也不曾过多的进行过安全配置。最近在帮研究院进行系统搭建,其中一个述求是“公网环境下使用”。git
本篇将介绍如何更好的使用容器中的 GitLab ,并搭配 Traefik 实现自动挂载 HTTPS 。sql
Traefik 的详细使用,能够参考以往的文章,好比:使用服务发现改善开发体验、更完善的 Docker + Traefik 使用方案 等,更多内容能够翻看历史内容标签,这里不过多赘述。docker
本文依旧只须要关注编排文件中的 labels
和 networks
字段配置就足够啦。编程
对 GitLab 容器服务的 networks
字段设置全局使用的网卡 traefik
(本例),就能够让 Traefik 自动接管 GitLab 对外的 Web 服务请求。浏览器
networks:
- traefik
复制代码
编排文件中的 labels
字段,声明了 Traefik 如何对流量进行转发。假设咱们要对外提供三种访问能力:安全
https://gitlab.${DOMAIN}
https://registry.${DOMAIN}
https://page.${DOMAIN}
那么咱们能够这样配置:bash
labels:
- "traefik.enable=true"
# GitLab Web 服务
- "traefik.gitlab.port=80"
- "traefik.gitlab.frontend.rule=Host:gitlab.${BASEHOST}"
- "traefik.gitlab.frontend.entryPoints=http,https"
- "traefik.gitlab.frontend.headers.SSLProxyHeaders=X-Forwarded-For:https"
- "traefik.gitlab.frontend.headers.STSSeconds=315360000"
- "traefik.gitlab.frontend.headers.browserXSSFilter=true"
- "traefik.gitlab.frontend.headers.contentTypeNosniff=true"
- "traefik.gitlab.frontend.headers.customrequestheaders=X-Forwarded-Ssl:on"
- "traefik.gitlab.frontend.passHostHeader=true"
- "traefik.gitlab.frontend.passTLSCert=false"
# Registry 服务
- "traefik.registry.port=5100"
- "traefik.registry.frontend.rule=Host:registry.${BASEHOST}"
- "traefik.registry.frontend.entryPoints=http,https"
# Pages 服务
- "traefik.pages.port=5201"
- "traefik.pages.frontend.rule=Host:page.${BASEHOST}"
- "traefik.pages.frontend.entryPoints=http,https"
复制代码
Registry
、Pages
这里,为了节约篇幅,我就不重复粘贴相同的内容了,你能够参考 GitLab Web 服务
补全响应头处理。
固然,若是你以为容器编排文件写的内容太多了,想放到 GitLab 中进行处理也是能够的,稍后我会讲。
配置 GitLab 仍是须要一些额外的耐心,不过好在坑我都替你趟完了。
在给出参考代码以前,咱们须要先知道 GitLab 的一个“Tricks”:
若是你设置的 external_url
内容包含 https
,那么服务默认会使用 SSL 方式对外提供服务。若是你的 external_url
声明为 http://gitlab.${DOMAIN}
,当系统运行起来后(默认端口为 80
),当咱们使用 https
进行访问,又会出现各类问题,官方文档写的也是不清不楚。
搜索 reddit
上的讨论历史,发现有个老外都自暴自弃放弃使用 https
,改用 http
了,使人啼笑皆非。
遇到问题解决问题就行了鸭,逃避是什么鬼。
使用容器方式搭建 GitLab ,全部的配置都须要声明在编排文件的 environment
字段内,下面是 GitLab Web 服务的使用配置。
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.${BASEHOST}'
nginx['enable'] = true
nginx['listen_port'] = 80
nginx['listen_https'] = false
nginx['http2_enabled'] = false
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = true
复制代码
须要注意的是,声明的外部连接地址 external_url
须要使用 HTTPS
协议。而监听端口须要设置为 80
,另外也要配置Nginx不进行 https
监听,不使用 HTTP2
,至于 HTTP
自动转向 HTTPS
可配可不配,由于 Traefik 侧我默认开启了 HTTP
转向 HTTPS
功能。
前文提到,若是咱们不想使用 Traefik 进行响应头的修改,那么该如何在 GitLab 中进行配置呢,也很简单,多添加一个 proxy_set_headers
的配置便可:
nginx['proxy_set_headers'] = {
"Host" => "$$http_host",
"X-Real-IP" => "$$remote_addr",
"X-Forwarded-For" => "$$proxy_add_x_forwarded_for",
"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on"
}
复制代码
这里有一点须要额外注意,全部出如今 environment
字段内的变量,都须要使用 双$ 符号声明,而非 单个$,不然结果不会如愿以偿。
前端提到了,咱们要同时提供 Web 访问、容器仓库、页面预览三个功能,因此配置还须要加上其余两项。
registry['enable'] = true
registry_external_url 'https://registry.${BASEHOST}/'
registry_nginx['listen_port'] = 5100
registry_nginx['listen_https'] = false
registry_nginx['redirect_http_to_https'] = true
pages_external_url "https://page.${BASEHOST}/"
pages_nginx['listen_port'] = 5200
pages_nginx['listen_https'] = false
pages_nginx['redirect_http_to_https'] = true
gitlab_pages['enable'] = true
gitlab_pages['inplace_chroot'] = true
gitlab_pages['external_http'] = ['gitlab:5201']
gitlab_pages['dir'] = "/var/opt/gitlab/gitlab-pages"
gitlab_pages['log_directory'] = "/var/log/gitlab/gitlab-pages"
gitlab_pages['artifacts_server'] = true
gitlab_pages['artifacts_server_timeout'] = 10
复制代码
能够看到,除了 gitlab_pages
字段比较特殊外,配置和刚刚大同小异。
另外提一点,我本来的习惯是将全部的流量都配置到 80
端口,再让 Traefik 进行转发可读性会更好一些,可是看到了另一位国外同窗的配置后,我以为让端口保持在默认端口也是不错的选择,好比 5100
、5200
。
配置文件最上面的监控须要额外配置,咱们回头细聊,为了减小影响,这里将这部分功能进行关闭。
这里我选择让 GitLab 的 SSH
端口保持默认,而修改宿主机的 SSH
端口到其余位置,这样作的好处是:
使用编排文件,将 GitLab 端口映射到宿主机中。
version: '3'
services:
gitlab:
expose:
- 80
- 443
ports:
- '0.0.0.0:22:22'
复制代码
这里有一个小细节,若是你不在 labels
中对你的服务端口进行声明,Traefik 会使用你暴露的第一个端口做为服务发现的端口。因此将你全部依赖的内容都显式声明,是一个好的习惯。
比较重要的细节都讲完了,这里给出完整的配置参考(容器仓库和页面预览服务的响应头有删减,有需求能够自行添加):
version: '3'
services:
gitlab:
restart: always
image: ${GITLAB_IMAGE}
hostname: ${HOSTNAME}
healthcheck:
disable: true
expose:
- 80
- 443
ports:
- '0.0.0.0:22:22'
# 解决搜索引擎搜索不出小于3字符问题
# https://gitbaai.ac.cn/gitlab-org/gitlab-ce/issues/40379
entrypoint: |
bash -c 'sed -i "s/MIN_CHARS_FOR_PARTIAL_MATCHING = 3/MIN_CHARS_FOR_PARTIAL_MATCHING = 1/g" /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/sql/pattern.rb && /assets/wrapper'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
- ./embedded-logs:/opt/gitlab/embedded/logs/
labels:
- "traefik.enable=true"
# GitLab Web 服务
- "traefik.gitlab.port=80"
- "traefik.gitlab.frontend.rule=Host:gitlab.${BASEHOST}"
- "traefik.gitlab.frontend.entryPoints=http,https"
- "traefik.gitlab.frontend.headers.SSLProxyHeaders=X-Forwarded-For:https"
- "traefik.gitlab.frontend.headers.STSSeconds=315360000"
- "traefik.gitlab.frontend.headers.browserXSSFilter=true"
- "traefik.gitlab.frontend.headers.contentTypeNosniff=true"
- "traefik.gitlab.frontend.headers.customrequestheaders=X-Forwarded-Ssl:on"
- "traefik.gitlab.frontend.passHostHeader=true"
- "traefik.gitlab.frontend.passTLSCert=false"
# Registry 服务
- "traefik.registry.port=5100"
- "traefik.registry.frontend.rule=Host:registry.${BASEHOST}"
- "traefik.registry.frontend.entryPoints=http,https"
# Pages 服务
- "traefik.pages.port=5201"
- "traefik.pages.frontend.rule=Host:page.${BASEHOST}"
- "traefik.pages.frontend.entryPoints=http,https"
networks:
- traefik
networks:
traefik:
external: true
复制代码
光有编排配置,不可以愉快使用,这里还须要建立一个 .env
环境配置文件:
GITLAB_IMAGE=gitlab/gitlab-ce:11.8.6-ce.0
BASEHOST=lab.com
HOSTNAME=gitlab.lab.com
复制代码
两个配置文件都准备好以后,使用 docker-compose up
启动你的应用,而后就能够开始使用了。
若是你还不熟悉 docker-compose
的使用,能够翻阅以前的文章,查阅 “一些额外的小技巧”一节。
下一篇,我将着重介绍一些安全配置上的问题。
我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。
在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)