はじめに
Laravelは、エレガントな構文と豊富な機能を持つPHPフレームワークとして、多くの開発者に愛用されています。一方、Herokuは、アプリケーションを簡単にデプロイ・管理できるクラウドプラットフォームとして知られています。この記事では、LaravelアプリケーションをHerokuにデプロイする方法を、初心者にもわかりやすく解説します。
Herokuの特徴は、Git連携による簡単なデプロイフロー、スケーラビリティ、そして豊富なアドオンです。特に開発段階やスモールスタートアップにとって、インフラ管理の負担を減らしながら、高品質なアプリケーション運用が可能となります。
前提条件
- PHP 7.3以上
- Composerがインストールされていること
- Gitがインストールされていること
- Herokuアカウント(無料で作成可能)
- Heroku CLIがインストールされていること
ステップ1: Heroku CLIのインストール
まず、Heroku CLIをインストールします。これにより、コマンドラインからHerokuの機能を利用できるようになります。
macOS (Homebrew使用):
brew tap heroku/brew && brew install heroku
Windows: Heroku CLI インストーラーをダウンロードして実行
Linux (Ubuntu/Debian):
curl https://cli-assets.heroku.com/install-ubuntu.sh | sh
インストール後、以下のコマンドでログインします:
heroku login
ステップ2: Laravelプロジェクトの準備
既存のLaravelプロジェクトがある場合は、そのまま使用できます。新しくプロジェクトを作成する場合は、以下のコマンドを実行します:
composer create-project --prefer-dist laravel/laravel my-laravel-app
cd my-laravel-app
ステップ3: Gitリポジトリの初期化
Herokuはデプロイにgitを使用するため、プロジェクトをgitリポジトリとして初期化します。すでにgitリポジトリになっている場合は、このステップをスキップできます。
git init
git add .
git commit -m "Initial commit"
ステップ4: Herokuアプリケーションの作成
Heroku上に新しいアプリケーションを作成します:
heroku create my-laravel-app
my-laravel-app
は任意のアプリケーション名に置き換えてください。この名前はHeroku上でのアプリケーションのサブドメインになります(例:my-laravel-app.herokuapp.com)。
ステップ5: Procfileの作成
Herokuに、アプリケーションの起動方法を指示するために、Procfile
というファイルを作成します。プロジェクトのルートディレクトリに以下の内容でProcfile
(拡張子なし)を作成します:
web: vendor/bin/heroku-php-apache2 public/
これは、Apacheウェブサーバーを使用して、public
ディレクトリをドキュメントルートとして設定するよう指示しています。
ステップ6: データベースの設定
Herokuでは、PostgreSQLデータベースが推奨されています。以下のコマンドで、Herokuに無料のPostgreSQLデータベースをアタッチします:
heroku addons:create heroku-postgresql:hobby-dev
次に、Laravelアプリケーションがデータベース接続情報を正しく取得できるように、config/database.php
ファイルを修正します。
config/database.php
のpgsql
セクションに以下のように変更を加えます:
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => isset($heroku_db_url['host']) ? $heroku_db_url['host'] : env('DB_HOST', '127.0.0.1'),
'port' => isset($heroku_db_url['port']) ? $heroku_db_url['port'] : env('DB_PORT', '5432'),
'database' => isset($heroku_db_url['path']) ? ltrim($heroku_db_url['path'], '/') : env('DB_DATABASE', 'forge'),
'username' => isset($heroku_db_url['user']) ? $heroku_db_url['user'] : env('DB_USERNAME', 'forge'),
'password' => isset($heroku_db_url['pass']) ? $heroku_db_url['pass'] : env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
ファイルの先頭で、$heroku_db_url
変数を定義します:
$heroku_db_url = parse_url(env('DATABASE_URL', "postgres://forge:forge@localhost:5432/forge"));
ステップ7: 必要な環境変数の設定
Laravelアプリケーションに必要な環境変数をHerokuに設定します:
heroku config:set APP_NAME="My Laravel App"
heroku config:set APP_ENV=production
heroku config:set APP_KEY=$(php artisan key:generate --show)
heroku config:set APP_DEBUG=false
heroku config:set LOG_CHANNEL=errorlog
アプリケーションに必要なその他の環境変数も同様に設定してください。
ステップ8: HTTPS強制設定
本番環境ではHTTPSを強制することをお勧めします。app/Providers/AppServiceProvider.php
ファイルを開き、boot
メソッドに以下のコードを追加します:
public function boot()
{
if (config('app.env') === 'production') {
\URL::forceScheme('https');
}
}
ステップ9: Herokuへのデプロイ
すべての準備が整ったら、以下のコマンドでHerokuにアプリケーションをデプロイします:
git add .
git commit -m "Heroku deployment configuration"
git push heroku main
GitHubなどの他のリモートリポジトリを使用している場合は、以下のように特定のブランチをHerokuにプッシュします:
git push heroku your-branch:main
ステップ10: データベースのマイグレーション
デプロイ後、Heroku上でデータベースマイグレーションを実行します:
heroku run php artisan migrate
確認を求められた場合は、yes
と入力します。
必要に応じて、シーディングも実行できます:
heroku run php artisan db:seed
ステップ11: アプリケーションの確認
以下のコマンドで、デプロイしたアプリケーションをブラウザで開けます:
heroku open
または、https://your-app-name.herokuapp.com
にアクセスします。
トラブルシューティング
ログの確認
問題が発生した場合は、ログを確認します:
heroku logs --tail
これにより、リアルタイムでログを追跡できます。
Composer依存関係の問題
依存関係の問題が発生した場合は、以下のコマンドを実行してみてください:
heroku config:set COMPOSER_PROCESS_TIMEOUT=500
git commit --allow-empty -m "Trigger Heroku rebuild"
git push heroku main
メモリ不足エラー
Composerが実行中にメモリ不足エラーが発生する場合:
heroku config:set COMPOSER_MEMORY_LIMIT=-1
Herokuでのメンテナンスと運用
スケーリング
アプリケーションのトラフィックが増加した場合、以下のコマンドでサーバー(Dyno)をスケールアップできます:
# Dynoを標準の1×サイズに変更
heroku ps:resize web=standard-1x
# Dynoの数を増やす
heroku ps:scale web=2
※有料プランが必要です。
スケジューラの設定
定期的なタスク実行には、Heroku Schedulerアドオンを使用できます:
heroku addons:create scheduler:standard
heroku addons:open scheduler
ウェブインターフェースが開くので、そこでLaravelのスケジュールコマンドを追加します:
php artisan schedule:run
データベースバックアップ
定期的なデータベースバックアップを設定することをお勧めします:
heroku pg:backups:schedule DATABASE_URL --at '02:00 Asia/Tokyo'
これにより、毎日日本時間の午前2時にバックアップが作成されます。
Redis設定(セッション/キャッシュ用)
セッションやキャッシュにRedisを使用する場合は、Heroku Redisアドオンを追加します:
heroku addons:create heroku-redis:hobby-dev
.env
ファイルに以下の設定が自動的に追加されます(Herokuの環境変数として):
REDIS_URL=redis://...
config/database.php
のRedis設定を以下のように更新します:
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
Herokuの無料プランからのマイグレーション
Herokuは2022年11月に無料プランを廃止しましたが、代替として「Eco」という低コストプランを提供しています。このプランは、料金が低く抑えられていますが、非アクティブ時間後に自動的にスリープします。
プランの変更は以下のコマンドで行えます:
heroku dyno:type eco
または、他のクラウドプラットフォームへの移行を検討することもできます。
アドバンストテクニック
カスタムビルドパック
特別な要件がある場合、カスタムビルドパックを使用できます:
heroku buildpacks:set heroku/php
heroku buildpacks:add heroku/nodejs --index 1
これにより、Node.jsとPHPの両方のビルドパックが追加され、フロントエンド資産のコンパイルが可能になります。
Heroku CI/CD
GitHub連携を設定し、Herokuのパイプラインを使用して、継続的インテグレーション/デリバリーを実現できます:
- Herokuダッシュボードで、アプリケーションの「Deploy」タブに移動
- 「Deployment method」セクションで「GitHub」を選択
- GitHubリポジトリを連携
- 「Enable Automatic Deploys」を選択
これにより、GitHubのmainブランチに変更がプッシュされるたびに、Herokuが自動的にデプロイを行います。
Heroku Reviewアプリ
プルリクエストごとに自動的にテスト環境をデプロイするHeroku Reviewアプリも設定できます:
- Herokuダッシュボードで「New」→「Create new pipeline」を選択
- パイプラインを作成し、GitHubリポジトリを連携
- 「Enable Review Apps」をクリック
- 「Create new review apps for new pull requests automatically」を選択
まとめ
LaravelアプリケーションのHerokuへのデプロイは、いくつかの設定ステップを経ることで、非常にスムーズに行えます。この記事で紹介した手順に従えば、インフラストラクチャの管理に悩まされることなく、アプリケーションの開発と運用に集中できるでしょう。
Herokuの利点は、その簡単さだけでなく、アドオンの豊富さや、スケーリングの容易さにもあります。また、GitHubと連携したCI/CDパイプラインを構築することで、より効率的な開発ワークフローを実現できます。
ぜひこの記事を参考に、あなたのLaravelアプリケーションをHerokuで公開してみてください!
コメント