Community程式設計與開發github.com

byteTuto/網站部署

部署、檢查、診斷或回退託管在 Amazon EC2(Docker + nginx、GitHub Actions、GHCR、Let's Encrypt)上的 byteTuto 網站。用於任何與上線、HTTPS、伺服器或 CI/CD 管道相關的問題。

網站部署 是什麼?

此技能用於管理 byteTuto 網站在 Amazon EC2 上的完整部署生命週期。它利用 GitHub Actions 實作 CI/CD 管道:程式碼推送到 main 分支後會觸發測試(Docker 建置、nginx 設定檢查、健康檢查/404/CSP 冒煙測試)、發布(推送多架構映像檔至 ghcr.io/bytetuto/website)以及部署(透過 SSH 連線至 EC2,複製並執行部署腳本)。部署腳本會拉取新映像檔、啟動容器,並在 40 秒內等待健康端點回應,若失敗則自動回退至上一版映像檔。此技能亦包含 SSL 憑證管理(使用 Let's Encrypt,透過 init-ssl.sh 初始化,並由 cron 自動續約)、由 nginx 根據憑證是否存在自動切換 HTTP/HTTPS 設定,以及完整的故障排除指引(涵蓋 SSH 金鑰權限、Docker 權限、GHCR 存取權限、Security Group 連接埠開放、架構不符等常見問題)。它也明確訂定安全規則,禁止讀取 .env、SSH 金鑰或 certbot 目錄,且在執行 git push、ssh、scp 或修改 deploy/ 目錄與工作流程前務必先取得使用者確認。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/byteTuto/website/tree/HEAD/.claude/skills/deploy-ec2

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

在 EC2 上部署 byteTuto

部署流程

  1. git push 到 main → .github/workflows/deploy.yml
  2. 測試 任務:docker build、nginx -t、冒煙測試(/healthz、首頁、404、CSP 標頭)。
  3. 發布 任務:多架構映像(amd64 + arm64)推送至 ghcr.io/bytetuto/website:<sha7> 及 :latest。
  4. 部署 任務:SSH 至 EC2,寫入 /opt/bytetuto/.env,複製 docker-compose.yml + deploy/*.sh,執行 deploy/deploy.sh。
  5. deploy.sh:拉取映像、up -d、等待 /healthz(最多 40 秒)。失敗 → 自動回退至 .last_image 的映像。

Pull Request 僅執行測試任務。

GitHub Secrets / 變數(Settings → Secrets and variables → Actions)

  • Secrets:EC2_HOST、EC2_USER(ec2-user 或 ubuntu)、EC2_SSH_KEY(完整私鑰)、EC2_KNOWN_HOSTS(建議:ssh-keyscan -H <ip> 的輸出)。
  • 變數:DOMAIN(例如 bytetuto.com)、LETSENCRYPT_EMAIL。
  • GitHub 環境 production(可能需要手動審核)。

實用指令(在 EC2 上,目錄 /opt/bytetuto)

  • 狀態:docker compose ps · 日誌:docker compose logs -f web
  • 健康檢查:curl -fsS http://127.0.0.1/healthz
  • 重新部署特定版本:IMAGE=ghcr.io/bytetuto/website:<sha7> bash deploy/deploy.sh
  • 手動回退:使用舊標籤重新執行 deploy.sh(可在 GitHub 的 Packages 標籤頁查看)。
  • HTTPS(一次設定,在 DNS 設定完成後):bash deploy/init-ssl.sh(建議先用 STAGING=1 測試)。
  • 憑證續約:cron 任務 /etc/cron.d/bytetuto-certbot(每日 2 次),日誌寫入 certbot-renew.log。

nginx 如何選擇 HTTP 或 HTTPS

nginx/40-bytetuto-ssl.sh 在容器啟動時執行: 若 $DOMAIN 有憑證 → 使用 https.conf.template,否則 → 使用 http.conf.template。 執行 init-ssl.sh 後,只需 docker compose restart web 即可啟用 HTTPS。

快速診斷

症狀可能原因
部署任務:Permission denied (publickey)EC2_SSH_KEY / EC2_USER 不正確
docker: permission denied使用者未加入 docker 群組 → 執行 ec2-setup.sh 後重新登入
pull access deniedGHCR 套件為私人且登入失敗,或將套件設為公開
外部連線 HTTP 超時Security Group 未開放 80/443 連接埠
certbot 失敗DNS 尚未傳播,或 80 連接埠未開啟
exec format error架構問題:確認映像是否為多架構

規則

  • 絕不讀取或顯示 .env、SSH 金鑰或 certbot/ 內容。
  • 執行 git push、ssh、scp 或修改 deploy/ 及 workflow 前需先確認。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

相關技能