使用 Docker 和 Traefik 搭建 GitLab (前篇)

本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)html

本文做者: 蘇洋前端

建立時間: 2019年04月10日 統計字數: 6199字 閱讀時間: 13分鐘閱讀 本文連接: soulteary.com/2019/04/10/…nginx


使用 Docker 和 Traefik 搭建 GitLab (前篇)

以前曾不止一次的介紹過 GitLab 在容器中的安裝使用。考慮到多數使用場景都是在內網環境下,因此也不曾過多的進行過安全配置。最近在幫研究院進行系統搭建,其中一個述求是「公網環境下使用」。git

本篇將介紹如何更好的使用容器中的 GitLab ,並搭配 Traefik 實現自動掛載 HTTPS 。sql

編寫 Traefik 配置規則

Traefik 的詳細使用,能夠參考以往的文章,好比:使用服務發現改善開發體驗更完善的 Docker + Traefik 使用方案 等,更多內容能夠翻看歷史內容標籤,這裏不過多贅述。docker

本文依舊只須要關注編排文件中的 labelsnetworks 字段配置就足夠啦。編程

對 GitLab 容器服務的 networks 字段設置全局使用的網卡 traefik(本例),就能夠讓 Traefik 自動接管 GitLab 對外的 Web 服務請求瀏覽器

networks:
  - traefik
複製代碼

編排文件中的 labels 字段,聲明瞭 Traefik 如何對流量進行轉發。假設咱們要對外提供三種訪問能力:安全

  • https://gitlab.${DOMAIN}
    • 訪問 GitLab Web 頁面和 Web API
  • https://registry.${DOMAIN}
    • 使用終端訪問容器倉庫
  • https://page.${DOMAIN}
    • 使用瀏覽器訪問一些倉庫的預覽頁面(相似 GitHub Page)

那麼咱們能夠這樣配置: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"
複製代碼

RegistryPages 這裏,爲了節約篇幅,我就不重複粘貼相同的內容了,你能夠參考 GitLab Web 服務補全響應頭處理。

固然,若是你以爲容器編排文件寫的內容太多了,想放到 GitLab 中進行處理也是能夠的,稍後我會講。

編寫 GitLab 配置

配置 GitLab 仍是須要一些額外的耐心,不過好在坑我都替你趟完了。

配置 GitLab Nginx 服務

在給出參考代碼以前,咱們須要先知道 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 進行轉發可讀性會更好一些,可是看到了另一位國外同窗的配置後,我以爲讓端口保持在默認端口也是不錯的選擇,好比 51005200

配置文件最上面的監控須要額外配置,咱們回頭細聊,爲了減小影響,這裏將這部分功能進行關閉。

配置 GitLab SSH 端口

這裏我選擇讓 GitLab 的 SSH 端口保持默認,而修改宿主機的 SSH 端口到其餘位置,這樣作的好處是:

  • 能夠減小對 GitLab 的配置。
  • 倉庫訪問地址顯得更美觀了,避免了用戶使用軟件過程當中須要解決的額外問題。

使用編排文件,將 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、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。

喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)

關於折騰羣入羣的那些事

相關文章
相關標籤/搜索