雲端自動部署設定

Votes

Upvotes

1

Upvotes: 1

Downvotes

0

Downvotes: 0

Net votes

+1

Prompt

我現在有一個雲端的電腦會接收來自我自己的 public repo 我要怎麼讓這個雲端電腦自動pull 然後重啟 compose

Response

你要的其實就是一個「最小版 CD(Continuous Deployment)」:public repo 有新 push → 雲端機器自動更新程式碼 → docker compose 重啟/更新服務。最常見、也最乾淨的做法是 GitHub Actions 透過 SSH 進你的雲端機器跑 deploy script

下面給你一套可以直接抄的做法(不用在雲端機器上開 webhook 服務、也不用輪詢)。

做法 A(推薦):GitHub Actions → SSH → git pulldocker compose up -d

1) 雲端電腦準備一個部署資料夾 + deploy 腳本

假設你把服務放在 /opt/myapp

sudo mkdir -p /opt/myapp
sudo chown -R $USER:$USER /opt/myapp
cd /opt/myapp

# 第一次 clone(你的 repo 是 public 的話用 HTTPS 也行)
git clone https://github.com/<you>/<repo>.git .

建立 deploy 腳本 /opt/myapp/deploy.sh

cat > /opt/myapp/deploy.sh <<'SH'
#!/usr/bin/env bash
set -euo pipefail

APP_DIR="/opt/myapp"
BRANCH="main"

cd "$APP_DIR"

# 確保乾淨地跟遠端同步(避免 local drift)
git fetch origin "$BRANCH"
git reset --hard "origin/$BRANCH"

# 你如果有用 .env / secrets,記得不要靠 repo 內的檔案覆蓋它

# 更新 image(看你的情況:有些是 build、有些是 pull)
docker compose pull || true

# 重新 build(如果你 compose 有 build:)
docker compose up -d --build

# 可選:清掉沒用到的 image
docker image prune -f
SH

chmod +x /opt/myapp/deploy.sh

這個腳本用 reset --hard origin/main 是為了避免雲端機器上被人手動改檔造成後續 pull 衝突(部署機器通常不該改 repo 內容)。

2) 雲端電腦建立一把 SSH key(給 GitHub Actions 用)

在雲端電腦上:

ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/gh_actions_deploy -N ""
cat ~/.ssh/gh_actions_deploy.pub

把印出的 public key 加到雲端電腦的 ~/.ssh/authorized_keys(同一台機器通常已經有你自己的 key;這把是給 Actions 用的)。

建議加上限制(更安全),例如只允許跑 deploy 腳本(可選): authorized_keys 一行可以長這樣(概念示意):

command="/opt/myapp/deploy.sh",no-port-forwarding,no-agent-forwarding,no-pty <PUBLIC_KEY>

3) 在 GitHub Repo 設定 Secrets

到你的 GitHub repo → Settings → Secrets and variables → Actions,新增:

  • DEPLOY_HOST:你的雲端機器 IP/網域
  • DEPLOY_USER:雲端機器使用者(建議用專用 deploy user)
  • DEPLOY_PORT:SSH port(沒改就 22)
  • DEPLOY_KEY~/.ssh/gh_actions_deploy 私鑰內容(整段貼上)

4) 加一個 GitHub Actions workflow:push 就自動部署

在 repo 建立檔案:.github/workflows/deploy.yml

name: Deploy

on:
  push:
    branches: [ "main" ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: SSH deploy
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_KEY }}
          port: ${{ secrets.DEPLOY_PORT }}
          script: |
            /opt/myapp/deploy.sh

完成後:你只要 push 到 main,Actions 就會 SSH 到雲端機器跑 /opt/myapp/deploy.sh,然後 compose 自動更新重啟。

常見細節你可能會踩到(我直接先幫你避坑)

  • 不要把 .env、憑證、API key 放 public repo:在雲端機器用 /opt/myapp/.env 或 docker secret 管。
  • 如果你是「build 在雲端機器」:docker compose up -d --build OK 如果你是「CI build image 推到 registry」:改成 docker compose pull && docker compose up -d 會更快更乾淨。
  • 若你需要「只有某些路徑變更才 deploy」:Actions 可以加 path filter(之後我也可以幫你加)。

做法 B(備案):雲端機器自己輪詢(systemd timer)

如果你不想用 Actions,也可以每分鐘跑一次 deploy.sh(缺點:不是即時、而且會一直打 git fetch)。

概念就是 systemd service + timer,我也可以給你完整 unit 檔,但通常 A 方案比較標準、也比較省事。

如果你回我 3 個資訊,我可以把上面範例改成「完全貼上就能用」的版本:

  1. 你的 branch 名(main/master?)
  2. 雲端機器路徑你想放哪(例如 /opt/<name>
  3. 你的 compose 是「雲端 build」還是「registry pull」

Comments

Login to add a comment.

No comments yet.