本文介紹使用Docker在本地安裝GitLab CE。寫作本文時,使用的GitLab版本是13.5.4。
基本安裝
使用Docker安裝GitLab最基本的命令如下:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
上例中,容器名和容器系統的 hostname
都設置為 my-gitlab
。后續示例中,也基本會使用這個配置。容器這里只映射了 80
端口,其他的端口配置會在后續示例中說明。
容器啟動成功后,可以在瀏覽器中通過 http://localhost 地址訪問。在第一次訪問里,會提示設置 root 密碼:
映射目錄
GitLab中主要三個目錄需要被映射出來,分別是
- /etc/gitlab : 配置文件目錄。GitLab的主要配置文件 gitlab.rb 保存在這個目錄
- /var/opt/gitlab :GitLab的運行目錄和數據保存目錄
- /var/log/gitlab : GitLab的日志目錄
如下例將這三個目錄映射到宿主機:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
配置域名
GitLab的外部域名配置會影響URL生成和其他多個方面。例如在使用前文中的方式啟動GitLab容器后,生成的clone URL如下圖:
這個URL很可能使用的不是期望的對外域名。本節會介紹兩種調整的方式。
指定容器hostname
在啟動GitLab容器時,指定 hostname
:
docker run --name "my-gitlab" \
--hostname "my-gitlab.com" \
-p 80:80 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
當沒有在配置文件 config/gitlab.rb 中配置 external_url
時,GitLab會讀取系統的 hostname
作為域名:
修改配置
更可靠的方式是修改 config/gitlab.rb 中的 external_url
:
external_url 'http://my-gitlab.com'
保存后可以在GitLab容器中執行以下命令來查看配置變更:
# docker exec -it my-gitlab gitlab-ctl diff-config
diff --git a/etc/gitlab/gitlab.rb b/opt/gitlab/etc/gitlab.rb.template
index 5f49511..c322a57 100644
--- a/etc/gitlab/gitlab.rb
+++ b/opt/gitlab/etc/gitlab.rb.template
@@ -30,7 +30,6 @@
##! address from AWS. For more details, see:
##! https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
# external_url 'GENERATED_EXTERNAL_URL'
-external_url 'http://my-gitlab.com'
## Roles for multi-instance GitLab
##! The default is to have no roles enabled, which results in GitLab running as an all-in-one instance.
接下來可以執行以下命令使配置變更生效:
docker exec -it my-gitlab gitlab-ctl reconfigure
命令執行成功后,可以看到和設置容器hostname
同樣的效果。
創建新項目
創建新項目時顯示的項目URL前綴只和瀏覽器當前host有關,和其他配置沒有關系,也不會影響其他地方的URL。比如修改本地 hosts 文件將域名設置為一個任意值后,訪問GitLab:
開啟HTTPS
如果要在GitLab自帶的Nginx上開啟HTTPS, 需要進行以下配置。
首先,在啟動容器時需要添加443端口映射,例如:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
-p 443:443 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
然后修改 config/gitlab.rb 中的 external_url
,使用HTTPS:
external_url 'https://my-gitlab.com'
執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使變更生效。gitlab會在 config/ssl 目錄下生成自簽名證書,但因為沒有CA認證,所以重配置命令最后會報證書檢查錯誤,不過不影響配置生效。
現在可以使用瀏覽器訪問 https://my-gitlab.com
了。同樣由於證書沒有CA認證,瀏覽器會有安全警告,需要手動接受證書或者訪問會被阻止。
配置證書
如果有CA認證證書,可以按照以下步驟安裝和配置。
首先將認證證書和密鑰文件放置在 config/ssl 目錄下,然后修改NGINX的SSL證書配置。例如:
nginx['ssl_certificate'] = "/etc/gitlab/ssl/my-gitlab.com.pem"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/my-gitlab.com.key"
這里假設已經按照上文的方式將 /etc/gitlab 目錄映射到宿主機上。當然,證書和密鑰也可以放在其他容器可以訪問到的目錄下,對應修改配置中的目錄地址就可以了。
保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使變更生效。接下來就可以完全正常的通過瀏覽器訪問安全地址了。
注意,必須要將 external_url
配置為HTTPS地址,GitLab才會開啟HTTPS,只配置證書不會開啟HTTPS。
配置HTTP跳轉
當HTTPS開啟之后,GitLab會關閉HTTP訪問。此時可以配置GitLab將HTTP請求轉發到HTTPS,但不能只以HTTP方式訪問。
修改 config/gitlab.rb 添加以下配置:
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80
保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使變更生效。此時,再訪問HTTP地址,就會跳轉到HTTPS。
配置SSH端口
使用Docker部署GitLab,由於一般22端口已經被宿主服務器使用了,需要將GitLab SSH服務的22端口映射到其他端口。接下來以使用8122端口為例。
在創建GitLab容器里,將22端口映射到8122端口:
docker run --name "my-gitlab" \
--hostname "my-gitlab" \
-p 80:80 \
-p 8122:22 \
-v ${GITLAB_HOME}/config:/etc/gitlab \
-v ${GITLAB_HOME}/data:/var/opt/gitlab \
-v ${GITLAB_HOME}/log:/var/log/gitlab \
--restart unless-stopped \
-d gitlab/gitlab-ce:latest
然后在 config/gitlab.rb 中添加以下配置:
gitlab_rails['gitlab_shell_ssh_port'] = 8122
保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使變更生效。此時,可以看到項目中的clone URL發生了變化:
注意,這個配置只會使頁面上顯示的URL發生變化,並不會使GitLab容器里的SSH服務監聽的端口發生變化。
關閉自帶NGINX
GitLab自帶的NGINX可以關閉,但此時需要配置Workhorse服務,因為默認情況下Workhorse只監聽Unix Socket。
在 config/gitlab.rb 中添加以下配置:
nginx['enable'] = false
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "0.0.0.0:8181"
上例中的配置將使Workhorse監聽8181端口。保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使變更生效。
注意:在啟動容器時需要將Workhorse監聽的端口映射出來。
使用外部PostgreSQL數據庫
GitLab默認使用自帶的PostgreSQL數據庫,但在正式環境中會希望使用外部的數據庫。可以按照以下步驟進行配置。
注意:要使用GitLab對應的數據庫版本,此文使用的是PostgreSQL 11.10。可以查考官方文檔PostgreSQL Requirements,最好使用Minimum version。
創建數據庫role
建議給GitLab創建單獨的role用來訪問數據庫。這個role需要有創建數據庫的權限,因為GitLab在初始化數據庫時需要創建新庫。例如,創建名為 gitlab
的role:
CREATE ROLE gitlab WITH LOGIN PASSWORD 'mypassword' SUPERUSER;
GitLab在初始化數據庫的時候,需要superuser權限去執行一些操作。
配置GitLab並初始化數據庫
GitLab在默認配置下使用自帶的PostgreSQL數據庫。如果要使用外部數據庫,需要在 config/gitlab.rb 中添加以下配置:
postgresql['enable'] = false
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "mypassword"
gitlab_rails['db_host'] = "192.168.1.18"
gitlab_rails['db_port'] = 5432
這里的配置使用了前一小節中創建的role。 db_host
和 db_port
根據環境做對應的調整。
保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使配置生效。但此時重載配置的命令最后會報錯,如果錯誤內容是提示PostrgreSQL中數據庫不存在,這是正常現象,可以繼續執行下一步操作。如果報錯內容是其他錯誤,則需要根據錯誤內容調整環境配置。
接下來需要對數據庫進行初始化,執行以下命令:
docker exec -it my-gitlab gitlab-rake gitlab:setup
注意:這個操作會將配置文件中指定數據庫中的數據清空,如果數據庫已經存在,請根據自身情況備份數據。
操作正常完成后,GitLab已經開始使用外部數據庫了。
建議此時去掉數據庫賬號的superuser權限:
ALTER ROLE gitlab NOSUPERUSER;
使用外部Redis
GitLab默認使用自帶的Redis。如果需要使用外部Redis,需要在 config/gitlab.rb 中添加以下配置:
redis['enable'] = false
gitlab_rails['redis_host'] = "192.168.1.18"
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_password'] = "mypass"
gitlab_rails['redis_database'] = 0
以上配置中,redis_host
,redis_port
和redis_database
根據環境指定。如果Redis沒有設置密碼,則不需要 gitlab_rails['redis_password']
項。
保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使配置生效。
關閉自帶監控報警
GitLab自帶prometheus,altermanger,node_exporter和gitlab_exporter,可以通過添加以下配置將這些服務全部關閉:
prometheus_monitoring['enable'] = false
保存配置修改后,執行 docker exec -it my-gitlab gitlab-ctl reconfigure
使配置生效。
配置Nginx反向代理
通常情況下都會在GitLab前放置一個Nginx做為服務的反向代理。這時,需要對Nginx和GitLab的配置都做出調整。
例如,首先在用來做反向代理的Nginx中,添加以下服務配置:
upstream gitlab-workhorse {
server 192.168.1.18:8181;
}
server {
listen *:80;
server_name my-gitlab;
server_tokens off;
gzip on;
proxy_set_header Host $http_host_with_default;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_cache off;
proxy_pass http://gitlab-workhorse;
}
}
以上配置中,假設GitLab服務監聽的是 192.168.1.18 上的 8181 端口。X-Real-IP
和X-Forwarded-For
兩個Header用來向GitLab服務傳遞客戶端的真實IP。
為了讓GitLab后端能夠正常從從X-Real-IP
和 X-Forwarded-For
中讀取客戶端的IP,需要在 config/gitlab.rb 添加以下配置:
nginx['real_ip_trusted_addresses'] = ['192.168.1.0/24', '172.17.0.0/24']
當Nginx代理也是Docker容器時,其IP有可能是172.17.0.0網段,所以這里也在配置中添加了這個網段。
注意:無論GitLab自帶的Nginx服務是否開啟,都需要添加這個配置