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 = "brad@mailgun.your.username"
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來連線,目前還不確定可不可以直接做連線,後續有機會的話再嘗試。