Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用

CRPER發表於2019-03-03

前言

gitlab 11.1內建了CI/CD,這個特性從gitlab 8+就開始有了,不過配置比較瑣碎

經過幾個大版本的迭代,現在已經簡化了使用方式,也修復了一些坑,這個特性大大吸引了我;

gitlab擁有的特性很齊全,包括了第三方登入,二步驗證,SSH,GPG簽名等等

所以對於好東西不拿來用太對不起自己,於是開始了漫漫的爬坑之路;

由於東西是部署在公司內的,所以就不開放訪問了,但是可以參考下我的大體配置;

至於為什麼採用docker來部署,好遷移,升級也方便(因為資料和配置檔案是獨立的)


前置基礎

基礎環境

  • Debian Linux 9
  • Docker 18.06 , gitlab映象用的gitlab官方提供的gitlab-ce,好處如下
    • 官方的,用的放心,更新頻率高(能與時俱進) – 這個教程用的是當前最新的11.1
    • 一鍵安裝(因為類似postgresql,ruby,nginx)這類的基礎的環境都包括進去了
    • 只暴露主配置檔案/資料庫存放位置/還有日誌,
      • 升級不用考慮資料的問題;對於業務不是很複雜的公司.能快速部署….

倘若想至於從0到1的構建(這種可以更細緻針對業務進行配置),但要考慮的東西比較多;

有專業的運維和公司不缺錢的大佬可以折騰

必備知識

Linux/Docker && Docker Compose / Nginx


效果圖

任何不放圖的都是耍流氓,你說成了就成了?有圖有真相,無圖純扯淡!!!

如您所見的LOGO,引導語,全域性廣播這些,管理員賬號登陸後找下就知道了

Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用
Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用
Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用

構建啟動

這塊的知識並不是gitlab,還是docker

  • 官方教程的基本啟動姿勢:
    • detack: 容器在後臺執行並輸出容器ID
    • publish: 就是暴露埠,簡寫-p
    • name: 容器名
    • restart: 什麼時機會觸發容器重啟,所有情況
    • volume: 對映卷的,基本用來持久化資料的
# 官方基本姿勢,docker直接啟動
sudo docker run --detach 
    --hostname gitlab.example.com 
    --publish 443:443 --publish 80:80 --publish 22:22 
    --name gitlab 
    --restart always 
    --volume /srv/gitlab/config:/etc/gitlab 
    --volume /srv/gitlab/logs:/var/log/gitlab 
    --volume /srv/gitlab/data:/var/opt/gitlab 
    gitlab/gitlab-ce:latest

複製程式碼

三個volume就是暴露的位置

本地位置 容器位置 作用
/srv/gitlab/data /var/opt/gitlab gitlab的資料存放,包括nginx,postgresql這些
/srv/gitlab/logs /var/log/gitlab 日誌存放
/srv/gitlab/config /etc/gitlab gitlab的主配置檔案

傳參啟動

  • hostname:訪問的域名
  • env: 這裡面就是臨時提權生效的
    • 這個就是可以給gitlab傳入部分引數,讓其構建過程讀取你設定的值(gitlab.rb)並且生效
    • 官方說這個並不會寫入gitlab.rb(就是gitlab的配置檔案),只是臨時生效(容器生存期間)

sudo docker run --detach 
    --hostname gitlab.example.com 
    --env GITLAB_OMNIBUS_CONFIG="external_url `http://my.domain.com/`; gitlab_rails[`lfs_enabled`] = true;" 
    --publish 443:443 --publish 80:80 --publish 22:22 
    --name gitlab 
    --restart always 
    --volume /srv/gitlab/config:/etc/gitlab 
    --volume /srv/gitlab/logs:/var/log/gitlab 
    --volume /srv/gitlab/data:/var/opt/gitlab 
    gitlab/gitlab-ce:latest

複製程式碼

docker-compose啟動

我偏向於這種,所以寫個構建規則,如下

第一版

version: `3.6`
services:
  gitlab:
    container_name: gitlab
    image: gitlab/gitlab-ce:latest
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
            external_url `https://域名`
    ports:
      - "80:80"
      - "443:443"
      - "2224:22"
    volumes:
      - "/srv/gitlab/config:/etc/gitlab"
      - "/srv/gitlab/logs:/var/log/gitlab"
      - "/srv/gitlab/data:/var/opt/gitlab"

複製程式碼

整個初始化的過程,我這邊等了兩分鐘左右,因為伺服器配置不是很高~~~~

對於Gitlab配置,你可以配置容器內的,也可以配置對映的區域

前者可以用gitlab-ctl reconfigure重新生效,後者需要重啟容器

  • 容器內:/etc/gitlab
  • 對映: /srv/gitlab/config

郵箱配置

郵箱推送算是一個最基礎的功能的,比如註冊什麼基本一般都會用到

這裡用的是阿里雲的郵箱了,當然是個人郵箱..夠用就好

# https://mailhelp.aliyun.com/freemail/detail.vm?knoId=5869705

gitlab_rails[`smtp_enable`] = true 
gitlab_rails[`smtp_address`] = "smtpdm.aliyun.com"
gitlab_rails[`smtp_port`] = 465
gitlab_rails[`smtp_user_name`] = "crperx@aliyun.com"
gitlab_rails[`smtp_password`] = "xxxxxxxx"
gitlab_rails[`smtp_domain`] = "smtp.aliyun.com"
gitlab_rails[`smtp_authentication`] = "login"
gitlab_rails[`smtp_enable_starttls_auto`] = true
gitlab_rails[`smtp_tls`] = true
gitlab_rails[`gitlab_email_enabled`] = true
gitlab_rails[`gitlab_email_from`] = `crperx@aliyun.com`
gitlab_rails[`gitlab_email_display_name`] = `noreply@aliyun.com`

# 其他郵箱大同小異(QQ,163這些),只要支援smtp協議的皆可,埠這些不用說了
# gitlab_rails[`smtp_address`] = "smtp.aliyun.com" : 郵箱互動伺服器
# gitlab_rails[`smtp_user_name`] = "crperx@aliyun.com" : 郵箱登入賬號
# gitlab_rails[`smtp_password`] = "xxxxxxxx" : 郵箱登入密碼
#gitlab_rails[`gitlab_email_enabled`] = true : 啟動郵箱推送功能
# gitlab_rails[`gitlab_email_from`] = `crperx@aliyun.com`:  誰來充當發郵件的
# gitlab_rails[`gitlab_email_display_name`] = `noreply@aliyun.com` : 別人看到的發件人名字

複製程式碼

至於測試郵箱有兩種姿勢,一種是gitlab控制檯,一種就是開啟網站去註冊了,前者如下,後者不用說

  1. 進入Gitlab容器
  2. 執行gitlab-rails console進入到gitlab控制檯
  3. Notify.test_email(`待測試接收的郵箱`, `郵件自定義標題`, `郵件自定義正文`).deliver_now

效果

常用的郵箱基本都可以收到….

Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用
Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用
Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用

Gitlab HTTPS

我這臺渣渣伺服器目前帶不了太多服務,所以就不考慮nginx獨立做反射了(gitlab支援反射代理)

用的gitlab內建的nginx,直接用預設埠

  • 申請證書,我申請的是阿里雲的免費證書

申請過程挺簡單的,只要你有備案好的域名,基本都可以批下來,這過程就不用說了

待批下來之後,即可下載證書(簽名和私鑰)

Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用

下載下來解壓後是有兩個檔案,

  • 1533582000680.key: 證書私鑰!!!!證書私鑰!!!!證書私鑰!!!!
  • 1533582000680.pem : 公鑰,阿里雲提供的是pem格式

我去看了下gitlab.rb(gitlab的主配置檔案)是需要crt格式的,

###############################################################################
## GitLab NGINX
##! Docs: https://docs.gitlab.com/omnibus/settings/nginx.html
################################################################################

# nginx[`enable`] = true
# nginx[`client_max_body_size`] = `250m`
# nginx[`redirect_http_to_https`] = false
# nginx[`redirect_http_to_https_port`] = 80

##! Most root CA`s are included by default  預設的根證書
# nginx[`ssl_client_certificate`] = "/etc/gitlab/ssl/ca.crt"

##! enable/disable 2-way SSL client authentication   二步驗證是否校驗證書,看需求開
# nginx[`ssl_verify_client`] = "off"

##! if ssl_verify_client on, verification depth in the client certificates chain  校驗的深度
# nginx[`ssl_verify_depth`] = "1"

# nginx[`ssl_certificate`] = "/etc/gitlab/ssl/#{node[`fqdn`]}.crt"   證書的位置
# nginx[`ssl_certificate_key`] = "/etc/gitlab/ssl/#{node[`fqdn`]}.key"
# nginx[`ssl_ciphers`] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
# nginx[`ssl_prefer_server_ciphers`] = "on"

##! **Recommended by: https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
##!                   https://cipherli.st/**
# nginx[`ssl_protocols`] = "TLSv1.1 TLSv1.2"


複製程式碼

這時候我們就需要轉換一下了,開啟終端,

# 我把數字重新命名為gitlab了
# 這條命令的意思就是
# 生成x509規格的證書,輸出位可讀文字格式, 
# -in 是標準輸入就是接受哪個
# -out 標準輸出,輸出檔案為什麼格式
openssl   x509  -outform PEM  -in gitlab.pem   -out gitlab.crt

# 若是轉出格式用的二進位制流(DER),會輸出這個問題
# SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expect

複製程式碼

接下來就用scp把對應的證書傳到伺服器上,修改下配置檔案

  • 傳送證書
# -r  遞迴傳送,因為傳送的是整個目錄
# 傳到的是容器對映的目錄,這樣重啟下容器就能生效了
scp  -r  ./ssl   root@xxxxx:/srv/gitlab/config

複製程式碼
  • 修改配置,截圖有高亮
Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用

超時配置

因為伺服器不給力.所以預設的不夠用…


# 這個是針對請求鉤子的,還有針對Git的這些
gitlab_rails[`webhook_timeout`] = 60 #預設是10s

# 若是大體都需要求延長的,可以配置全域性,後者是程式數
unicorn[`worker_timeout`] = 60
unicorn[`worker_processes`] = 2

複製程式碼

配置生效

gitlab配置的修改有兩種,一種是啟動容器的時候傳參,參考上面;

一種直接改對映的配置檔案; 至於如何生效,有兩種方式;

其一:gitlab-ctl => gitlab-ctl reconfigure過載配置檔案生效

對於其一,我們肯定是要進入容器才能操作的;

  • docker ps -a : 找到gitlab容器的例項,docker-compose psdocker ps大同小異
  • docker exec -it gitlab bash: 進入容器,並使用bash shell

應該說docker-compose的命令列基本是針對docker的封裝的,

只是操作的是由compse生成的例項,docker也能干涉也不奇怪

gitlab-ctl還有一些其他的命令,比如暫停,停止gitlab,輸出配置檔案等等

其二:重啟容器!


第二版

gitlab.rb的配置實在是多,整個配置檔案目前接近1800行;

裡面涵蓋了日誌,安全,nginx,資料庫等等的所有配置

大多數配置都有預設值,所以很多東西看你的需要來開啟,

我們這裡不需要開啟太多東西,郵箱https,超時的配置,其他都預設(比如日誌這些,資料庫初始化這些)

證書必須提前複製過去!!!!,木有目錄就新建

# 就是把配置檔案寫在容器構建裡面,容器啟動的時候直接生效,免去很多重啟或者命令列這類的操作
# 注意替換中文區域的內容



version: `3.6`
services:
  gitlab:
    container_name: gitlab
    image: gitlab/gitlab-ce:latest
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url `https://code.crper.com`
        unicorn[`worker_timeout`] = 60
        unicorn[`worker_processes`] = 2
        gitlab_rails[`smtp_enable`] = true
        gitlab_rails[`smtp_address`] = "smtpdm.aliyun.com"
        gitlab_rails[`smtp_port`] = 465
        gitlab_rails[`smtp_user_name`] = "crperx@aliyun.com"
        gitlab_rails[`smtp_password`] = "Qwe456jkl?Asd789iop?"
        gitlab_rails[`smtp_domain`] = "smtpdm.aliyun.com"
        gitlab_rails[`smtp_authentication`] = "login"
        gitlab_rails[`smtp_enable_starttls_auto`] = true
        gitlab_rails[`smtp_tls`] = true
        gitlab_rails[`gitlab_email_enabled`] = true
        gitlab_rails[`gitlab_email_from`] = `crperx@aliyun.com`
        gitlab_rails[`gitlab_email_display_name`] = `noreply@aliyun.com`
        gitlab_rails[`gitlab_shell_ssh_port`] = 22
        user[`git_user_email`] = "crperx@aliyun.com"
        nginx[`enable`] = true
        nginx[`client_max_body_size`] = `250m`
        nginx[`redirect_http_to_https`] = true
        nginx[`ssl_certificate`] = "/etc/gitlab/ssl/gitlab.crt"
        nginx[`ssl_certificate_key`] = "/etc/gitlab/ssl/gitlab.key"
        nginx[`ssl_ciphers`] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
        nginx[`ssl_prefer_server_ciphers`] = "on"
        nginx[`ssl_protocols`] = "TLSv1.1 TLSv1.2"
        nginx[`ssl_session_cache`] = "builtin:1000  shared:SSL:10m"
        nginx[`listen_addresses`] = ["0.0.0.0"]
        nginx[`http2_enabled`] = true
    ports:
      - "80:80"
      - "443:443"
      - "22:22"
    volumes:
      - "/srv/gitlab/config:/etc/gitlab"
      - "/srv/gitlab/logs:/var/log/gitlab"
      - "/srv/gitlab/data:/var/opt/gitlab"
  gitlab-runner:
    image: gitlab/gitlab-runner:alpine


複製程式碼

官方資源:


錯誤彙總

  • [emerg] SSL_CTX_use_PrivateKey_file(“/etc/gitlab/ssl/gitla.key”) failed (SSL: error:02001002:system library:fopen:No such file or directory

這個是你對映的路徑或者檔名字沒匹配(讀取檔案)報錯

  • 443 failed (97: Address family not supported by protocol)

官方的寫法

# gitlab官方教材
nginx[`listen_addresses`] = ["0.0.0.0", "[::]"] # listen on all IPv4 and IPv6 addresses

# 手動改為

nginx[`listen_addresses`] = ["0.0.0.0"]


# [::] 代表IPV6 , 我用的是阿里雲伺服器,估計是我的安全策略沒開放,但是沒用到,直接刪了也沒所謂了
# 阿里雲的安全策略有最高階的優先權,比如入站出站的埠開放,不開是沒法訪問的

複製程式碼

總結

  • Gitlab目前最新版(11)整合了部分中文(在使用者中心更改下語言為簡體中文即可)
  • 證書服務不一定要用阿里的,也可以用一些提供免費證書的網站

Gitlab對資源的要求不低.我單核|2G運存|1M頻寬時不時的無響應…官推最低配置雙核|4G運存

極度扎心,所以對於CI/CD(持續化整合)只能等有閒錢升級伺服器再考慮了….

因為最初的考慮是,把一些常用的服務都容器化,統一用nginx代理服務

Docker Compose編排比如yapi,gitlab,測試網站這些…..

對於有不對之處盡請留言,會及時修正,謝謝閱讀

相關文章