使用Docker安裝配置GitLab CE


本文介紹使用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_hostdb_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_hostredis_portredis_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-IPX-Forwarded-For兩個Header用來向GitLab服務傳遞客戶端的真實IP。

為了讓GitLab后端能夠正常從從X-Real-IPX-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服務是否開啟,都需要添加這個配置

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM