# 主旨

把專案運行的 GCP VM 環境佈署動作整理,建立 shell script 進行快速佈署。使用作業系統為 Linux Ubuntu

# 執行之前

先執行下面指令,切換為 root 角色

sudo su -

# 要新增的 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