laravelサイトをgithubを使ってmixhostにデプロイする方法

laravel-sailを使ってローカル環境で作成したlaravelプログラムをmixhostで使うための方法です。最初はFTPでアップロードしていたのですが時間がかかるため、github経由に変更しました。

前提条件

Windows環境でWSLとVS codeを使ってlaravel-sailで構築した環境を用います(環境準備はこちらを参照)

VS codeのリモート-WSLを使って操作するため、リモート-WSLからgithubへpushできるようにWSL上でキーペアを作成し、githubに公開鍵を登録する必要があります。

mixhost→github SSH通信用鍵登録

mixhost上でSSH用の鍵を作成する必要がありますが、SSHアクセス→新しいキーの生成ではパスワードなしのキーを作成することができません。github actionで自動デプロイする場合、パスワードなしで作成する必要がああるため、コマンドで作成します。

cPanel上のTerminalからログインしてコマンドで作成します。この時、デフォルトの名前だと既存で「id_rsa」があると上書きされてしまうので必要に応じて名前を変更します(例えば、「github」とします)

続いて、github側で公開鍵を登録します。

右側メニューのsetting→SSH and GPG keys→New SSH keyで、先ほどmixhostで作成した公開鍵の「表示/ダウンロード」で出た内容を「key」貼り付けます。また、Titleには先ほどキー名を入力します。

https://scratchpad.jp/mixhost-rental-server-3/

これで、mixhostのTerminalからgit clone、git pullできるようになります。

mixhostでgit clone、git pull

mixhostのcPanelのTerminalか、mixhost自体にSSH接続したうえでgithubからlaravelプロジェクトを持ってきます。laravelのpublicフォルダだけを外部から公開できるように、mixhostの公開ディレクトリであるpublic_htmlからシンボリックリンクを張るようにします。

構成としては、「/home/ユーザー名/public_html/●●●/」●●●は公開用のドメイン名等にアクセスすると、非公開領域の「/home/ユーザー名/laravel/▲▲▲/public」を開くようにします。

まずはmixhostにSSH接続し、/home/ユーザー名/にlaravelフォルダを作成し、githubにある▲▲▲をcloneします。

cd /home/ユーザー名/
mkdir laravel
GIT_SSH_COMMAND='ssh -i ~/.ssh/github' git clone git@github.com:<user-name>/▲▲▲.git ▲▲▲

sshのキー名を「github」に変更したため、GIT_SSH_COMMANDで明示する必要があります。その後、composerを使ってインストールする必要がありますが、phpのバージョンの関係でそのまま使うとエラーになったので「ea-php80」を使ってバージョン指定して実施します。

ea-php80 /opt/cpanel/composer/bin/composer install
cp .env.example .env
ea-php80 artisan key:generate
ln -s /home/ユーザー名/laravel/▲▲▲/public /home/ユーザー名/public_html/ドメイン名

その後、.envファイルを.env.exampleよりコピーして作成します(必要に応じて環境変数等を追記)。

ローカル設定のままですとエラー時にデバッグ情報が出てしまうため、下記を修正。

APP_ENV=production
APP_DEBUG=false
APP_URL=***

また、キー生成します。

mixhost上でDBを作成し、DBユーザーを作成し、DBにユーザーを登録します。.env上で登録したDBに合わせて下記のように修正。

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=<ユーザー名>_▲▲▲
DB_USERNAME=<ユーザー名>_▲▲▲
DB_PASSWORD=<mixhost上で設定したパスワード>

DB作成と設定が終わったらマイグレーションを実施します。

ea-php80 artisan migrate

最後に公開領域から、laravelの実態がある非公開領域にシンボリックリンクを作成します。

このときサブドメイン等を既に作っていてドメイン名のディレクトリが既に存在していると、ドメイン名ディレクトリ直下に「public」のシンボリックリンクが作成され、想定している構成にならないため、ドメイン名のディレクトリを削除したうえでシンボリックリンク作成が必要です。

この状態で、ブラウザで対象ドメインを入力すると表示されるはずです。

mixhostでcronを設定して定期処理を行う

cPanel → 詳細 → Cronジョブで分から平日まで「*」を入力し、コマンドは下記の通り artisan schedule:runを設定します。

cd /home/<ユーザー名>/laravel/<アプリフォルダ>/ && /opt/cpanel/ea-php80/root/usr/bin/php artisan schedule:run >> /dev/null 2>&1	

githubからpullして更新

更新する場合は、VS codeでgithubにpushした後に、mixhost上でgit pullをします。これで、mixhost上からgithubを使ってpullして更新させることができました。

GIT_SSH_COMMAND='ssh -i ~/.ssh/github' git pull git@github.com:<user-name>/▲▲▲.git ▲▲▲

VITEの場合

.gitignore で/public/buildを # を先頭につけてコメントアウト。

sail npm run build

アセットをビルドしてgithubにpush!

github actionで自動デプロイする

前準備として、github上でmixhostで作成した秘密鍵や、ログイン情報を登録します。

Security->Secrets->Actionsの中で「New repository secret」をクリックし、「SSH_PRIVATE_KEY」というタイトルで、mixhostで生成した秘密キーの内容を貼り付けます。

mixhost cPanel SSHアクセス

また、同期先のサーバーのURLを「SSH_TARGET」というタイトルで、下記の内容を登録します。

<mixhostユーザー名>@<mixhostドメイン>:/home/<mixhostユーザー名>/laravel/▲▲▲/

あとは、実際にデプロイするときの動作をyml形式で作成し、「/.github/workflows」に保存し、githubにpushすればokです。今回はga.ymlという名前で作成します。

name: deploy to remote

on:
  push:
    branches: [ master ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: ssh key generate
        run: echo "$SSH_PRIVATE_KEY" > key && chmod 600 key
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      - name: rsync deploy
        run: rsync -auzrv -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" ./ $SSH_TARGET --exclude .htaccess --exclude storage/ --exclude .env
        env:
          SSH_TARGET: ${{ secrets.SSH_TARGET }}

単純に同期をとるために「rsync」コマンドを使っています。SSH接続のために、先ほど登録した秘密キーを「SSH_PRIVATE_KEY」というタイトルから引っ張ってきて鍵を作成してSSH接続を行って同期します。

また、以降、githubのmainブランチにpushされるたびにmixhostに同期されます。動作状況については下記から確認できます。