在 Ubuntu 上使用 Docker 架設 GitLab Server

什麼是 GitLab

GitLab是由GitLab Inc.開發,使用MIT授權條款的基於網路的Git倉庫管理工具,且具有 Wiki 和 Issue 跟蹤功能。 GitLab 由烏克蘭程式設計師 Dmitriy Zaporozhets 和 Valery Sizov 開發,它由 Ruby 寫成。後來,一些部分用 Go 語言重寫。 (摘錄自維基百科)自從 GitHub 被微軟收購後引爆逃亡潮,開發者紛紛逃向 GitLab 程式碼平台,因此 GitLab 迅速竄紅,成為 Git 倉儲管理工具新一代的代表。

為什麼要使用 Docker 架設 GitLab Server

GitLab 官方已經釋出 GitLab Docker Image,利用 Docker 可以節省許多安裝設定環境的繁瑣步驟,也方便未來管理與維護。有關 Docker 的介紹與安裝步驟,請參考另一篇文章「在 Ubuntu 18.04 上安裝 Docker 與 Docker Compose」。

安裝 GitLab Docker

網路上已經有 GitLab 釋出的官方 Docker Image 安裝文件,也可以找到很多相關的文章,為什麼還要這麼雞婆寫這一篇文章呢?如果按照官方版的安裝步驟,或者是網路上的一些文章,其實多多少少都會遇到一些問題要解決。以下的安裝設定步驟是在 Ubuntu 18.04.1 Server 下測試成功。

1. 建立 docker-compose.yml 文件

vi docker-compose.yml
(底下為檔案內容)
version: '3'
services:
  gitlab:
    hostname: GitLab
    restart: always
    ports:
      - "80:80"
      - "22:22"
    volumes:
      - gitlab_config:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    image:
      gitlab/gitlab-ee:latest
volumes:
  gitlab_config:
  gitlab_logs:
  gitlab_data:


2. 啟動 GitLab Server Docker

請在 docker-compose.yml 目錄下執行 up 指令,若是第一次啟動,系統會自動搜尋 Docker Hub 的 gitlab/gitlab-ee Image,並從網路上下載至您的主機:

docker-compose up -d


Docker Image 下載完成後會自動啟動,您可以用 images 指令確認 Image 已經下載至您的主機,儲存庫(Repository) 會顯示 GitLab 的 Image 名稱:

docker-compose images
docker-compose images


再用 ps 指令確認 GitLab Docker 已經啟動,Name 就是指容器 (Container)的名稱:wizigo_gitlab_x_xxxxxxxxxxxx。其中 wizigo 是我登入的使用者名稱。

docker-compose ps
docker-compose ps

修改 GitLab 設定

1. 修改 GitLab 設定檔 gitlab.rb
現在重點來了!Gitlab 預設值和您的環境一定有些不同,因此必須修改設定才能正常運作。修改設定檔有兩種方式,一種是進入 GitLab 容器(Container)去修改 “/etc/gitlab/gitlab.rb”

(查看 GitLab Container ID)
docker ps
(進入 GitLab 容器)
docker exec -it <Container ID> bash
(進入容器後先安裝 vi)
apt-get update
apt-get install vim
(修改 GitLab 設定檔 gitlab.rb)
vi /etc/gitlab/gitlab.rb


另一種方法是直接修改此路徑對應到主機的 volumes。volumes 會將容器裡面的目錄連結到容器外部主機的目錄,使用 docker 的 volume list 指令可以看到目前系統產生的 volumes 有哪些,以我的主機為例:

docker volume list
docker volume list


上面紅色圈選的地方就是 docker-compose.yml 裡面設定的 GitLab volumes:

  ...  
  volumes:
      - gitlab_config:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
volumes:
  gitlab_config:
  gitlab_logs:
  gitlab_data:


不知道各位有沒有發現,這裡的 volumes 目錄設定和官網範例不太一樣,官網的目錄是 mapping 到主機的絕對路徑:
  – /srv/gitlab/data:/var/opt/gitlab
  – /srv/gitlab/logs:/var/log/gitlab
  – /srv/gitlab/config:/etc/gitlab
如果依照官網範例設定的話,就會出現  volumes 目錄裡面沒有檔案,或是沒有權限讀寫目錄等奇奇怪怪的問題,一勞永逸的方法就是只設定目錄名稱,由系統自行建立 volumes 目錄。docker compose 會將這些設定的 volumes 前面加上登入的使用者名稱,例如我登入的名稱是 wizigo,所以實際產生的 volumes 目錄會是這個樣子:wizigo_<您設定的目錄名稱>,目錄是位在 Ubuntu 路徑 :/var/lib/docker/volumes/,我們可以使用管理者權限去編輯設定檔 gitlab.rb。要特別注意的是,volumes 目錄後面會自動產生 “_data” 目錄,裡面才是放置檔案的真正位置。:

sudo vi /var/lib/docker/volumes/wizigo_gitlab_config/_data/gitlab.rb


接下來是 gitlab.rb 要修改的內容。
external_url :
        設定 GitLab Server 的網址,可以填寫 Domain Name,也可以設定 IP 位置。重點是後面的 port number,這裡假設您要使用 8088 當作 GitLab Server,一般人以為 Docker 裡面的 port number 使用預設值 80 就可以了,在 docker-compose.yml 裡面的 ports 設定 mapping 到 8088 即可:8088:80。如果按照官方範例如此設定的話,之後使用者到 GitLab Server 註冊時收到電子郵件驗證信就會出問題了,因為郵件裡面的驗證連結會連結到 port 80 的網址,可是實際上 GitLab Server 是跑在 8088 上,因此就會出現驗證連結網址錯誤的情況。所以如果外部要使用 port 8088 的話,Docker 內部的 port number 設定也要一起改成 8088 才是正確的設定
gitlab_rails[‘gitlab_email_from’]
        設定 GitLab Server 送信時使用的電子郵件,如果您的郵件是使用 G Suite 套件的話,不需要多花一筆錢申請一個帳號給 GitLab 使用,只需要在使用的 G Suite 帳號中設定一個電子郵件別名即可,另外也需要將登入的電子郵件帳號設定成「允許使用低安全性的應用程式存取」才不會有問題。設定方法請參考之前的文章「G Suite 安全性與別名設定」。下面的 SMTP 的設定我是以 GMail 為範例。
gitlab_rails[‘gitlab_email_from’]
        設定 SMTP 登入的電子郵件帳號,這裡設定的是真正登入使用的帳號,不可使用別名。
gitlab_rails[‘smtp_password’]
        SMTP 登入電子郵件密碼。

相關設定請參考下面的範例:

...
external_url "http://192.168.0.100:8088/"
...
gitlab_rails['gitlab_email_from'] = 'gitlab@wizigo.tw'
...
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "wizigo@wizigo.tw"
gitlab_rails['smtp_password'] = "xxxxxx"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
...
gitlab_rails['smtp_openssl_verify_mode'] = 'peer' # Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert', see http://api.rubyonrails.org/classes/ActionMailer/Base.html
...


設定檔 gitlab.rb 儲存之後,接下來也要修改 docker-compose.ymlports

vi docker-compose.yml
(底下為檔案內容)
version: '3'
services:
  gitlab:
    hostname: GitLab
    restart: always
    ports:
      - "8088:8088"
      - "8089:22"
    volumes:
      - gitlab_config:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    image:
      gitlab/gitlab-ee:latest
volumes:
  gitlab_config:
  gitlab_logs:
  gitlab_data:


docker-compose.yml
 儲存之後,使用 docker compose 的 stop & up 指令重新啟動 Docker 即可:

docker-compose stop
docker-compose up -d

這時候使用瀏覽器連線到 GitLab Server (例如:http://192.168.0.100:8088)即可成功連線。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *