はじめに
さくらVPSのSSH設定を済ませ、さぁデプロイだということで、
GitHub Actionsを使った自動デプロイの実施をしました。
「pushしたら自動でサーバに反映される、楽々~」と思っていたら、
速攻エラーが出ました。
Permission denied (publickey).
fatal: Could not read from remote repository.
原因はSSH設定の抜けと気づくまでが長かったです。
今回はその忘備録です。
やろうとしていたこと
① ローカルで開発・テスト
↓ git push
② GitHub(リポジトリ)
↓ GitHub Actionsが起動
③ GitHub Actions(CI/CDランナー)
↓ SSHでVPSに接続
④ さくらVPS
↓ git pull → ビルド → アプリ再起動
⑤ Spring Bootアプリ公開
pushするだけで本番に反映される、CI/CDパイプラインの構築です。
まず全体のSSH接続を整理する
全体を理解できていなかったことが、詰まりの根本原因だったようです。
このデプロイフローにはSSH接続が2箇所あります。
【接続①】GitHub Actions ──SSH──→ さくらVPS
「ランナーがVPSに入ってコマンドを実行する」
【接続②】さくらVPS ──SSH──→ GitHub
「VPS上でgit pullしてソースを取得する」
自分が設定していたのは、ローカルPC → VPS への接続だけ。
上の2つはどちらも別途設定が必要でした。
発生したエラー
GitHub Actionsのワークフローを実行すると、ログにこのエラーが出ていました。
Run ssh deploy@xxx.xxx.xxx.xxx "cd /var/www/myapp && git pull origin main"
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Error: Process completed with exit code 128.
GitHub ActionsからVPSへの接続(接続①)は成功していました。
エラーが出ていたのは、VPS上で git pull を実行したとき(接続②)でした。
解決までの全手順
接続①の設定:GitHub Actions → さくらVPS
これはワークフロー実行前に一度だけ設定します。
Step 1:デプロイ用のSSH鍵ペアをローカルで生成する
本番運用では、ローカルログイン用とは別の鍵を作ることを推奨します。
# ローカルPCで実行
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/id_ed25519_deploy
2つのファイルが生成されます。
~/.ssh/id_ed25519_deploy ← 秘密鍵(GitHubに登録する)
~/.ssh/id_ed25519_deploy.pub ← 公開鍵(VPSに登録する)
Step 2:公開鍵をVPSに登録する
# VPS上で実行
echo "公開鍵(id_ed25519_deploy.pub)の内容" >> ~/.ssh/authorized_keys
または、ローカルから転送:
# ローカルPCで実行
ssh-copy-id -i ~/.ssh/id_ed25519_deploy.pub -p 2222 your_username@サーバのIPアドレス
Step 3:秘密鍵をGitHub Secretsに登録する
GitHubリポジトリの Settings → Secrets and variables → Actions → New repository secret から登録します。
Name : SSH_PRIVATE_KEY
Value : id_ed25519_deploy の中身(-----BEGIN OpenSSH PRIVATE KEY----- から全文)
あわせて以下も登録しておきます。
| Secret名 | 値 |
|---|---|
SSH_PRIVATE_KEY |
秘密鍵(id_ed25519_deploy)の全文 |
SSH_HOST |
VPSのIPアドレス |
SSH_USER |
VPSのユーザ名 |
SSH_PORT |
SSHポート番号(例:2222) |
Step 4:GitHub Actionsのワークフローを作成する
リポジトリの .github/workflows/deploy.yml を作成します。
name: Deploy to Sakura VPS
on:
push:
branches:
- main # mainブランチへのpushで発火
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
cd /var/www/myapp
git pull origin main
./mvnw package -DskipTests
sudo systemctl restart myapp
ここまで設定すると、GitHub ActionsからVPSへの接続(接続①)は通りました。
しかしこの状態でpushすると、接続②で Permission denied が発生。
接続②の設定:さくらVPS → GitHub ← ここが本題
VPS上で git pull を実行するには、VPS自身がGitHubに認証される必要があります。
Step 5:VPS上でSSH鍵を生成する
# VPSにSSHログインした状態で実行
ssh-keygen -t ed25519 -C "sakura-vps-to-github"
# 保存先はデフォルト(Enter)でOK
# パスフレーズは空推奨(自動デプロイ時にパスフレーズ入力が求められると詰まるため)
~/.ssh/
├── id_ed25519 ← 秘密鍵(VPSの中に置いたまま)
└── id_ed25519.pub ← 公開鍵(GitHubに登録する)
Step 6:公開鍵をGitHubに登録する
# VPS上で公開鍵を表示
cat ~/.ssh/id_ed25519.pub
GitHubの Settings → SSH and GPG keys → New SSH key から登録します。
Title : sakura-vps
Key : 表示された公開鍵をそのまま貼り付け
Step 7:VPS上でGitHubへの接続テスト
ssh -T git@github.com
成功すると:
Hi your_username! You've successfully authenticated, but GitHub does not provide shell access.
ここでまだ詰まる:~/.ssh/config の設定が必要だった
接続テスト(ssh -T git@github.com)は成功したのに、
GitHub Actionsのワークフローを実行すると まだ Permission denied が出ることがあるらしい。
原因は、どの鍵でGitHubに接続するかが明示されていないことです。
特に複数の鍵ファイルがある場合、Gitが正しい鍵を選べないっぽいです。
解決策:~/.ssh/config にGitHub用の設定を追記する
nano ~/.ssh/config
# GitHub用の接続設定
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
# パーミッションの設定(必須)
chmod 600 ~/.ssh/config
IdentitiesOnly yes がポイントです。
これを入れないと、SSHがエージェントに登録されている別の鍵を優先して使ってしまい、
意図しない鍵でGitHubに接続しようとする場合があります。
設定後、再度テストします。
# 詳細ログ付きで接続テスト(-v オプション)
ssh -vT git@github.com
ログの中に以下が出ていれば、正しい鍵を使っています:
debug1: Offering public key: /home/your_username/.ssh/id_ed25519 ED25519
...
Authenticated to github.com
確認:再度GitHub Actionsを実行
設定が完了したら、mainブランチにpushしてワークフローを動かします。
# ローカルで適当な変更をしてpush
git add .
git commit -m "test: CI/CD動作確認"
git push origin main
GitHub ActionsのActionsタブでログを確認します。
✓ Deploy via SSH
$ cd /var/www/myapp
$ git pull origin main
Already up to date.(または差分の取得ログ)
$ ./mvnw package -DskipTests
BUILD SUCCESS
$ sudo systemctl restart myapp
躓きポイントまとめ
| # | 何が起きたか | 原因 | 解決策 |
|---|---|---|---|
| 1 | git pull で Permission denied | VPSのSSH鍵をGitHubに未登録 | VPSで鍵生成 → GitHub公開鍵登録 |
| 2 | 接続テストはOKなのにCI/CDで失敗 |
~/.ssh/config が未設定で鍵の選択が曖昧 |
~/.ssh/config にGitHub用設定を追記・IdentitiesOnly yes
|
| 3 | ワークフローがVPSに接続できない | SSH Secretsのポート番号未設定 |
SSH_PORT を2222等に正しく設定 |
鍵の全体像(設定完了後)
【ローカルPC】
鍵A(id_ed25519) ─→ VPSの authorized_keys に登録
(ローカルからのログイン用)
鍵B(id_ed25519_deploy) ─→ VPSの authorized_keys に登録(同上)
かつ GitHub Secrets に登録
(GitHub ActionsがVPSに入るための鍵)
【さくらVPS】
鍵C(id_ed25519) ─→ GitHubのSSH keys に登録
(VPSがgit pullするための鍵)
~/.ssh/config ─→ GitHubへの接続設定を明示
おわりに
GitHub Actionsによる自動デプロイの構築で詰まったのは、
一言で言えば「SSH接続の方向と用途を混同していた」ことでした。
- GitHub Actions → VPS:ランナーがVPSに入るための鍵(GitHub Secretsに登録)
- VPS → GitHub:VPSがgit pullするための鍵(GitHubのSSH keysに登録)
この2つを整理できると、~/.ssh/config が何をしているのかも理解できるかと思います。
一度設定してしまえば、あとは git push だけでデプロイが完結!
同じように詰まっている人、参考にしてください。
(いないかな)