DokkuにLaravelをデプロイする設定

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.jsonProcfile.release の指定によってタスク定義をしてマイグレーションの実行をします。

タスク実行でやっていることは

  • storageディレクトリが無ければ作成
  • storage/app/public を public/storage としてシムリンク作成
  • キャッシュ作成
  • マイグレーション実行
  • シード挿入

本来は postdeploy で storage:link の実行をしたかったのですが、実行ログが出ているのに関わらずシムリンクが作成されなかったので、 predeploy で実行するようにしています。

デプロイ時のキャッシュ作成についてはこちらの記事にまとめていますので参照してください

画像ファイルやviteビルドの結果などをオブジェクトストレージやCDN環境に展開する場合には Procfile: release で実行するように推奨されているので、適時書き換えて使いこなしてください。

Redisの指定やメール送信などなど、他にも必要になる項目はあるかもしれませんが、一旦はデータベースと画像保存後の表示に対応しています。

終わりに

以上、DokkuにLaravelデプロイする方法でした。

他にもLaravelで使いこなすための方法だったり、アイデアなんかはこちらにまとめています。

workerの実行などはProcfileで指定すればいいみたいなので、この記事では取り扱いませんでした。必要になれば皆さんの方で適時書き換えて使ってみてください。

今回も、お疲れ様でした。