動作確認環境
本記事のコマンドは Ubuntu 24.04.4 LTS(Docker公式イメージおよびVPS)で検証しています。Ubuntu 22.04 でも基本手順は同じですが、一部のコマンドオプションが異なる場合があります(バージョン比較表を参照)。
コードを git push するたびに自動でUbuntuサーバーへデプロイできたら、どれだけ楽になるでしょうか。
GitHub Actions を使えば、CI/CDパイプラインを無料(パブリックリポジトリは無制限、プライベートは月2,000分まで)で構築できます。本記事では、SSH + rsync を使った自動デプロイの構築手順を、Ubuntu 24.04 公式Dockerイメージで実際に動かしたコマンド結果(鍵生成・バージョン・rsync差分転送)とともに紹介します。
難しそうに見えて、やることはシンプルです。「SSH鍵を生成してGitHubのSecretに登録し、ワークフローYAMLを書く」だけです。本記事では実際に Ubuntu 24.04 で実行した結果を載せています。
この記事のポイント
git pushをトリガーにUbuntuサーバーへ自動デプロイできる(GitHub Actions無料枠)- SSH認証には
Ed25519鍵を使う—RSAより高速・安全・鍵が短い - 秘密鍵はGitHub Secretsに登録し、リポジトリには一切含めない
- Ubuntu 22.04 vs 24.04 で git/openssh/curl のバージョンが異なる(rsync はどちらも 3.2.7)
- rsync は差分転送で変更分だけを送る(実測:151ファイル中4ファイル変更で送信わずか2,924バイト・speedup 11.58倍)
目次
- GitHub Actionsによる自動デプロイの仕組み
- 前提環境と必要なパッケージ
- UbuntuサーバーにSSH鍵を設定する
- GitHub SecretsにSSH秘密鍵を登録する
- ワークフローYAML(deploy.yml)を作成する
- デプロイを実行して確認する
- よくあるエラーと解決策
- まとめ
GitHub Actionsによる自動デプロイの仕組み
GitHub Actionsは、GitHubが提供するCI/CDプラットフォームです。push や pull_request などのイベントをトリガーに、あらかじめ定義したワークフローを自動実行できます。
Ubuntuサーバーへのデプロイには、主に次の2つの方法があります。
- SSH + rsync:サーバーに SSH 接続してファイルを差分転送する(今回の方法)
- Docker pull:イメージをビルドしてDockerHub/GHCRにpush → サーバーでpull
今回は「シンプルに静的サイトやNode.js/Python等のアプリをVPSに転送したい」というケースを想定して、SSH + rsync の構成を採用します。

前提環境と必要なパッケージ
①動作確認済み環境
- Ubuntu 24.04.4 LTS(サーバー側)
- GitHub Actions(ubuntu-latest ランナー)
- git 2.43.0、OpenSSH 9.6p1、rsync 3.2.7(いずれも Ubuntu 24.04 の apt 候補)
②必要なパッケージをサーバーにインストールする
まず、デプロイ先のUbuntuサーバーに必要なパッケージが入っているか確認します。実際にDocker公式イメージ(ubuntu:24.04)で確認した結果は次のとおりです。
Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
git rsync openssh-server
$ dpkg -l git rsync openssh-server | grep ‘^ii’
ii git 1:2.43.0-1ubuntu7.3 amd64 fast, scalable, distributed revision control system
ii rsync 3.2.7-1ubuntu1.5 amd64 fast, versatile, remote (and local) file-copying tool
ii openssh-server 1:9.6p1-3ubuntu13.16 amd64 secure shell (SSH) server
Ubuntu 22.04 と 24.04 では、これらのパッケージのバージョンが大きく異なります。特に OpenSSH は 8.9p1 → 9.6p1 へ更新されており、FIDO2ハードウェアキーのサポートが強化されています。

UbuntuサーバーにSSH鍵を設定する
GitHub ActionsからサーバーへSSH接続するには、専用のデプロイ鍵を作成する必要があります。ここは絶対に順番を間違えてはいけない重要なステップです。
①SSH鍵のタイプ:Ed25519 を選ぶ理由
SSH鍵には複数のアルゴリズムがありますが、GitHub Actionsのデプロイには Ed25519 を強く推奨します。実際にubuntu:24.04で両方を生成して測ったところ、Ed25519は公開鍵が 115 bytes(RSA-4096 は 759 bytes)と約1/6.6で、生成も約4msとRSA-4096の約1,587ms(3回平均)に比べて圧倒的に高速でした。Ubuntu 24.04 の OpenSSH 9.6p1 はもちろん、2014年以降のほぼすべてのSSHサーバーで利用できます。

②サーバー上でデプロイ鍵を生成する
デプロイ鍵はサーバー上で生成します(ローカルPCで生成して転送しても構いませんが、サーバー上で完結させるほうがシンプルです)。
-f ~/.ssh/deploy_key -N “”
Generating public/private ed25519 key pair.
Your identification has been saved in /home/ubuntu/.ssh/deploy_key
Your public key has been saved in /home/ubuntu/.ssh/deploy_key.pub
The key fingerprint is:
SHA256:esIKQ1OIWB23PlrRodvgk22WwW8kz2e4N4XGmTSfXzs github-actions-deploy@example.com
-N "" はパスフレーズを空にするオプションです。GitHub Actions上では対話的にパスフレーズを入力できないため、パスフレーズなしの鍵を使います。
補足:Ed25519鍵のサイズは RSA-4096 の約1/6.6
Ubuntu 24.04 の OpenSSH 9.6p1 では、-t ed25519 を指定しないと旧来のRSAが使われます。必ず -t ed25519 を付けましょう。実際にDocker(ubuntu:24.04)で wc -c で測ったところ、生成された公開鍵は 115 bytes(秘密鍵 432 bytes)でした。RSA-4096 の公開鍵 759 bytes・秘密鍵 3401 bytes と比べてはるかにコンパクトです。
③公開鍵をauthorized_keysに追加する
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ ls -la ~/.ssh/
drwx—— 2 ubuntu ubuntu 4096 Jun 15 07:54 .
drwxr-x— 4 ubuntu ubuntu 4096 Jun 15 07:54 ..
-rw——- 1 ubuntu ubuntu 432 Jun 15 07:54 deploy_key
-rw-r–r– 1 ubuntu ubuntu 115 Jun 15 07:54 deploy_key.pub
-rw——- 1 ubuntu ubuntu 115 Jun 15 07:54 authorized_keys
パーミッションは必ず正確に設定する
~/.ssh ディレクトリは 700(drwx——)、authorized_keys は 600(-rw——-)でなければ SSH が動作を拒否します。正直、ここが詰まりポイントNo.1です。

④秘密鍵の内容を確認する(GitHub Secretsに登録するため)
次のコマンドで秘密鍵の内容を表示します。この値を後でGitHubに登録します。
—–BEGIN OPENSSH PRIVATE KEY—–
b3BlbnNzaC1rZXktdjEAAAABbm9uZQAAAAQAAAAwAAAAM…
(中略)
—–END OPENSSH PRIVATE KEY—–
秘密鍵をGitリポジトリにコミットしないこと
deploy_key(秘密鍵)は絶対にリポジトリに含めてはいけません。.gitignore に *.pem / deploy_key を追加するか、GitHub Secretsのみに保存してください。
GitHub SecretsにSSH秘密鍵を登録する
GitHub のリポジトリページで、次の操作を行います。
- リポジトリの Settings → Secrets and variables → Actions を開く
- New repository secret をクリック
- 以下の3つのSecretを登録する
| Secret名 | 値の内容 | 取得場所 |
|---|---|---|
SSH_PRIVATE_KEY |
cat ~/.ssh/deploy_key の出力全体 |
サーバー上で確認 |
SSH_HOST |
サーバーのIPアドレスまたはドメイン | VPSのコントロールパネル |
SSH_USER |
SSHログインユーザー名(例: ubuntu) |
サーバー設定で確認 |
Secretは一度登録すると値を読み返せません(上書きのみ可能)。コピーミスに注意しながら、ヘッダー行(-----BEGIN OPENSSH PRIVATE KEY-----)から末尾(-----END OPENSSH PRIVATE KEY-----)まで含めてすべて貼り付けてください。
ワークフローYAML(deploy.yml)を作成する
リポジトリの .github/workflows/ ディレクトリに deploy.yml を作成します。
$ cat > .github/workflows/deploy.yml << 'EOF'
name: Deploy to Ubuntu VPS
on:
push:
branches:
– main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
– name: Checkout
uses: actions/checkout@v4
– name: Setup SSH agent
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
– name: Add host key
run: |
ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
– name: Deploy via rsync
run: |
rsync -avz –delete \
–exclude=’.git’ \
–exclude=’node_modules’ \
./ \
${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/var/www/myapp/
– name: Restart service
run: |
ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \
“sudo systemctl reload nginx && echo ‘Reloaded'”
EOF
各ステップの役割を説明します。
| ステップ名 | 役割 | ポイント |
|---|---|---|
| Checkout | リポジトリのソースコードを取得 | actions/checkout@v4(最新安定版) |
| Setup SSH agent | 秘密鍵をssh-agentに登録 | webfactory/ssh-agent が自動で登録・削除 |
| Add host key | サーバーのホスト鍵をknown_hostsに追加 | ssh-keyscan で自動取得。手動入力不要 |
| Deploy via rsync | 差分転送でファイルを更新 | .git node_modules を除外して転送 |
| Restart service | SSH経由でサービスを再起動 | nginx reload など目的に応じて変更 |
カスタマイズポイント
- デプロイ先ディレクトリ:
/var/www/myapp/を実際のパスに変更する - 再起動コマンド:Node.js なら
pm2 reload all、Python/Gunicorn ならsudo systemctl restart myapp - ブランチ指定:
main以外のブランチや tag でも動かすにはon.push.tags: ['v*']を追加 - ビルドステップの追加:
npm run buildやpip installを “Deploy via rsync” の前に追加できる
デプロイを実行して確認する
ワークフローYAMLをコミット・プッシュすると、GitHub Actionsが自動起動します。
$ git commit -m “ci: GitHub Actions デプロイワークフローを追加”
[main 3a7f9c2] ci: GitHub Actions デプロイワークフローを追加
1 file changed, 42 insertions(+)
$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
To github.com:yourname/myproject.git
a1b2c3d..3a7f9c2 main -> main
GitHub リポジトリの Actions タブを開くと、ワークフローの実行状況をリアルタイムで確認できます。全ステップが緑のチェックマークになれば成功です。

rsyncの差分転送はどれだけ転送量を減らすか
GitHub Actions 上での実デプロイ時間はネットワーク速度やファイル数に左右されますが、rsync の差分転送が「変更したファイルだけ」を送る効果は、ubuntu:24.04 コンテナ内で実測できます。151ファイル・合計約34KBの構成を用意し、初回転送と「3ファイル変更+1ファイル追加」後の差分転送を --stats 付きで比較しました。
Number of regular files transferred: 151
Total transferred file size: 34,842 bytes
Total bytes sent: 43,880
total size is 34,842 speedup is 0.74
# file_1.js / file_75.js / file_150.js を変更し file_new.js を追加
$ rsync -a –stats /src/ /dst/ # ②差分転送
Number of regular files transferred: 4
Total transferred file size: 193 bytes
Total bytes sent: 2,924
total size is 34,939 speedup is 11.58
初回は151ファイル全てが対象で 43,880バイトを送信しましたが、2回目は変更した4ファイルだけが転送対象になり、送信量はわずか 2,924バイト(speedup 11.58倍)まで減りました。毎回のpushで全ファイルを送り直さず、差分だけが転送されるのがrsyncデプロイの強みです。ファイル数や1ファイルあたりのサイズが大きいほど、この削減効果はさらに大きくなります。ランナー起動を含めたワークフロー全体の所要時間は、リポジトリ規模とサーバーの回線によって変わります。
よくあるエラーと解決策
①Permission denied (publickey)
rsync: connection unexpectedly closed
原因と解決策:
- 公開鍵が
authorized_keysに正しく追加されているか確認する(cat ~/.ssh/authorized_keys) ~/.sshのパーミッションが700、authorized_keysが600か確認する- GitHub Secrets に登録した秘密鍵に余分なスペースや改行が入っていないか確認する
authorized_keysに追加したのが 公開鍵(.pub)かを確認する(秘密鍵を間違えて登録するケースが多い)
②Host key verification failed
原因と解決策:
ワークフロー中に ssh-keyscan でホスト鍵を取得するステップが抜けています。”Add host key” のステップが正しく設定されているか確認してください。
注意:ssh-keyscanは通常ステップの前に実行する
“Add host key” ステップは、SSH接続を行うすべてのステップより前に置く必要があります。ステップの順番を確認してください。
③sudo: a terminal is required to read the password
原因と解決策:
SSH経由で sudo コマンドを実行しようとするとパスワードを求められます。パスワードなしで実行できるよう、サーバー側で特定コマンドの sudo を NOPASSWD に設定します。
# 以下の内容を追記(nginxのreloadのみ許可する例)
ubuntu ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx
④rsyncのバージョンを確認する
「Ubuntu 22.04 は rsync が古い」と思われがちですが、2026年6月時点で apt の候補バージョンを実測したところ、22.04・24.04 ともに rsync 3.2.7でした(22.04 は 3.2.7-0ubuntu0.22.04.7、24.04 は 3.2.7-1ubuntu1.5 とパッケージリビジョンだけ異なります)。そのため --mkpath オプション(rsync 3.2.3 で追加)などはどちらでも使えます。古い環境を引き継いでいる場合に備えて、念のためバージョンを確認しておきましょう。
rsync version 3.2.7 protocol version 31
まとめ
GitHub Actions + SSH + rsync でUbuntuサーバーへの自動デプロイを構築する手順をまとめます。
- サーバーに
gitrsyncopenssh-serverをインストールする(Ubuntu 24.04では git 2.43.0、OpenSSH 9.6p1が入る) - Ed25519形式のSSHデプロイ鍵を生成し、公開鍵を
~/.ssh/authorized_keysに追加する - 秘密鍵をGitHub Secrets(
SSH_PRIVATE_KEY)に登録する—リポジトリには含めない .github/workflows/deploy.ymlを作成し、webfactory/ssh-agent+rsync+ssh-keyscanの3ステップを組み合わせるgit pushをトリガーに自動デプロイが走り、差分転送で数秒〜数十秒でデプロイ完了
本格的にVPSを借りてサーバー運用をしたい方は、Vultr の東京リージョン($6/月〜)がおすすめです。GitHub Actionsのデプロイ先として手軽に試せます。
VPSの選び方や初期設定については、以下の記事もあわせてご覧ください。


コメント