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

前言

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

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

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

因此對於好東西不拿來用太對不起本身,因而開始了漫漫的爬坑之路;git

因爲東西是部署在公司內的,因此就不開放訪問了,可是能夠參考下個人大致配置;web

至於爲何採用docker來部署,好遷移,升級也方便(由於數據和配置文件是獨立的)sql

前置基礎

基礎環境

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

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

有專業的運維和公司不缺錢的大佬能夠折騰shell

必備知識

Linux/Docker && Docker Compose / Nginx數據庫

效果圖

構建啓動

這塊的知識並非gitlab,仍是dockerapi

  • 官方教程的基本啓動姿式:
    • 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

效果

經常使用的郵箱基本均可以收到....

Gitlab HTTPS

我這臺渣渣服務器目前帶不了太多服務,因此就不考慮nginx獨立作反射了(gitlab支持反射代理)

用的gitlab內置的nginx,直接用默認端口

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

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

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

下載下來解壓後是有兩個文件,

  • 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

複製代碼
  • 修改配置,截圖有高亮

超時配置

由於服務器不給力.因此默認的不夠用...

# 這個是針對請求鉤子的,還有針對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,測試網站這些.....

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

相關文章
相關標籤/搜索