本文使用「署名 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)