GitHub Actions から VPS へ安全にデプロイ
最終更新: 2026-04-24 · 所要 7 分
結論
- SSH 鍵は deploy 専用アカウント + ed25519 + Secrets
- 可能ならクラウド認証は OIDC 化(長期 secret を避ける)
- Blue / Green は compose の 2 系統 + Caddy で切替
どういう場面で必要か
個人 / スタートアップが VPS でサービス運用し、main push → 自動 deploy を組みたい時。
実務で見るポイント
- deploy 専用 Linux ユーザーを作り、~/.ssh/authorized_keys に GH Actions 用公開鍵を登録
- sudo 権限は docker / systemctl reload caddy のみに絞り込む
- GitHub Secrets に VPS_HOST / VPS_USER / VPS_SSH_KEY / DEPLOY_PATH を置く
- appleboy/ssh-action 等でコマンド実行、または rsync でファイル送信 → ssh で再起動
- Blue/Green: docker compose --project-name blue/green で 2 系統、Caddy の upstream を切替
- ログ: Actions の Summary に rollout 後の curl /health 結果を貼る
よくある失敗
- root 直接ログインで SSH を常時許可 → 侵害リスク
- rsync --delete で意図せぬファイル削除
- docker compose up で古いコンテナが残って port 競合
- Secrets を workflow_dispatch 時に echo してログに残す
- deploy 中に DB マイグレーション失敗して blue 側もろとも停止
チェックリスト
- [ ] deploy 専用ユーザー + sudoers 最小権限
- [ ] SSH 鍵は ed25519 かつ deploy 専用
- [ ] Blue / Green の切り替え手順文書化
- [ ] ロールバック: 直前イメージタグを残す
- [ ] /tools/github-actions でワークフロー雛形を生成
- [ ] デプロイ成功を /api/v1/site-health-check(API キー)で確認
よくある質問
OIDC は VPS でも使える?
VPS 自体は OIDC 非対応ですが、AWS / GCP への secret アクセスを OIDC 化することで長期 secret を減らせます。VPS 側への deploy 自体は SSH が実務標準です。
Webhook で docker pull + restart するだけで良くない?
簡易な構成では可能です。ただし healthcheck + rollback + blue/green 切替 が必要になると GH Actions 側で制御した方が運用しやすくなります。
deploy 時間が長くて 5 分以上かかる
multi-stage Dockerfile + レイヤキャッシュ + GitHub Container Registry の pull で大幅短縮できます。docker build に `--cache-from` を指定。
DB マイグレーションは deploy のどこで?
Blue/Green の切替前に新イメージで migrate → 成功後に traffic 切替、の順が安全です。Drizzle なら pnpm migrate を deploy job で実行。