【Railway】Symfonyアプリのデプロイ

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

Railwayはこちら (←このリンクから登録すると20ドル分のクレジットがもらえます)

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プロジェクトの初期化
    • プロンプトに従ってプロジェクトに名前を付けます。
    • プロジェクトが作成されたら、提供されたリンクをクリックしてブラウザで表示します。
  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にアクセスして、アプリがライブで動作していることを確認してください!

Symfonyアプリディレクトリで以下のコマンドを実行します。

railway init

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にデプロイして実行するために必要なコマンドが含まれます。
  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 をクリックします。

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

run-worker.sh ファイルに以下の内容を追加します。このスクリプトはキューワーカーを実行します。

#!/bin/bash
# このファイルに実行権限があることを確認してください。`chmod +x run-worker.sh` を実行します。
# このコマンドはキューワーカーを実行します。
php bin/console messenger:consume async --time-limit=3600 --memory-limit=128M &

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)

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

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

アプリサービス

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

次のステップ

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

Railwayはこちら (←このリンクから登録すると20ドル分のクレジットがもらえます)

Read more

リアルタイム投票アプリ5選【ライブ配信やイベントで】

リアルタイム投票アプリ5選【ライブ配信やイベントで】

ウェビナーやセミナー、社内研修を実施する際、「参加者が受け身になってしまう」「質問がなかなか出てこない」といった課題を感じたことはないでしょうか。 オンラインでの情報発信が当たり前になった今、一方的な配信だけでは参加者の満足度を高めることが難しくなっています。そこで注目されているのが、リアルタイムで参加者の意見を集約し、その場で結果を共有できる投票・質問ツールです。 本記事では、ライブ配信やイベント、研修などで活用できるリアルタイム投票アプリを5つ厳選してご紹介します。 リアルタイム投票でつながる参加者とイベント リアルタイム投票やQ&A機能を使うと、視聴者や参加者の意見を即座に集計・表示できます。講義や会議の進行を妨げず、参加者全員が自分の意見を簡単に表明できる仕組みです。 従来の挙手による質疑応答では、発言しづらいと感じる参加者も少なくありません。特にオンラインイベントでは、カメラがオンになっていることへの抵抗感や、大人数の前で質問することへのハードルが存在します。 しかし、スマートフォンから匿名で投票やコメントができる仕組みがあれば、参加者は気軽に自分の意見を伝えら

By 阿部 隼也
質問受付ツールの選び方とおすすめ5選を紹介

質問受付ツールの選び方とおすすめ5選を紹介

セミナーや講演会、社内研修などで「質問はありませんか?」と投げかけても、なかなか手が挙がらない経験はないでしょうか。参加者に有益な情報を提供しても、疑問や意見が共有されないまま終わってしまうのは、主催者にとっても参加者にとっても大きな機会損失です。 こうした課題を解決するために注目されているのが「質問受付ツール」です。参加者がスマートフォンから匿名で質問を投稿できるため、発言への抵抗感が下がり、活発なコミュニケーションが生まれます。 本記事では、質問受付ツールの基本機能から、実際に役立つおすすめツール5選、そして選定時に押さえておきたいポイントまで、実務に活かせる情報をまとめて解説します。 質問受付の現場課題 イベントやセミナーの運営で最も頭を悩ませる問題の一つが、参加者からの質問をいかに引き出すかという点です。質問タイムを設けても、会場がシーンと静まり返ってしまい、仕方なく「それでは時間になりましたので」と締めくくる光景は珍しくありません。 この背景には、日本特有の文化的要因も関係しています。大勢の前で発言することへの恥ずかしさ、自分の質問が的外れではないかという不安、他

By 阿部 隼也
オンラインセミナーアプリの選び方。参加者エンゲージメントを高めるポイント

オンラインセミナーアプリの選び方。参加者エンゲージメントを高めるポイント

近年、オンラインセミナーの活用が急速に広がっています。会場のコストや移動時間を気にすることなく、全国・世界中から参加者を集められる点は大きな魅力です。 しかし、せっかく開催しても 「参加者が途中で離脱してしまう」 「ただ見ているだけで反応が薄い」 といった課題を抱えている企業も少なくありません。 本記事では、参加者のエンゲージメントを高め、成果につながるオンラインセミナーアプリの選び方と、実務に役立つ具体的なポイントを解説します。 参加者とのつながりを生むオンライン環境の設計 オンラインセミナーにおける最大の課題は、画面越しの距離感です。会場で直接顔を合わせる機会がないからこそ、参加者が「ただ見ているだけ」にならないような仕組みが求められます。適切なツールと機能選びが、参加者のエンゲージメントを左右します。 従来のオフラインセミナーでは、会場の雰囲気や参加者同士の反応が自然と生まれましたが、オンラインではそうした「空気感」が伝わりにくくなります。だからこそ、双方向のコミュニケーション機能や、参加者の行動データを活用した設計が重要になるのです。 エンゲージメントを高

By 阿部 隼也
参加者の質問を効率的に管理!ZoomウェビナーQ&A機能の使い方を徹底解説

参加者の質問を効率的に管理!ZoomウェビナーQ&A機能の使い方を徹底解説

オンラインでのセミナーやイベントが日常化する中で、Zoomウェビナーを活用している企業が増えています。しかし、ウェビナーの開催で意外と頭を悩ませるのが「参加者からの質問をどう管理するか」という点ではないでしょうか。 セミナーが盛り上がり、次々と質問が寄せられるのは嬉しいことです。一方で、質問が多すぎて整理しきれない、どの質問に優先的に答えるべきか判断に迷う、といった課題も生じます。こうした問題を解決するために役立つのが、ZoomウェビナーのQ&A機能です。 本記事では、ZoomウェビナーのQ&A機能の基本的な使い方から、参加者の質問を効率的に管理する実践的なテクニックまで、詳しく解説していきます。 ZoomウェビナーのQ&A機能とは ZoomウェビナーのQ&A機能は、ウェビナー開催中に参加者が質問を投稿し、主催者側が回答を行うための専用機能です。この機能を使うことで、質問と回答がスレッド形式で整理され、効率的なコミュニケーションが可能になります。 チャット機能との違い Zoomには「チャット機能」もあるため、「Q&A機能とチャット機能の違いは何か」と疑問に思う方も多いで

By 阿部 隼也