AIイノベーションズ
Railway/Guides

Symfonyアプリのデプロイ

このステップバイステップガイドで、RailwayにSymfonyアプリをデプロイする方法を学びます。クイックセットアップ、データベース統合、cronとワーカー、ワンクリックデプロイ、その他のデプロイ戦略について説明します。

著者: AIイノベーションズ 阿部隼也X / Twitter

Railwayはこちら

Symfonyアプリのデプロイ

Symfonyは、調和して動作する分離された再利用可能なコンポーネントのセットで構成されるPHP Webフレームワークであり、WebサイトやWebアプリケーションを作成します。

このガイドでは、3つの方法でRailwayにSymfonyアプリをデプロイする方法について説明します。

  1. テンプレートからのワンクリックデプロイ
  2. GitHubリポジトリから
  3. CLIを使用

それでは、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アプリをデプロイする複数の方法を提供します。

テンプレートからのワンクリックデプロイ

Railwayにデプロイ

このテンプレートは、スターターSymfonyアプリケーションとPostgresデータベースをRailwayにセットアップします。また、コミュニティによって作成されたさまざまなSymfonyアプリテンプレートから選択することもできます。

デプロイ後はテンプレートから Eject して、GitHub アカウントにリポジトリのコピーを作成することを強くおすすめします。

CLIからデプロイ

Symfonyアプリがローカルにある場合は、次の手順に従います。

  1. Railway CLIのインストール
    • CLIをインストールし、Railwayアカウントで認証します。
  2. Railwayプロジェクトの初期化
    • Symfonyアプリディレクトリで以下のコマンドを実行します。
      railway init
    • プロンプトに従ってプロジェクトに名前を付けます。
    • プロジェクトが作成されたら、提供されたリンクをクリックしてブラウザで表示します。
  3. Postgresデータベースサービスの追加
    • railway add -d postgres を実行します。
    • Enter を押してプロジェクトに追加します。
    • データベースサービスがRailwayプロジェクトに追加されます。
  4. サービスと環境変数の追加
    • railway add を実行します。
    • オプションのリストから Empty Service を選択します。
    • Enter a service name プロンプトで app-service と入力します。
    • Enter a variable プロンプトで DATABASE_URL=${{Postgres.DATABASE_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リファレンスを参照してください。
  5. アプリケーションのデプロイ
    • railway up を実行してアプリをデプロイします。
      • このコマンドは、アプリのファイルをスキャン、圧縮し、Railwayにアップロードします。ターミナルにはリアルタイムのデプロイログが表示されます。
    • デプロイが完了したら、アプリサービスのドメインを生成に進むことができます。
  6. 公開URLの設定
    • railway domain を実行して、アプリの公開URLを生成します。
    • 新しいURLにアクセスして、アプリがライブで動作していることを確認してください!

GitHubリポジトリからデプロイ

SymfonyアプリをGitHubから直接Railwayにデプロイするには、以下の手順に従ってください。

  1. Railwayで新しいプロジェクトを作成
    • Railwayにアクセスして、新しいプロジェクトを作成します。
  2. GitHubからデプロイ
    • Deploy from GitHub repo を選択し、リポジトリを選択します。
      • RailwayアカウントがまだGitHubにリンクされていない場合は、リンクするように求められます。
  3. 環境変数の追加とデータベースサービスのプロビジョニング
    • 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構成がアプリを提供するための正しいルートディレクトリパスを指すようにします。
  4. アプリサービスのデプロイ
    • Railwayプロジェクトキャンバスで Deploy をクリックして、変更を適用します。
  5. デプロイの確認
    • デプロイが完了したら、View logs に移動して、サーバーが正常に実行されていることを確認します。 注: デプロイプロセス中に、RailwayはNixpacksを介してPHPアプリであることを自動的に検出します。
  6. 公開URLの設定
    • 新しいサービスの「設定」タブのNetworkingセクションに移動します。
    • 「Generate Domain」をクリックして、アプリの公開URLを作成します。

注: 次のステップでは、Symfonyアプリをデータベース、マイグレーション、cronジョブ、ワーカーとともに実行する方法を示します。

データベース、マイグレーション、Cron、ワーカーのセットアップ

このセットアップでは、SymfonyアプリをRailwayにデプロイし、データベース、スケジュールされたタスク(cron)、およびキュワーカがすべて完全に機能することを確認します。

デプロイ構造は「雄大なモノリス」アーキテクチャに従い、Symfonyアプリ全体が単一のコードベースとして管理されますが、Railwayでは4つの別々のサービスに分割されます。

  • アプリサービス:HTTPリクエストとユーザーインタラクションを処理します。
  • Cronサービス:スケジュールされたタスク(メール送信やレポート実行など)を管理します。
  • ワーカーサービス:キューからバックグラウンドジョブを処理します。
  • データベースサービス:アプリケーションのデータを保存および取得します。

私の雄大なモノリスSymfonyアプリ

開始するには、次の手順に従ってください。

  1. Symfonyアプリのルートディレクトリに、run-app.shrun-worker.shrun-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
  2. プロジェクトキャンバスにPostgresデータベースサービスを作成します。
    • Deploy をクリックします。
  3. プロジェクトキャンバスに新しいサービスを作成します。
    • サービスに App Service という名前を付け、Settings をクリックして構成します。
    • Source セクションでGitHubリポジトリを Source Repo に接続します。
    • Deploy セクションの Custom Start Commandchmod +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 をクリックします。
  4. プロジェクトキャンバスに新しいサービスを作成します。
    • サービスに Cron Service という名前を付け、Settings をクリックします。
    • Source セクションでGitHubリポジトリを Source Repo に接続します。
    • Deploy セクションの Custom Start Commandchmod +x ./run-cron.sh && sh ./run-cron.sh を追加します。
    • サービスの上部に戻り、Variables をクリックします。
    • ステップ3で既に強調表示されているすべての必要な環境変数を追加します。
    • Deploy をクリックします。
  5. プロジェクトキャンバスに再度新しいサービスを作成します。
    • サービスに Worker Service という名前を付け、Settings をクリックします。
    • Source セクションでGitHubリポジトリを Source Repo に接続します。
    • Deploy セクションの Custom Start Commandchmod +x ./run-worker.sh && sh ./run-worker.sh を追加します。
    • サービスの上部に戻り、Variables をクリックします。
    • ステップ3で既に強調表示されているすべての必要な環境変数を追加します。
    • Deploy をクリックします。

この時点で、3つのサービスすべてがデプロイされ、Postgresデータベースサービスに接続されているはずです。

  • Cronサービス:このサービスは、スケジュールされたタスクを管理するためにcronバンドラスケジューラを実行する必要があります。
  • ワーカーサービス:このサービスは実行中であり、キューからジョブを処理する準備ができている必要があります。
  • アプリサービス:このサービスは実行中であり、ユーザーがアプリケーションにアクセスできるように公開ドメインを持つ必要がある唯一のサービスです。

アプリサービス

注: このデプロイアプローチを示すコミュニティテンプレートが利用可能です。このテンプレートを簡単にデプロイし、アプリケーション用に独自のGitHubリポジトリに接続できます。

次のステップ

Railwayでのエクスペリエンスを最大限に活用するために、これらのリソースを調べてください。

Railwayはこちら

PR