﻿# 快速上手 GitLab EE on Docker 安裝：以 Ubuntu 22.04 LTS 為例

今天我體驗了 GitLab EE on Docker 的安裝程序，我覺得文件寫的相當不錯，安裝的過程也頗為順利，只是在 Ubuntu 22.04 LTS 還是踩到了一些地雷，有些注意事項在官方文件上並沒有詳細提及，這篇文章我就帶大家來體驗一下完整的安裝設定流程。

![gitlab](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/9cf97584372f85d72e33-234431935-fad124f6-d3d3-4aa2-bfd2-8e8fbcd45b44.png)

> 注意: 官網有說 GitLab on Docker 不支援 Docker for Windows，要用的人風險自負！

### 安裝 Ubuntu 22.04.2 LTS

本篇文章我將使用 `Ubuntu Server (minimized)` 進行最小安裝！

1.  先到 [Get Ubuntu Server](https://ubuntu.com/download/server) 下載最新版 ISO
    
2.  建立 HyperV 並採用 `Ubuntu Server (minimized)` 安裝
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/26f232b3a99e77dc4e25-234298867-fe2aa561-e341-4df8-b6c8-6bf998a8c8cd.png)
    
    > 安裝過程可以安裝 `Install OpenSSH Server` 選項，也要記得安裝 `docker` 套件！
    

### 變更預設 OpenSSH Server 的埠號

由於 GitLab 會用到 Port 22 做為 SSH 的通道，做為 `git clone` 之用，所以我們可以將預設的 Port 22 修改為其他 Port 埠號。

1.  先安裝 vim 編輯器
    
    ```bash
    sudo apt install vim
    ```
    
2.  修改 Port 從 22 調整為 22000
    
    ```bash
    sudo vi /etc/ssh/sshd_config
    ```
    
    ```
    Port 22000
    ```
    
3.  重啟 OpenSSH Server
    
    ```bash
    sudo systemctl restart sshd
    ```
    
4.  登出並重新登入
    
    ```bash
    exit
    ```
    
    ```bash
    ssh 192.168.1.103 -p 22000
    ```
    

### 執行 GitLab EE on Docker

執行步驟與注意事項如下：

1.  設定 `GITLAB_HOME` 目錄
    
    在 Ubuntu 22.04 LTS 預載的 Docker 是透過 Snap 安裝的，這個版本的 Docker 只要使用 `-v` 或 `--volume` 掛載磁碟，本地目錄一定要在 `$HOME` 目錄下，所以當我們用 `root` 身分執行 GitLab 容器時，我們的 `GITLAB_HOME` 一定要設定在 `/root` 目錄下！
    
    ```bash
    export GITLAB_HOME=/root/gitlab
    ```
    
2.  執行 GitLab 容器
    
    這裡我們直接執行 GitLab EE 企業版，若未來想要升級企業版時，可以直接購買授權原地升級！
    
    這裡我們直接以 `gitlab.example.com` 這個域名做示範，我在我的個人電腦會設定 `hosts` 檔案連接到這個暫時的域名。
    
    ```bash
    sudo docker run --detach \
      --hostname gitlab.example.com \
      --publish 443:443 --publish 80:80 --publish 22:22 \
      --name gitlab \
      --restart always \
      --volume $GITLAB_HOME/config:/etc/gitlab \
      --volume $GITLAB_HOME/logs:/var/log/gitlab \
      --volume $GITLAB_HOME/data:/var/opt/gitlab \
      --shm-size 256m \
      gitlab/gitlab-ee:latest
    ```
    
    > 這裡的啟動時間可能蠻長的，我的電腦就要啟動 2 分鐘左右，你可以用 `sudo docker logs -f gitlab` 查看啟動狀況。
    
3.  查詢預設 `root` 登入密碼
    
    ```bash
    sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
    ```
    
    > 注意: 這組密碼會在啟動後的 24 小時後自動失效。
    
4.  登入 Web 介面
    
    由於我們尚未設定 TLS 憑證(HTTPS)，所以請先透過 `http://gitlab.example.com` 登入即可！
    

### 調整 GitLab EE on Docker 設定

1.  進入到 GitLab 容器中
    
    ```bash
    sudo docker exec -it gitlab /bin/bash
    ```
    
2.  透過 vi 編輯主要的 `/etc/gitlab/gitlab.rb` 設定檔
    
    ```bash
    sudo docker exec -it gitlab editor /etc/gitlab/gitlab.rb
    ```
    
    你至少要編輯最重要的 `external_url` 設定，給定未來使用時的主要網址。
    
    ```
    external_url 'https://gitlab.example.com'
    ```
    
3.  手動設定 HTTPS 安全連線
    
    停用 letsencrypt 自動設定
    
    ```bash
    sudo docker exec -it gitlab editor /etc/gitlab/gitlab.rb
    ```
    
    ```bash
    letsencrypt['enable'] = false
    ```
    
    安裝 [mkcert](https://github.com/FiloSottile/mkcert) 自簽憑證建立工具
    
    ```bash
    sudo apt install libnss3-tools -y
    curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
    chmod +x mkcert-v*-linux-amd64
    sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert
    rm -f mkcert-v*-linux-amd64
    ```
    
    使用 [mkcert](https://github.com/FiloSottile/mkcert) 快速建立自簽憑證
    
    ```bash
    mkcert -install
    mkcert gitlab.example.com
    ```
    
    > 此命令會產生 `gitlab.example.com-key.pem` 與 `gitlab.example.com.pem` 檔案，且預設根憑證放在 `~/.local/share/mkcert/` 目錄下。
    
    在容器中建立憑證資料夾與複製憑證進去 (需注意金鑰與憑證的檔名格式)
    
    ```bash
    sudo docker exec -it gitlab mkdir -p /etc/gitlab/ssl
    sudo docker exec -it gitlab chmod 755 /etc/gitlab/ssl
    sudo docker cp gitlab.example.com-key.pem gitlab:/etc/gitlab/ssl/gitlab.example.com.key
    sudo docker cp gitlab.example.com.pem     gitlab:/etc/gitlab/ssl/gitlab.example.com.crt
    ```
    
4.  重新啟動 GitLab 容器
    
    ```bash
    sudo docker restart gitlab
    ```
    
    > 這裡的啟動時間可能蠻長的，我的電腦就要啟動 2 分鐘左右，你可以用 `sudo docker logs -f gitlab` 查看啟動狀況。
    
5.  登入 Web 介面
    
    由於我們已經設定好 TLS 憑證(HTTPS)，所以此時你已經可以透過 HTTPS 的 `https://gitlab.example.com` 登入網站！👍
    
6.  設定 HTTP 自動轉向 HTTPS 安全連線
    
    透過 vi 編輯主要的 `/etc/gitlab/gitlab.rb` 設定檔
    
    ```bash
    sudo docker exec -it gitlab editor /etc/gitlab/gitlab.rb
    ```
    
    加入以下設定
    
    ```bash
    nginx['redirect_http_to_https'] = true
    ```
    
    重新啟動 GitLab 容器
    
    ```bash
    sudo docker restart gitlab
    ```
    

### 解決 Git 無法信任自簽憑證的問題

我在[如何在 Windows 安裝 Gitea 源碼版控系統與 PostgreSQL 14 資料庫](/post/2022/02/01/Install-PostgreSQL-and-Gitea-on-Windows)文章中有個「**設定 Git 用戶端工具信任 Gitea 的自簽憑證**」段落，有提到相關處理方法。

若想找到 [mkcert](https://github.com/FiloSottile/mkcert) 的預設 Root CA 憑證所在的路徑，可以用以下命令查詢出來：

```bash
mkcert -CAROOT
```

若想找到 git 預設的 CA 憑證檔在哪裡，可以用以下命令查詢出來：

```bash
git config --system http.sslCAInfo
```

### GitLab 首次使用設定

請參考 [快速上手 GitLab 安裝與首次使用設定：以 Ubuntu 22.04 LTS 為例](/post/2023/04/24/Install-and-Configure-GitLab-on-Ubuntu-2204-LTS) 文章的「**從 Web 介面初始化設定 GitLab**」章節說明。

### 相關連結

-   [GitLab Docker images | GitLab](https://docs.gitlab.com/ee/install/docker.html#install-gitlab-using-docker-engine)
    -   [Configure SSL for the GitLab Linux package | GitLab](https://docs.gitlab.com/omnibus/settings/ssl/index.html#configure-https-manually)
-   [How to Change SSH Port in Ubuntu 18.04](https://www.ubuntu18.com/ubuntu-change-ssh-port/)
-   [FiloSottile/mkcert: A simple zero-config tool to make locally trusted development certificates with any names you'd like.](https://github.com/FiloSottile/mkcert)
