Logicky Blog

Logickyの開発ブログです

Laravel Forgeを使ってデプロイしてみる

Laravel Forgeが便利そうなので、試してみたいと思います。ローカル環境は、Windows11でターミナルはPowerShellです。Laravel HerdのPROに課金をしてみましたので、これを使ってローカル開発環境を作っています。

Laravel Herdでプロジェクトを新規作成

まずは下記を作成しました。

DB設定

上記作成時点では、.envのDB設定はSQLiteでした。今回はPostgreSQLを使いますので、データベースの作成は手動で行う必要があります。

データベース作成

userは postgres で、パスワードはなしで、ホストは localhost:5432 で接続できます。 接続して、hogeというデータベースを作成しました。

.envのDB設定をpostgresにして、migrateを実行します。

DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=hoge
DB_USERNAME=postgres
DB_PASSWORD=
> php artisan migrate

この状態でユーザ登録をしたら成功しましたが、ダッシュボード表示の際に下記エラーが発生しました。

Unhandled match case '60'

これと同じっぽいです。新しいJetstreamのちょっとした不具合かもですね。

github.com

下記のようにしたらエラーが消えました。

resources/views/components/dropdown.blade.php

$width = match ($width) {
    '48' => 'w-48',
    '60' => 'w-60',
    '80' => 'w-80',
    '100' => 'w-100',
    default => 'w-48',
};

Forgeを使ってデプロイしてみる

早速ですがデプロイしてみましょう。DigitalOceanを使います。Forgeの"Create Server"で、下記のような内容で作成します。

作成できたら、サイトの設定で、下記のようにリポジトリとブランチを設定してインストールボタンを押してみます。

やたら早くインストールが終わりましたが、Public IPにアクセスすると、もう画面が表示されました。 しかし、ログイン画面等は500エラーが出るので、設定が全然足りないようです。 いやー今Foregeのサイトの管理画面を見てますけど、テンションが上がりますね。

サーバの中を確認してみる

DigitalOceanのターミナルで確認したところ、/home/forge/default 内にLaravelアプリが入っていました。.envも自動生成されて基本的にはサーバ環境に合わせて調整してくれています。 ただ、node_modulesはないようですね。あと、 public/buildもないですね。500エラーはログに下記がありましたので、npm installして、npm run buildをすればいけそうです。これらは手動でビルドスクリプトに設定する必要があるのかなと思いました。

Vite manifest not found at: /home/forge/default/public/build/manifest.json

デプロイスクリプトを修正してみる

これがデプロイ時のスクリプトのようで、最後にnpm install && npm run buildを追加してみました。

cd /home/forge/default
git pull origin $FORGE_SITE_BRANCH

$FORGE_COMPOSER install --no-dev --no-interaction --prefer-dist --optimize-autoloader

( flock -w 10 9 || exit 1
    echo 'Restarting FPM...'; sudo -S service $FORGE_PHP_FPM reload ) 9>/tmp/fpmlock

if [ -f artisan ]; then
    $FORGE_PHP artisan migrate --force
fi

npm install
npm run build

デプロイの処理が非常にシンプルだから、というのが大きいのかなとは思いますが、デプロイが超早いですね。。 これでエラーがでなくなりました。

メール送信機能を設定する

私はBackformというヘッドレスフォームサービスを作るときは、Amazon SESを使いました。大量送信の可能性を考慮すると、Amazon SESがかなり安いと思ったからです。 しかし大半の業務システムなどは、大量送信はあまり考える必要はありませんので、何でもよいと思います。 お客様ではAWSは全然使ってないよ!という方も多いですので、そういう場合は、Mailgun等の方が設定しやすいかもしれません。

それにしても、ちょっとしたメール送信の場合、上記どれもがややめんどうなのですが、何か良い方法はないのですかね?? 例えばドメインさえも登録不要な場合って、APIキーだけで送信出来たりしないのですかね??

Larael11のドキュメントに、Postmarkというのがあって、これはドメインの登録・認証とかが不要だそうです。これはよさそうかもと思いました。

Postmarkのtokenを取得する

Postmarkでアカウントを登録し、ログインします

postmarkapp.com

サーバを選択する

"API Tokens"をクリックする

Tokenをクリップボードにコピーする

以上で、一応メール送信ができるようになります。 実際には、Postmarkでアカウントの承認を終わらせないと、FROMアドレスと同じドメイン宛にしか送信できないという制約があるようです。 今回はテストなので、このまま進めます。

Postmarkを使えるようにする

composerでライブラリを追加します。

composer require symfony/postmark-mailer symfony/http-client

.envに下記を設定します。 POSTMARK_TOKEN は上記でクリップボードにコピーしたトークンです。 FROM_ADDRESSは、実際のメールアドレスに変更します。 上記のとおり、Postmarkのアカウント承認がまだの場合は、FROMとTOで同じドメインである必要がありますので、送りたいメールアドレスに合わせてFROMのアドレスも設定する必要があります。

MAIL_MAILER=postmark
MAIL_FROM_ADDRESS="hello@example.com"
POSTMARK_TOKEN=11111111-1111-1111-1111-111111111111

メールを送信してみる

送信成功しました!しかし、まあ迷惑メールフォルダに入りますし、警告は出るしで、あくまでテスト用ですね。(当然ですが、Postmarkでアカウント承認をして、ドメインの認証をすれば、回避できるはずです。)

でもこれは超楽でよいですね。今度ドメインの認証もやってみます。