CI/CD Server Note 01

記錄在Server上安裝Git Server和實驗一些CI/CD等一些自動化流程方法。

CI/CD Server Note 01

環境建置

記錄在Server上安裝Git Server和實驗一些CI/CD等一些自動化流程方法。

GPU Driver安裝

移除舊的Driver:

sudo apt-get purge nvidia*
sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /usr/local/cuda*

安裝Nivida Driver:

sudo apt update
sudo apt install nvidia-utils-"版本號"
sudo apt install nvidia-driver-"版本號"

重新開機,確認安裝是否成功:

sudo apt update
nvidia-smi

結果如下:

Docker 安裝

先更新環境和安裝需要的套件:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install curl net-tools

設定repo以及GPG Key:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

安裝 nvidia-docker2:

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

測試是否能透過docker抓到gpu的資訊:

sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

將使用者加入docker群組可以不需使用sudo就可以執行docker:

sudo usermod -aG docker $USER

安裝Docker-Compose

下載docker-compose/user/local/bin/docker-compose,這次安裝的是2.20.2版本,若有更新再更改網址上的版本號即可:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

安裝Portainer

加入docker群組後記得重新登出登入,安裝portainer,用來管理docker:

docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

用瀏覽器開啟https://localhost:9443/,開啟後設定帳號密碼、重開登入:

安裝Gitea

在建立Gitea的docker-compose之前先建立volume:

docker volume create --name gitea

在目標資料夾下新增docker-compose.yml 檔案,用來創建Gitea的container:

version: "3"

networks:
  gitea:
    external: false
volumes:
  gitea:
    driver: local
services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    restart: always
    networks:
      - gitea
    volumes:
      - gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"

因為使用volume所以用ssh進入container內,輸入以下指令進入app.ini參數設定:

vi /data/gitea/conf/app.ini

在目前版本(1.20.2)上Gitea跳出警告,將Mode修改成以下:

[log]                                                      
MODE = console                                              
LEVEL = info                                            
ogger.router.MODE = console                                 
ROOT_PATH = /data/gitea/log 

讓 Gitea 可以方便搜尋程式碼:

[indexer]
REPO_INDEXER_ENABLED = true

mailer設定:

[mailer]                                    
ENABLED = true                              
SMTP_ADDR = smtp.mailgun.org            
SMTP_PORT = 587                                             
FROM = "[email protected]"                        
USER = mailgun.username
PASSWD = mailgun.password

建立HTTPS 私人憑證以供後續的Cloudflare Zero Trust使用:

cd /data/gitea/
gitea cert --host mysite.com
chown git:git key.pem

app.ini加入key的位置(當前目錄為APP_DATA_PATH所設定的路徑):

[server]
APP_DATA_PATH = /data/gitea
PROTOCOL = https
DOMAIN = your.domain
SSH_DOMAIN = your.domain
ROOT_URL  = https://subdomain.your.domain/
CERT_FILE = cert.pem
KEY_FILE = privkey.pem

設定Cloudflare Zero Trust的Tunnels內網穿透

Cloudflare Zero Trust這個服務免去了架設網站時需要解決和網路相關的問題,可以直接透過外網聯入沒有public ip或是有防火牆阻擋的Server。

在Cloudflare上點選Zero Trust:

在Access中點選Tunnels:

建立Tunnels:

輸入你要建立的Tunnel名稱:

接下來選擇要使用內網穿透的環境:

照著指令安裝Cloudflare的Tunnels:

docker run --restart=always -d --name cloudflare_tunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token "加上在Cloudflare中Tunnel的Token"

在安裝上方指令的主機上,填寫可以連到服務的內網網址和對應的public hostname:

寫完可以在DNS紀錄上看到剛剛設定的網址:

假如有 HTTPS 私人憑證的話可以選 No TLS Verify 讓 Cloudflare Tunnel 可以順利連線:

在Tunnels管理頁面中,可以新增其他服務的網址與其指定的公開網址:

Access Your Application (可選)

開啟了Tunnels讓你可以從公開網域連到你的應用以外,還可以增加一層Zero Trust policies來保護你的應用,開啟後當用戶請求訪問 Cloudflare Zero Trust背後的應用時,系統會檢查每個請求的設備運行狀況和用戶身份,只有符合設定政策的用戶才會被允許進入。

到Access > Applications,新增application:

選擇Self-hosted即可:

填寫應用的名稱和要啟用的域名:

設定連入限制的條件:

結論

Server的安裝和使用GPU的Docker在網路上都有很多教學了,這次透過Cloudflare Zero Trust的Tunnels來實現與外網的連接,透過這種方式連結發現方便了許多,以往要連結DNS需要設定的東西都可以免去,單純地透過內網的網址來轉接到public可以省去的很多步驟。在建立container時有開放了ssh的port,因為還沒有使用ssh來連線,目前還不確定可不可以直接做連線,後續有機會的話再嘗試。