Docker折騰記: (3)Docker Compose構建Gitlab,從配置(https,郵箱驗證)到基本可用
前言
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,引導語,全域性廣播這些,管理員賬號登陸後找下就知道了
構建啟動
這塊的知識並不是gitlab
,還是docker
的
- 官方教程的基本啟動姿勢:
detack
: 容器在後臺執行並輸出容器IDpublish
: 就是暴露埠,簡寫-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'] = "[email protected]"
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'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = '[email protected]'
# 其他郵箱大同小異(QQ,163這些),只要支援smtp協議的皆可,埠這些不用說了
# gitlab_rails['smtp_address'] = "smtp.aliyun.com" : 郵箱互動伺服器
# gitlab_rails['smtp_user_name'] = "[email protected]" : 郵箱登入賬號
# gitlab_rails['smtp_password'] = "xxxxxxxx" : 郵箱登入密碼
#gitlab_rails['gitlab_email_enabled'] = true : 啟動郵箱推送功能
# gitlab_rails['gitlab_email_from'] = '[email protected]': 誰來充當發郵件的
# gitlab_rails['gitlab_email_display_name'] = '[email protected]' : 別人看到的發件人名字
至於測試郵箱有兩種姿勢,一種是gitlab
控制檯,一種就是開啟網站去註冊了,前者如下,後者不用說
- 進入
Gitlab
容器 - 執行
gitlab-rails console
進入到gitlab
控制檯 - 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 [email protected]:/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 ps
和docker 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'] = "[email protected]"
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'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = '[email protected]'
gitlab_rails['gitlab_shell_ssh_port'] = 22
user['git_user_email'] = "[email protected]"
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
,測試網站這些…..
對於有不對之處盡請留言,會及時修正,謝謝閱讀