🐘

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

に公開

はじめに

Laravelで個人開発中の備忘録です。

conoha VPSにDocker + Laravel構成のローカル開発環境とVPSのdev環境とそのデプロイ機構までを作成していきますので是非ご参考ください🙌

  1. [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
  2. [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
  3. [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する
  4. [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする (←今ここ)
  5. [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定

今回はGitHubActionsでデプロイする内容のため、構成図的には以下の④を範囲になります。
(構成図の画像は拡大してご確認いただけます)

GitHubActionsでやることの概要

GitHubActionsのワークフローは以下です。

  1. ホストのApacheの設定でメンテナンスページを返すようにする(メンテナンスモード化)
  2. git pull origin main
  3. Dockerコンテナ内でphp artisan migrate --force
  4. ホストの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
bash
- 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のsudoNOPASSWDに設定

adminはパスワードなしでsudoコマンドを実行できるように設定しておきます。

sudo visudo
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
+ admin ALL=NOPASSWD: ALL

https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7

動作確認

Laravelのウェルカムページのtitleを変更し、mainブランチにpushします。

src/resources/views/welcome.blade.php
- <title>Laravel</title>
+ <title>Laravel-test</title>

GitHubページのActionsタブを確認し、ワークフローが成功できていればOKです。
(http://dev-app.sample.comにアクセスしてLaravelのホーム画面のtitleLaravel-testに変わっているか確認してください)

メンテナンス化されているか確認する場合は?

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

スタート


数秒後

メンテナンスモード中


数秒後

メンテナンスモード解除

まとめ

今回はGitHubActionsでデプロイしました!
次回のSSL化対応は作成中のためしばらくお待ちください。

  1. [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
  2. [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
  3. [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する
  4. [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする (←今ここ)
  5. [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定

Discussion