[conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする

はじめに
Laravelで個人開発中の備忘録です。
conoha VPSにDocker + Laravel構成のローカル開発環境とVPSのdev環境とそのデプロイ機構までを作成していきますので是非ご参考ください🙌
- [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
- [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
- [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する
- [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする (←今ここ)
- [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定
今回はGitHubActionsでデプロイする内容のため、構成図的には以下の④を範囲になります。
(構成図の画像は拡大してご確認いただけます)

GitHubActionsでやることの概要
GitHubActionsのワークフローは以下です。
- ホストのApacheの設定でメンテナンスページを返すようにする(メンテナンスモード化)
git pull origin main- Dockerコンテナ内で
php artisan migrate --force - ホストのApacheの設定のメンテナンスモードを解除する
Apache側の準備
上記の流れを実施する上で、まずはApache側の設定が必要なので対応します。
メンテナンスページを配置
ローカルからVPSにadminでログインします。(記事②を参考)
ssh conohavps
メンテナンスページを設置します。
vi /var/www/html/maintenance.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>メンテナンス中</title>
<style>
body { text-align: center; padding: 100px; font-family: "Helvetica Neue", sans-serif; }
h1 { font-size: 50px; }
p { font-size: 20px; color: #666; }
</style>
</head>
<body>
<h1>ただいまメンテナンス中です</h1>
<p>しばらくしてから再度アクセスしてください。</p>
</body>
</html>
※htmlはChatGPTに製なのでよしなに変更してください。
メンテナンス用のApacheのバーチャルホスト設定をする
前回の記事で作成した/etc/apache2/sites-available/dev-app.confを複製して以下のように変更します。
sudo cp /etc/apache2/sites-available/dev-app.conf /etc/apache2/sites-available/maintenance.conf
- ServerName dev-app.sample.com
+ #ServerName sample.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
+ DirectoryIndex maintenance.html
- # リバースプロキシ設定
- ProxyPreserveHost On
- ProxyPass / http://127.0.0.1:7000/
- ProxyPassReverse / http://127.0.0.1:7000/
ワークフローを作成
GitHubのシークレットに登録
以下をGitHubのシークレットに登録ます。
SSH_PRIVATE_KEYは②の記事でローカルPCで作成した.ssh/id_rsa_conohavpsの中身です。
| GitHubのシークレット | 値 |
|---|---|
| SSH_PRIVATE_KEY |
.ssh/id_rsa_conohavpsの中身 |
| SSH_HOST | conoha VPSのIPアドレス |
| SSH_USERNAME | admin |
| SSH_PORT | 12345 |
.github/workflows/deploy.yaml
devブランチのsrc/以下の差分がプッシュやマージされた場合にアクションが実行されます。
name: Deploy dev
on:
push:
branches:
- dev
paths:
- 'src/**'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
# メンテナンスモード ON
- name: ⚠️ Enable maintenance mode (switch Apache site)
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
sudo a2dissite dev-app.conf
sudo a2dissite dev-phpmyadmin.conf
sudo a2ensite maintenance.conf
sudo systemctl reload apache2
# コードの更新
- name: 📦 Pull latest code
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
cd /var/www/dev_app
git pull origin dev
# マイグレーション実行
- name: 🛠️ Run Laravel Migrations
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
cd /var/www/dev_app/docker
docker compose -f compose.dev.yaml exec app bash -c "php artisan migrate --force"
# メンテナンスモード OFF
- name: ♻️ Disable maintenance mode (restore Apache site)
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: |
sudo a2dissite maintenance.conf
sudo a2ensite dev-app.conf
sudo a2ensite dev-phpmyadmin.conf
sudo systemctl reload apache2
adminのsudoをNOPASSWDに設定
adminはパスワードなしでsudoコマンドを実行できるように設定しておきます。
sudo visudo
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
+ admin ALL=NOPASSWD: ALL
動作確認
Laravelのウェルカムページのtitleを変更し、mainブランチにpushします。
- <title>Laravel</title>
+ <title>Laravel-test</title>
GitHubページのActionsタブを確認し、ワークフローが成功できていればOKです。
(http://dev-app.sample.comにアクセスしてLaravelのホーム画面のtitleがLaravel-testに変わっているか確認してください)

メンテナンス化されているか確認する場合は?
再度上記の手順を行います。pushした直後からhttp://dev-app.sample.comにアクセスし続けると途中でメンテナンスモードの画面切り替わった後、元のLaravelのホーム画面が表示されると思います。
スタート

↓
数秒後
↓
メンテナンスモード中

↓
数秒後
↓
メンテナンスモード解除

まとめ
今回はGitHubActionsでデプロイしました!
次回のSSL化対応は作成中のためしばらくお待ちください。
- [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
- [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
- [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する
- [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする (←今ここ)
- [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定
Discussion