Symfonyアプリのデプロイ
このステップバイステップガイドで、RailwayにSymfonyアプリをデプロイする方法を学びます。クイックセットアップ、データベース統合、cronとワーカー、ワンクリックデプロイ、その他のデプロイ戦略について説明します。
著者: AIイノベーションズ 阿部隼也(X / Twitter)Symfonyアプリのデプロイ
Symfonyは、調和して動作する分離された再利用可能なコンポーネントのセットで構成されるPHP Webフレームワークであり、WebサイトやWebアプリケーションを作成します。
このガイドでは、3つの方法でRailwayにSymfonyアプリをデプロイする方法について説明します。
それでは、Symfonyアプリを作成しましょう!
Symfonyアプリの作成
注: SymfonyアプリがローカルまたはGitHubに既にある場合は、この手順をスキップして、SymfonyアプリをRailwayにデプロイに直接進むことができます。
新しいSymfonyアプリを作成するには、お使いのマシンにComposer、PHP、Symfonyがインストールされていることを確認してください。
ターミナルで次のコマンドを実行して、新しいSymfonyアプリを作成します。
symfony new --webapp apphelloworld
apphelloworld
ディレクトリに新しいSymfonyアプリがプロビジョニングされます。
Symfonyアプリをローカルで実行
アプリを起動するには、次を実行します。
symfony server:start
アプリが実行されたら、ブラウザを開き、http://localhost:8000
にアクセスして動作を確認します。
SymfonyアプリをRailwayにデプロイする
Railwayは、セットアップと好みに応じて、Symfonyアプリをデプロイする複数の方法を提供します。
テンプレートからのワンクリックデプロイ
このテンプレートは、スターターSymfonyアプリケーションとPostgresデータベースをRailwayにセットアップします。また、コミュニティによって作成されたさまざまなSymfonyアプリテンプレートから選択することもできます。
デプロイ後はテンプレートから Eject して、GitHub アカウントにリポジトリのコピーを作成することを強くおすすめします。
CLIからデプロイ
Symfonyアプリがローカルにある場合は、次の手順に従います。
- Railway CLIのインストール:
- CLIをインストールし、Railwayアカウントで認証します。
- Railwayプロジェクトの初期化:
- Symfonyアプリディレクトリで以下のコマンドを実行します。
railway init
- プロンプトに従ってプロジェクトに名前を付けます。
- プロジェクトが作成されたら、提供されたリンクをクリックしてブラウザで表示します。
- Symfonyアプリディレクトリで以下のコマンドを実行します。
- Postgresデータベースサービスの追加:
railway add -d postgres
を実行します。- Enter を押してプロジェクトに追加します。
- データベースサービスがRailwayプロジェクトに追加されます。
- サービスと環境変数の追加:
railway add
を実行します。- オプションのリストから
Empty Service
を選択します。 Enter a service name
プロンプトでapp-service
と入力します。Enter a variable
プロンプトでDATABASE_URL=${{Postgres.DATABASE_URL}}
と入力します。- 値
${{Postgres.DATABASE_URL}}
は、新しいPostgresデータベースのURLを参照します。サービス変数の参照について詳しくはこちら。
- 値
- 他の環境変数を設定します。
APP_ENV=prod
- この設定は、アプリが本番環境で実行されていることをSymfonyに通知し、パフォーマンスを最適化します。APP_SECRET=secret
ここで、secretは生成されたアプリのシークレットです。COMPOSER_ALLOW_SUPERUSER="1"
- Symfonyがインストール中に必要とするプラグインを有効にするために、Composerがrootとして実行できるようにするために必要です。NIXPACKS_PHP_ROOT_DIR="/app/public"
- Nginx構成がアプリを提供するための正しいルートディレクトリパスを指すようにします。注: さまざまなオプションについては、Railway CLIリファレンスを参照してください。
- アプリケーションのデプロイ:
railway up
を実行してアプリをデプロイします。- このコマンドは、アプリのファイルをスキャン、圧縮し、Railwayにアップロードします。ターミナルにはリアルタイムのデプロイログが表示されます。
- デプロイが完了したら、アプリサービスのドメインを生成に進むことができます。
- 公開URLの設定:
railway domain
を実行して、アプリの公開URLを生成します。- 新しいURLにアクセスして、アプリがライブで動作していることを確認してください!
GitHubリポジトリからデプロイ
SymfonyアプリをGitHubから直接Railwayにデプロイするには、以下の手順に従ってください。
- Railwayで新しいプロジェクトを作成:
- Railwayにアクセスして、新しいプロジェクトを作成します。
- GitHubからデプロイ:
- Deploy from GitHub repo を選択し、リポジトリを選択します。
- RailwayアカウントがまだGitHubにリンクされていない場合は、リンクするように求められます。
- Deploy from GitHub repo を選択し、リポジトリを選択します。
- 環境変数の追加とデータベースサービスのプロビジョニング:
- Add Variables をクリックしますが、まだ何も追加しないでください。まず、次の手順に進んでください。
- Railwayプロジェクトキャンバスを右クリックするか、Create ボタンをクリックし、Database を選択して Add PostgreSQL を選択します。
- これにより、プロジェクト用に新しいPostgreSQLデータベースが作成され、デプロイされます。
- データベースがデプロイされたら、必要な環境変数を追加に戻ることができます。
DATABASE_URL
:値を${{Postgres.DATABASE_URL}}
に設定します(これは新しいPostgresデータベースのURLを参照します)。サービス変数の参照について詳しくはこちら。APP_ENV=prod
- この設定は、アプリが本番環境で実行されていることをSymfonyに通知し、パフォーマンスを最適化します。APP_SECRET=secret
ここで、secretは生成されたアプリのシークレットです。COMPOSER_ALLOW_SUPERUSER="1"
- Symfonyがインストール中に必要とするプラグインを有効にするために、Composerがrootとして実行できるようにするために必要です。NIXPACKS_PHP_ROOT_DIR="/app/public"
- Nginx構成がアプリを提供するための正しいルートディレクトリパスを指すようにします。
- アプリサービスのデプロイ:
- Railwayプロジェクトキャンバスで Deploy をクリックして、変更を適用します。
- デプロイの確認:
- デプロイが完了したら、View logs に移動して、サーバーが正常に実行されていることを確認します。 注: デプロイプロセス中に、RailwayはNixpacksを介してPHPアプリであることを自動的に検出します。
- 公開URLの設定:
- 新しいサービスの「設定」タブのNetworkingセクションに移動します。
- 「Generate Domain」をクリックして、アプリの公開URLを作成します。
注: 次のステップでは、Symfonyアプリをデータベース、マイグレーション、cronジョブ、ワーカーとともに実行する方法を示します。
データベース、マイグレーション、Cron、ワーカーのセットアップ
このセットアップでは、SymfonyアプリをRailwayにデプロイし、データベース、スケジュールされたタスク(cron)、およびキュワーカがすべて完全に機能することを確認します。
デプロイ構造は「雄大なモノリス」アーキテクチャに従い、Symfonyアプリ全体が単一のコードベースとして管理されますが、Railwayでは4つの別々のサービスに分割されます。
- アプリサービス:HTTPリクエストとユーザーインタラクションを処理します。
- Cronサービス:スケジュールされたタスク(メール送信やレポート実行など)を管理します。
- ワーカーサービス:キューからバックグラウンドジョブを処理します。
- データベースサービス:アプリケーションのデータを保存および取得します。
私の雄大なモノリスSymfonyアプリ
開始するには、次の手順に従ってください。
- Symfonyアプリのルートディレクトリに、
run-app.sh
、run-worker.sh
、run-cron.sh
の3つのBashスクリプトを作成します。 これらのスクリプトには、Symfonyアプリのアプリ、ワーカー、およびcronサービスをRailwayにデプロイして実行するために必要なコマンドが含まれます。run-app.sh
ファイルに以下の内容を追加します。 注: これは、ビルドフェーズが完了した後にアプリサービスを開始するために必要です。このスクリプトは、マイグレーションを実行し、Nginxサーバーを起動します。#!/bin/bash # このファイルに実行権限があることを確認してください。`chmod +x run-app.sh` を実行します。 # マイグレーションを実行し、Nginx構成テンプレートを処理してNginxを起動します php bin/console doctrine:migrations:migrate --no-interaction && node /assets/scripts/prestart.mjs /assets/nginx.template.conf /nginx.conf && (php-fpm -y /assets/php-fpm.conf & nginx -c /nginx.conf)
run-worker.sh
ファイルに以下の内容を追加します。このスクリプトはキューワーカーを実行します。#!/bin/bash # このファイルに実行権限があることを確認してください。`chmod +x run-worker.sh` を実行します。 # このコマンドはキューワーカーを実行します。 php bin/console messenger:consume async --time-limit=3600 --memory-limit=128M &
- Symfonyにはネイティブにスケジューラが含まれていません。そのため、CronBundleをインストールして、スケジュールされたタスクを定義および実行してください。それが設定されたら、
run-cron.sh
ファイルに以下の内容を追加します。#!/bin/bash # このファイルに実行権限があることを確認してください。`chmod +x run-cron.sh` を実行します。 # このコードブロックは、スケジューラを1分ごとに実行します while [ true ] do echo "Running the scheduler..." php bin/console cron:start [--blocking] --no-interaction & sleep 60 done
- プロジェクトキャンバスにPostgresデータベースサービスを作成します。
- Deploy をクリックします。
- プロジェクトキャンバスに新しいサービスを作成します。
- サービスに App Service という名前を付け、Settings をクリックして構成します。
- Source セクションでGitHubリポジトリを Source Repo に接続します。
- Deploy セクションの Custom Start Command に
chmod +x ./run-app.sh && sh ./run-app.sh
を追加します。 - サービスの上部に戻り、Variables をクリックします。
- Symfonyアプリに必要なすべての環境変数、特に以下にリストされているものを追加します。
APP_ENV=prod
APP_SECRET=secret
ここで、secretは生成されたアプリのシークレットです。COMPOSER_ALLOW_SUPERUSER="1"
- Symfonyがインストール中に必要とするプラグインを有効にするために、Composerがrootとして実行できるようにするために必要です。NIXPACKS_PHP_ROOT_DIR="/app/public"
- Nginx構成がアプリを提供するための正しいルートディレクトリパスを指すようにします。DATABASE_URL=${{Postgres.DATABASE_URL}}
(これはPostgresデータベースのURLを参照します)。
- Deploy をクリックします。
- プロジェクトキャンバスに新しいサービスを作成します。
- サービスに Cron Service という名前を付け、Settings をクリックします。
- Source セクションでGitHubリポジトリを Source Repo に接続します。
- Deploy セクションの Custom Start Command に
chmod +x ./run-cron.sh && sh ./run-cron.sh
を追加します。 - サービスの上部に戻り、Variables をクリックします。
- ステップ3で既に強調表示されているすべての必要な環境変数を追加します。
- Deploy をクリックします。
- プロジェクトキャンバスに再度新しいサービスを作成します。
- サービスに Worker Service という名前を付け、Settings をクリックします。
- Source セクションでGitHubリポジトリを Source Repo に接続します。
- Deploy セクションの Custom Start Command に
chmod +x ./run-worker.sh && sh ./run-worker.sh
を追加します。 - サービスの上部に戻り、Variables をクリックします。
- ステップ3で既に強調表示されているすべての必要な環境変数を追加します。
- Deploy をクリックします。
この時点で、3つのサービスすべてがデプロイされ、Postgresデータベースサービスに接続されているはずです。
- Cronサービス:このサービスは、スケジュールされたタスクを管理するためにcronバンドラスケジューラを実行する必要があります。
- ワーカーサービス:このサービスは実行中であり、キューからジョブを処理する準備ができている必要があります。
- アプリサービス:このサービスは実行中であり、ユーザーがアプリケーションにアクセスできるように公開ドメインを持つ必要がある唯一のサービスです。
アプリサービス
注: このデプロイアプローチを示すコミュニティテンプレートが利用可能です。このテンプレートを簡単にデプロイし、アプリケーション用に独自のGitHubリポジトリに接続できます。
次のステップ
Railwayでのエクスペリエンスを最大限に活用するために、これらのリソースを調べてください。
PR