Try   HackMD

自架GitLab - 基於Docker的實作

簡介

本篇主要為紀錄如何利用Docker協助開發者在私有網域以及工作站快速的架設GitLab服務,在私有環境搭起CI/CD的康莊大道。

基本需求

硬體

  1. CPU:桌面平台CPU即可。
  2. 記憶體:建議8GB以上。
  3. 容量:根據需求而定。

作業系統

  1. 支援的Unix系統:
    • Ubuntu
    • Debian
    • CentOS
    • Red Hat Enterprise Linux
    • Scientific Linux
    • Oracle Linux
  2. 不支援的Unix系統:
    • OS X
    • Arch Linux
    • Fedora
    • Gentoo
    • FreeBSD

軟體

  1. Docker
  2. Docker-compose

由於本次將以Docker為基礎建立GitLab服務,故只要主系統能安裝Docker即可。

安裝步驟

請務必將以下教學中的/path/to/your前綴更改成讀者自身所設定的位置。

建立虛擬環境

首先,我們可以建立一個具有4核心CPU以及20GB記憶體的Ubuntu-20.04虛擬機,並安裝Docker以及必要的軟體。(不使用虛擬機的讀者可以跳過這一步驟。)

sudo apt-get -y update sudo apt-get -y upgrade sudo apt-get install -y git \ wget \ curl \ qemu-guest-agent \ apt-transport-https \ ca-certificates \ gnupg \ lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce=5:19.03.9~3-0~ubuntu-focal docker-ce-cli=5:19.03.9~3-0~ubuntu-focal containerd.io docker-compose

本篇所使用的虛擬環境是基於Proxmox的開源虛擬機管理環境,有興趣安裝者Proxmox的讀者請參考另一篇安裝設定

編寫Docker-compose設定

在本範例中,我們將利用Docker-compose來建立GitLab服務。為了能夠在主系統也能更改GitLab的相關設定,所以我們必須將主系統的一個資料夾掛載至容器內以便存取容器內部資訊。另外,為了能使GitLab能與Docker服務進行溝通以及調控,我們也將把主系統的/var/run/docker.sock掛載至容器當中。

因為GitLab網站是基於網頁的服務,故我們也必須將容器的80以及443連接埠與主系統的對外連接埠相連接。

以下是一個docker-compose.yml的範例:

version: '3.5' services: gitlab: image: gitlab/gitlab-ce hostname: gitlab.me container_name: gitlab-main restart: always environment: GITLAB_OMNIBUS_CONFIG: | external_url "http://gitlab.me" letsencrypt['enable'] = false volumes: - /path/to/your/gitlab/config:/etc/gitlab - /path/to/your/gitlab/logs:/var/log/gitlab - /path/to/your/gitlab/data:/var/opt/gitlab - /path/to/your/var/run/docker.sock:/var/run/docker.sock ports: - '443:443' - '80:80' extra_hosts: - "gitlab.me:192.168.0.101" networks: - devops-net networks: devops-net:

在上方的設定中,我們指定了一個容器用以承載GitLab服務,並將將對應的設定資料掛載至主機的/gitlab資料夾之下,同時將主機的80/443連接埠與容器的80/443連接埠進行對接。在此我們暫時先不設定HTTPS以及SSL加密。

在上方的設定中,我們直接將主系統的80以及443連接埠與容器對接,這是一個非常不建議的行為。本示範因為在內網以及使用虛擬機的狀況下才做出此設定,請勿在將自架服務部屬至公開網域時使用此設定。

啟動服務

在完成設定後,只需要在docker-compose.yml所在的資料夾執行以下指令即可建立GitLab服務,並使其在背景執行。

docker-compose up -d

在經過幾分鐘之後,我們就可以透過http://192.168.0.101來連結到GitLab的網站了。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

如果想使用http://gitlab.me作為網址連結至GitLab服務,需要至/etc/hosts檔案增加一行192.168.0.101 gitlab.me用以讓系統得知192.168.0.101即為gitlab.me的Host。

登入root帳號

通常在第一次連接時,GitLab頁面會要求更改root密碼並以該密碼進行登入,但偶爾會遇到(編按:每次都遇到)跳過前述環節直接進入輸入帳號密碼的狀況。此時,我們可以透過掛載在主系統的/gitlab/config/initial_root_password中所紀錄的初始root密碼進行登入。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

到此,自架GitLab的服務就大功告成拉!

延伸閱讀 - 為自架GitLab簽署SSL證書並使主機信任憑證

首先,為了建立自簽SSL證書,必須要先建立一個ssl_certificate.conf檔案:

[req] prompt = no default_md = sha256 default_bits = 2048 distinguished_name = dn x509_extensions = v3_req [dn] [req] prompt = no default_md = sha256 default_bits = 2048 distinguished_name = dn x509_extensions = v3_req [dn] C = TW ST = Taiwan L = Taipei O = Boring Corp. OU = IT Department emailAddress = admin@gitlab.me CN = gitlab.me [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 = gitlab.me DNS.2 = *.gitlab.me

並使用openssl指令搭配對應的參數產生簽名檔案:

openssl req -x509 -new -nodes -sha256 -utf8 -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -config ssl_certificate.conf

此時,資料夾內會產生兩個檔案server.key以及server.crt。我們需要將這兩個檔案複製到指定位置來讓GitLab服務能夠讀取到相關設定。

sudo cp server.key /gitlab/config/ssl/gitlab.me.key sudo cp server.crt /gitlab/config/ssl/gitlab.me.crt

在完成設定後,我們還需要更改我們在docker-compose.yml中的external_host參數,讓連線協議從HTTP改為HTTPS

#修改前
environment:
  GITLAB_OMNIBUS_CONFIG: |
    external_url "http://gitlab.me"
    letsencrypt['enable'] = false
    
#修改後
environment:
  GITLAB_OMNIBUS_CONFIG: |
    external_url "https://gitlab.me"
    letsencrypt['enable'] = false

只需要重新執行docker-compose up指令即可套用設定。

接下來,我們需要讓使用的系統信任此憑證。以Ubuntu為例,我們只需要把剛剛產生的server.crt下載到系統之中,並將其複製到/usr/local/share/ca-certificates資料夾之下,並執行sudo update-ca-certificates指令即可使Ubuntu信任我們簽署的證書。

延伸閱讀 — 啟用GitLab Container Registry

以先前方式所建立的GitLab,本身即自帶有Container Registry的功能,但需要一些設定才能啟用。所需要的設定如下:

  1. 定registry域名
  2. 為registry域名產生SSL憑證
  3. 重啟GitLab

設定registry域名

如果要為Container Registry設定與自架GitLab不同的域名,需要在gitlab.rbContainer Registry settings章節中進行設定:

  • 使用原有域名

    若要使用原有域名,只需要將registry_external_url的網址改為https://<domain name>:5050即可。以本文為例:

    image

為registry域名產生SSL憑證

  • 使用原有域名

    當使用原有域名時,不需要額外進行設定。

重啟GitLab

當域名的設定,憑證的設定均完成後,我們可以透過docker-compose restart重啟服務。在靜待幾分鐘的重啟後,就可以使用Container Registry了。

參考資料

  1. 如何在區域網路用 Docker 架設有 SSL 的 Gitlab

  2. GitLab Container Registry Administraion

tags: 技術隨筆 DevOps GitLab Docker Docker-compose HTTPS HTTP Self-Host