Infra Ops Hub

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 で実行。

関連ツール・比較・ガイド