# 自架GitLab - 基於Docker的實作 [TOC] ## 簡介 本篇主要為紀錄如何利用[Docker](https://www.docker.com/)協助開發者在私有網域以及工作站快速的架設[GitLab](https://about.gitlab.com/)服務,在私有環境搭起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 :::info 由於本次將以Docker為基礎建立GitLab服務,故只要主系統能安裝Docker即可。 ::: :::warning 關於更多軟硬體建議需求,可以到GitLab-CE版本的[GitHub文件:link:](https://github.com/jimmidyson/gitlab-ce/blob/master/doc/install/requirements.md)查閱。 ::: ## 安裝步驟 :::warning 請務必將以下教學中的`/path/to/your`前綴更改成讀者自身所設定的位置。 ::: ### 建立虛擬環境 首先,我們可以建立一個具有4核心CPU以及20GB記憶體的`Ubuntu-20.04`虛擬機,並安裝Docker以及必要的軟體。(不使用虛擬機的讀者可以跳過這一步驟。) ```shell= 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 ``` :::warning 本篇所使用的虛擬環境是基於[Proxmox](https://www.proxmox.com/en/)的開源虛擬機管理環境,有興趣安裝者Proxmox的讀者請參考另一篇[安裝設定](https://hackmd.io/@davidho9713/pve_installation)。 ::: ### 編寫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加密。 :::danger 在上方的設定中,我們直接將主系統的80以及443連接埠與容器對接,這是一個非常不建議的行為。本示範因為在內網以及使用虛擬機的狀況下才做出此設定,請勿在將自架服務部屬至公開網域時使用此設定。 ::: ### 啟動服務 在完成設定後,只需要在`docker-compose.yml`所在的資料夾執行以下指令即可建立GitLab服務,並使其在背景執行。 ```shell docker-compose up -d ``` 在經過幾分鐘之後,我們就可以透過`http://192.168.0.101`來連結到GitLab的網站了。  > 如果想使用`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密碼進行登入。  到此,自架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`指令搭配對應的參數產生簽名檔案: ```shell 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服務能夠讀取到相關設定。 ```shell= 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.rb`的**Container Registry settings**章節中進行設定: * 使用原有域名 若要使用原有域名,只需要將`registry_external_url`的網址改為`https://<domain name>:5050`即可。以本文為例:  ### 為registry域名產生SSL憑證 * 使用原有域名 當使用原有域名時,不需要額外進行設定。 ### 重啟GitLab 當域名的設定,憑證的設定均完成後,我們可以透過`docker-compose restart`重啟服務。在靜待幾分鐘的重啟後,就可以使用Container Registry了。 ## 參考資料 1. [如何在區域網路用 Docker 架設有 SSL 的 Gitlab](https://blog.niclin.tw/2020/02/10/build-internal-gitlab-by-self-certificate/) 2. [GitLab Container Registry Administraion](https://docs.gitlab.com/ee/administration/packages/container_registry.html#configure-container-registry-under-an-existing-gitlab-domain) ###### tags: `技術隨筆` `DevOps` `GitLab` `Docker` `Docker-compose` `HTTPS` `HTTP` `Self-Host`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up