DokkuにLaravelを公開する方法があまり見つからなかったので試行錯誤した内容をメモとして残しておきます。
前回のこちらの記事の続きです。
前回はデータベースを使わないで表示だけの設定を行ったのですが
今回はデータベースの使用やストレージのマウント設定だったり、デプロイタスクの設定に癖があったのでまとめておきます。
目次
サンプル設定
これらをLaravelプロジェクトに設定すればDokkuで公開できます。
https://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-php.git
release: bash .dokku/release.sh
web: vendor/bin/heroku-php-apache2 public
{
"scripts": {
"dokku": {
"predeploy": "bash .dokku/predeploy.sh",
"postdeploy": "bash .dokku/postdeploy.sh"
}
}
}
#!/bin/bash
set -eux
mkdir -p storage/app/public
mkdir -p storage/framework/{cache,sessions,testing,views}
mkdir -p storage/logs
php artisan storage:link
#!/bin/bash
set -eux
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
php artisan migrate --force
#!/bin/bash
set -eux
php artisan db:seed --force
configの設定は以下、必要箇所のみ
% dokku config:show
=====> <アプリ名> env vars
APP_KEY: base64:*********************
APP_URL: https://<公開ドメイン>
ASSET_URL: https://<公開ドメイン>
DATABASE_URL: mysql://mariadb:***********@dokku-mariadb-******:3306/******
~~~~~~~
LOG_CHANNEL: errorlog
% dokku storage:list
/opt/storage/<Dokkuサーバー内のパス>:/app/storage
解説
Dokku/Herokuはgit pushで手軽に公開できるのがメリットなので、.buildpacks
で nodeやphpのビルドパックを指定するだけでnpmでのビルドやcomposerインストールしてくれるので表示するのは簡単です。
データベースのリンク作成やストレージのマウントは事前に実行しておきます。
なお、Dokkuクライアントを導入しておき、Dokkuリポジトリの設定済みプロジェクト配下で実行すればアプリ名の省略が可能なのでアプリ名は記載していません。
% cd <プロジェクトROOT>
% dokku apps:create example-app
# データベース設定
% dokku plugin:install https://github.com/dokku/dokku-mariadb.git mariadb
% dokku mariadb:create example
% dokku mariadb:link example # これで自動でENVにDATABASE_URLが挿入される
# storageマウント
% dokku storage:mount /path/to/dokku-server:/app/storage
# ドメイン指定
% dokku domains:set <公開ドメイン>
# SSL対応
% dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
% dokku letsencrypt:set --global email <連絡が取れるご自分のメールアドレス>
% dokku letsencrypt:cron-job --add
% dokku letsencrypt:enable
# env設定
% php artisan key:generate --show
<シークレットキー>
% dokku config:set APP_KEY=<シークレットキー>
% dokku config:set LOG_CHANNEL=errorlog # storageのマウントをしているので不要かも
% dokku config:set APP_URL=https://<公開ドメイン>
% dokku config:set ASSET_URL=https://<公開ドメイン> # これが無いとviteビルドしたアセットが読み込みできない
DATABASE_URL
はLaravelのORM内部でホスト名やパスワードなどが展開されて使えるようになります。
あとはDokkuのドキュメントにある Deployment Tasks を参考に、app.json
やProcfile.release
の指定によってタスク定義をしてマイグレーションの実行をします。
タスク実行でやっていることは
- storageディレクトリが無ければ作成
- storage/app/public を public/storage としてシムリンク作成
- キャッシュ作成
- マイグレーション実行
- シード挿入
本来は postdeploy
で storage:link の実行をしたかったのですが、実行ログが出ているのに関わらずシムリンクが作成されなかったので、 predeploy
で実行するようにしています。
デプロイ時のキャッシュ作成についてはこちらの記事にまとめていますので参照してください
画像ファイルやviteビルドの結果などをオブジェクトストレージやCDN環境に展開する場合には Procfile: release
で実行するように推奨されているので、適時書き換えて使いこなしてください。
Redisの指定やメール送信などなど、他にも必要になる項目はあるかもしれませんが、一旦はデータベースと画像保存後の表示に対応しています。
終わりに
以上、DokkuにLaravelデプロイする方法でした。
他にもLaravelで使いこなすための方法だったり、アイデアなんかはこちらにまとめています。
workerの実行などはProcfileで指定すればいいみたいなので、この記事では取り扱いませんでした。必要になれば皆さんの方で適時書き換えて使ってみてください。
今回も、お疲れ様でした。
コメントを残す