Upvotes
1
Upvotes: 1我現在有一個雲端的電腦會接收來自我自己的 public repo 我要怎麼讓這個雲端電腦自動pull 然後重啟 compose
你要的其實就是一個「最小版 CD(Continuous Deployment)」:public repo 有新 push → 雲端機器自動更新程式碼 → docker compose 重啟/更新服務。最常見、也最乾淨的做法是 GitHub Actions 透過 SSH 進你的雲端機器跑 deploy script。
下面給你一套可以直接抄的做法(不用在雲端機器上開 webhook 服務、也不用輪詢)。
git pull → docker compose up -d假設你把服務放在 /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 內容)。
在雲端電腦上:
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>
到你的 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 私鑰內容(整段貼上)在 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 管。docker compose up -d --build OK
如果你是「CI build image 推到 registry」:改成 docker compose pull && docker compose up -d 會更快更乾淨。如果你不想用 Actions,也可以每分鐘跑一次 deploy.sh(缺點:不是即時、而且會一直打 git fetch)。
概念就是 systemd service + timer,我也可以給你完整 unit 檔,但通常 A 方案比較標準、也比較省事。
如果你回我 3 個資訊,我可以把上面範例改成「完全貼上就能用」的版本:
/opt/<name>)
Comments
Login to add a comment.
No comments yet.