LaravelアプリをHerokuで簡単デプロイ

はじめに

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.phppgsqlセクションに以下のように変更を加えます:

'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のパイプラインを使用して、継続的インテグレーション/デリバリーを実現できます:

  1. Herokuダッシュボードで、アプリケーションの「Deploy」タブに移動
  2. 「Deployment method」セクションで「GitHub」を選択
  3. GitHubリポジトリを連携
  4. 「Enable Automatic Deploys」を選択

これにより、GitHubのmainブランチに変更がプッシュされるたびに、Herokuが自動的にデプロイを行います。

Heroku Reviewアプリ

プルリクエストごとに自動的にテスト環境をデプロイするHeroku Reviewアプリも設定できます:

  1. Herokuダッシュボードで「New」→「Create new pipeline」を選択
  2. パイプラインを作成し、GitHubリポジトリを連携
  3. 「Enable Review Apps」をクリック
  4. 「Create new review apps for new pull requests automatically」を選択

まとめ

LaravelアプリケーションのHerokuへのデプロイは、いくつかの設定ステップを経ることで、非常にスムーズに行えます。この記事で紹介した手順に従えば、インフラストラクチャの管理に悩まされることなく、アプリケーションの開発と運用に集中できるでしょう。

Herokuの利点は、その簡単さだけでなく、アドオンの豊富さや、スケーリングの容易さにもあります。また、GitHubと連携したCI/CDパイプラインを構築することで、より効率的な開発ワークフローを実現できます。

ぜひこの記事を参考に、あなたのLaravelアプリケーションをHerokuで公開してみてください!

コメント

タイトルとURLをコピーしました