0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

さくら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 だけでデプロイが完結!

同じように詰まっている人、参考にしてください。
(いないかな)


参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?