git管理のLaravelアプリをmixhostにデプロイして動かす

この記事には広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

ローカルPCで開発したLaravelのWebアプリ。

それをレンタルサーバにアップロードして全世界にあなたのアプリを公開(デプロイ)してみましょう。

この記事ではレンタルサーバにmixhostを使っているので、mixhostでLaravelアプリを公開したい人向けになっています。

他のレンタルサーバでも適宜読み替えていただければLaravelアプリの公開までの流れが参考になるはずです。

前提

  • Laravelのバージョン8、または9
  • ソースコードはgithub
  • レンタルサーバはmixhost
  • ドメインは取得済み

このような前提条件のもと、Webアプリをレンタルサーバで動かすところまでを紹介していきます。

初回アップロード時の手順

mixhostのPHPのバージョンを8に変更

mixhostのPHPの標準バージョンはPHP7です。

Laravel9はPHP8以上をサポートしています(Laravel8はPHP7でもよいが)。

mixhostのPHPのバージョン変更というヘルプページの手順を参考にPHPを8に設定します。

mixhostヘルプより画像引用

mixhostの設定画面ではPHP8は「ea-php80」と記載されているのでそれを選びます。

ea-php80を選択して適用する

Laravelのバージョン毎の対象PHPバージョンはこちらを確認ください。

データベースの作成

開発したLaravelアプリがデータベースを使う場合に実施する手順です。

mixhostのCパネルのMySQL® データベース ウィザードからDB作成をしておきましょう。

データベースを作成する際は、照合順序に注意します。

たとえば、Stripeのライブラリを使う場合は照合順序を「utf8mb4_bin」にしないといけません。

Stripeのライブラリを使っていない場合や照合順序に依存しない実装であれば、そのままでも大丈夫です。

mixhostでターミナル操作する

今後はmixhostのCパネルの「ターミナル」で操作をしていきます。

SSHを使える方はそれで代用しても構いません。

対象ドメインまで移動してgitクローンを実行する

ターミナル上でLaravelアプリを公開するドメインまで移動して、gitコマンドでgit管理しているソースコードをmixhost上にクローン(ダウンロード)します。

cd public_html/ドメイン名/
git clone https://github.com/{ユーザ名}/{リポジトリ名.git}
ターミナルで実行した時の画像
開発中はサービス名が未定でコードネームでgit管理しても大丈夫です。

gitクローンを実行したフォルダにgitのリポジトリ名のフォルダができます。公開時はドメインへのアクセスをリポジトリ名/publicへリダイレクトするのでドメインがサービス名として一般公開されます。gitのリポジトリ名(プロジェクトフォルダ名)は公開されませんので開発中のコードネームのままでもよいです。

gitクローンのコマンドを打つとgitアカウント名と公開KEY(アクセストークン)の入力を求められるのでターミナルに入力します。

gitのアクセストークンはGitHubの公式ヘルプの個人アクセストークンを使用するを確認してください。

envファイルの作成

gitにpushしたLaravelのプロジェクトでは.gitignoreファイル関係上.envはプロジェクト上に存在しない。

そのため、cpコマンドでenv.exampleから複製して本番環境に適した値に編集しましょう。

cd クローンしたリポジトリ名のフォルダ
cp .env.example .env
envファイル編集時の注意

改行コードはLFなので注意しましょう。

composerの実行

composer でいろいろインストールをする

ea-php80 /opt/cpanel/composer/bin/composer install

APPのKEYを生成する

APPのKEYを生成してenvに追記するコマンドを実行。

コマンドを再実施してKEYを変更してはいけない。Hashとか復号できなくなる。

ea-php80 artisan key:generate

マイグレーション作成してテーブル作成

データベースを利用するLaravelアプリの場合は、テーブルをマイグレーションで作成します。

php artisan migrate

もしも、本番環境で初期データ用のシードを実行するなら

php artisan db:seed

作成済みの表を削除してマイグレーションを再実行する。そしてシードを実行する場合は以下のコマンド。

php artisan migrate:fresh --seed

.htaccessを編集してリライト設定する

初期状態のままだと、Webアプリにアクセスするためには

「https://ドメイン名/gitクローンしたリポジトリ名/public」となってしまいます。

これをドメイン名でアクセス可能とするためにリライトの設定をします。リダイレクト設定ではありません。

.htaccess
#laravelのpublicへ「リライト」させる。リライトであればリダイレクトと違ってブラウザのURLは変更されない。
#QSAオプションでGETパラメータを消さない

RewriteRule ^(.*)$ gitクローンしたリポジトリ名/public/$1 [QSA,L]
リダイレクト設定ではなくリライトの理由

リダイレクト設定だと、ブラウザのURLが書き換わります。

「https://ドメイン名/リポジトリ名/public」になってしまう。

「https://ドメイン名/」のままでpublicフォルダにアクセスしてほしいので、リライトの設定にします。

シンボリックリンクの生成

開発したLaravelのWebアプリが画像ファイルなどをWeb公開用のストレージを使っている場合は

storage/app/publicへのシンボリックリンクを作成する必要があります。

プログラムでassetヘルパを使って公開ディスクからファイルを取得している場合は必須です。

php artisan storage:link

Cronジョブを追加する

開発したLaravelのWebアプリがCronで定期実行する機能があるならば、mixhostのサーバにCronジョブを追加します。

mixhostにCronジョブを追加するにはCパネルから追加できます。

LaravelでCron実行のジョブを作った場合は基本的にはコマンドとして作成しているはずです。

そしてそのコマンド群をスケジュール登録してあるはずなのでLaravelのスケジューラを実行するCronを1つだけ定義するだけで済みます。つまりLaravelのスケジューラを使用する場合、mixhostのサーバで1分ごとにschedule:runコマンドを実行する単一のcron設定エントリを追加するだけで済みます。作成したコマンドごとにCronをMixhostに定義する必要はありません。

CパネルのCronジョブ画面からLaravelの「schedule:runコマンド」を1分ごとに実行するCronを定義しましょう。

ではその時のmixhostでのコマンドの指定方法です。cdコマンドでLaravelアプリのカレントディレクトリまで移動後、php artisanコマンドでスケジュールを起動します。

cd /home/mixhostのユーザ名/public_html/ドメイン名/リポジトリ名 && php artisan schedule:run >> /dev/null 2>&1

/dev/null 2>&1とは

/dev/null 2>&1はコマンド実行を標準出力させない設定であり、これを指定しないと1分おきにCronを実行したというメールがmixhostから自分に送信されちゃう。1分おきに死活監視したい場合以外は記述した方がよいパラメータです。

php artisanのコマンドについて

PHPの指定は”ea-php80”ではなく通常の”php”だけでよい。

良い:php artisan schedule:run

ダメ:ea-php80 artisan schedule:run

初回以降にgit管理のソース変更を取り込む手順

ここからは、初回の手順が完了した後の話です。

たとえば、Git管理のソースに修正を加えたので本番環境(mixhost)のWebアプリにその変更を反映する場合です。

リポジトリフォルダまで移動

mixhostのCパネルの「ターミナル」を起動します。

そして「.git」があるフォルダまで移動(composer.jsonがあるフォルダ)

cd  public_html/ドメイン名/gitリポジトリ名

gitコマンドでpullして最新ソースを取得する

git pull origin main

DB変更があればマイグレーション

もしソース修正時にDB変更もしていればマイグレーションでテーブル変更をします。

php artisan migrate

まとめ

この手順で私は基本的なLaravelアプリならばmixhostで公開(デプロイ)できました。

もしStripeを使ったLaravelアプリの場合はWebhookの設定が追加で必要になります

それは別記事で記載することにしますね。