# 主旨
把專案運行的 GCP VM 環境佈署動作整理,建立 shell script 進行快速佈署。使用作業系統為 Linux Ubuntu
# 執行之前
先執行下面指令,切換為 root 角色
# 要新增的 Linux 帳號
把要新增的帳號、密碼作為變數寫在 script 最上面,為了給共同維護的人登入用的。
| ACCOUNT=<帳號> |
| PASSWORD=<密碼> |
# GitHub 帳號
執行環境會把 docker image 從 GitHub registry 抓下來執行,所以在 script 最上面把 GitHub 權限設定為變數,之後執行讀取變數即可。密碼為 PAT(personal access token),建立方法請參考 建立 PAT。
| GITHUB_ACCOUNT=<github帳號> |
| GITHUB_PAT=<github PAT> |
# 設定時區
| timedatectl set-timezone Asia/Taipei |
# 作業系統更新
| apt update && apt upgrade -y |
| apt-get clean -y |
| apt-get autoremove -y |
# 啟用 Google BBR
| modprobe tcp_bbr |
| echo "tcp_bbr" >> /etc/modules-load.d/modules.conf |
| echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf |
| echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf |
| sysctl -p |
# Install Ops Agent
安裝 GCP agent,如果不是使用 GCP 可以不用執行
| curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh |
| bash add-google-cloud-ops-agent-repo.sh --also-install |
# 安裝 Docker
所有專案都以 container 形式使用 docker compose 運行。安裝 docker 沒毛病。
| apt-get update |
| apt-get install ca-certificates curl gnupg lsb-release -y |
| mkdir -p /etc/apt/keyrings |
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg |
| echo \ |
| "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ |
| $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null |
| apt-get update |
| apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y -q |
# 安裝 Portainer with Docker Swarm
使用 portainer 管理 container,portainer 很棒,是 web 界面。加上 docker swarm 是為了讓程式上傳後可以通知 server 去 pull 新的 image 自動佈署。 一言不合就 CI/CD
| docker volume create portainer_data |
| docker run -d -p 8000:8000 -p 9443:9443 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest |
| docker swarm init |
# 建立 crond docker-prune
每天自動清理 docker 垃圾,每次更新產生沒用的 image、cointainer 太多會造成主機容量不足掛掉。
不然每次掛掉老闆都罵我,我也不知道為什麼有人一天要 commit 600 次
| cat >> /etc/cron.daily/docker-prune << EOL |
| #!/bin/bash |
| docker system prune -af |
| EOL |
| chmod ugo+x /etc/cron.daily/docker-prune |
# 建立 Linux 帳號
使用最上面設定的變數建立帳號,讓其他維護的同學登入。
| useradd -c "update user" -s /bin/bash -G sudo -m $ACCOUNT |
| echo "$ACCOUNT:$PASSWORD" | chpasswd |
# 登入 Docker registry
登入 GitHub registry 之後 docker pull 就不用輸入密碼,讚!
| echo $GITHUB_PAT | docker login ghcr.io --username $GITHUB_ACCOUNT --password-stdin |
# 完整 shell script