前提条件
-
Railwayにアカウントを作成しておきます。
- サインインは GitHub アカウント、または、メールアドレスを利用します。
- アカウント作成から30日間または5ドル分のクレジットを消費するまでは無料で利用可能なようです。
- メールアドレスでサインインを行った場合は GitHub アカウントとの連携が行われていないので、「Account Settings」→「Account Integrations」から GitHub に接続しておきます。
- GitHub との連携時にデプロイ対象のリポジトリを設定しておきます。設定したリポジトリは GitHub の「Integrations」→「Applications」→「Railway App」の画面で確認可能です。
事前準備
まず、Laravel 13を使ってデプロイの対象となるアプリケーションを準備します。
今回は cc-sddを使って、以下のような簡単なTodoリストのアプリケーションを開発して、 GitHub に push しました。
Railway にアプリケーションを登録
それでは、Deploy a Laravel Appの説明に従いながら Railway にデプロイするための設定を行っていきます。
Railway のwebページにアクセスしてサインインを行います。
サインインするとこのような構成のダッシュボードが表示されます。
初期状態ではプロジェクト(アプリケーションやデータベースをインストールするための枠)が存在しないため、「Projects」の画面で「New」ボタンをクリックして、まずプロジェクトを作成します。
アプリケーションの設定を進める前にデータベースの準備を行う必要があるため、メニューから「Database」を選択します。
データベースの選択肢の中から、今回は「MySQL」を選択します。
データベースの作成が始まりますのでしばらく待ちます。
データベースの作成が完了すると「Online」と表示されるので、こちらをクリックします。
「Deployments」のタブで MySQL 9.4 がデプロイされたことが確認できます。
「Variables」のタブで接続に関する各値を確認して控えておきます。
Railway では composer.json 内の require を参照して PHP のバージョンを確定するので、設定内容に不備がないか事前に確認しておきます。
{
・
・
"require": {
"php": "^8.4",
"laravel/framework": "^13.8",
"laravel/tinker": "^3.0"
},
データベースが作成できたら、次は画面右上の「Add」ボタンをクリックして Laravel アプリケーションの追加を行います。
今回は GitHub のリポジトリと連携してデプロイを行いたいので、「GitHub Repository」を選択します。
GitHub との連携の際に設定しておいたデプロイ対象の GitHub のリポジトリを選択します。
以下のようにデプロイ待ちの状態になったら「Deploy」ボタンをクリックします。
アプリケーションの作成が始まります。
アプリケーションの作成が完了すると「Online」と表示されるので、こちらをクリックします。
「Deployments」のタブでデプロイが成功していることが確認できます。
「View logs」ボタンをクリックします。
「Details」タブの「Configuration」から PHP 8.4.24 がインストールされていることが確認できます。
画面右上の「×」ボタンをクリックして、「View logs」の画面を閉じます。
「Variables」のタブに「Suggested Variables」とあるように必要と思われる変数を提示してくれていますので、必要・不要を判断して追加します。
Laravel のアプリケーションを動作させるには最低でも以下の変数は必要と思われます。
- APP_NAME
- APP_ENV
- APP_KEY
- APP_DEBUG
- APP_URL
- APP_LOCALE
- APP_FALLBACK_LOCALE
- APP_FAKER_LOCALE
- DB_CONNECTION
- DB_URL
「APP_KEY」を発行するため「Console」のタブに移動して php artisan key:generate --show を実行して、発行された値を控えておきます。
「Variables」のタブで「New Variable」ボタンをクリックします。
php artisan key:generate --show で発行された値を APP_KEY として入力して「Add」ボタンをクリックします。
APP_KEY と同様にアプリケーションの動作やDB接続に関連する値を以下のように登録します。
「Variables」のタブにこのように表示されます。
変更が発生したことによりデプロイ待ちの状態になるので「Deploy」ボタンをクリックします。
※データベースの接続に関する変数を設定しようとしているためなのか、アプリケーションからデータベースに対して矢印が伸びています。
データベースのマイグレーションが成功していることを確認するため、 MySQL をクリックします。
「Database」の「Tables」の欄に各テーブルが表示されているので、マイグレーションが成功しているようです。
「migrations」のテーブルをクリックします。
マイグレーションの履歴がこのように表示されます。
同様に Query の欄から select * from migrations; を実行すると、同じ結果が得られます。
ここまでの作業でデータベースとアプリケーションのデプロイは完了していますが、 Railway ではデプロイと同時に自動的に外部からアクセス可能なURLが発行されない仕組みのようです。
外部からアクセス可能なURLを発行するため、アプリケーションをクリックします。
「Settings」のタブに移動します。
「Networking」→「Public Networking」の「Generate Domain」ボタンをクリックします。
外部からアクセス可能な以下のような形式のURLが発行されました。
https://[アプリケーション名]-[Environment名]-[XXXX].up.railway.app/
発行されたURLにアクセスすると、CSSが適用されていない状態のページが表示されました。
開発ツールで確認すると「Mixed Content」の警告が発生していることがわかります。
「Variables」のタブから発行されたURLを「APP_URL」、「ASSET_URL」として登録します。
デプロイを実行します。
発行されたURLにアクセスすると、今度はCSSが適用された形で表示されました。
Todoリストのページのルーティングパスにアクセスすると、Todoリストの初期画面が表示されました。
タスクを追加しようとすると、「送信しようとしている情報は保護されません」と表示されましたので、「このまま送信」を押します。
画面遷移が発生し、再びタスク一覧が表示されました。
この状態でソースを確認すると、以下のタグのURLが「http://」となっています。
<form method="POST" action="http://<a href="http://
どうやら、「Trusted Proxies」の機能が関係してそうです。なので、開発環境で以下のコマンドを実行して app/Http/Middleware/TrustProxies.php を作成します。
$ php artisan make:middleware TrustProxies
bootstrap/app.php を以下のように修正します。
修正前
->withMiddleware(function (Middleware $middleware): void {
//
})
修正後
->withMiddleware(function (Middleware $middleware): void {
$middleware->trustProxies(at: '*');
})
デプロイ対象のリポジトリに上記の修正を push します。
「Mixed Content」や「送信しようとしている情報は保護されません」といった警告が表示されることなく、Todoの追加・更新・削除が行える(DBにデータが保存される)ことが確認できました。
まとめ
先日触った「Laravel Cloud」と比較すると、随分面倒くさかったなという印象です。
特に環境変数周りなんですが、 Fly.io のように環境変数を一括で登録できるコマンドがあると便利なんだけどなぁと考えながら、GUIから変数を1項目ずつ丁寧に登録しました。
このあたりは、「Railway CLI」を利用することで解決するのかもしれません。
$ fly secrets set `cat .env.production`
色々と設定が完了したあとに、「Variables」のタブに「Raw Editor」というのを見つけました。。。
まぁ、気づかなかった自分が悪いんですが、もっと早く言ってよという気持ちになっちゃいました。
初めて触ったこともあり、わからない面は多々ありましたが、慣れてしまえば個人開発などで利用する際には扱いやすいのではないでしょうか。
Laravel Cloud と同様にアプリケーションとデータベースが同じプラットフォーム上にマネージドで利用可能なのは管理が非常に楽かと思います。
コスト面ですが、PHPのアプリケーションをPaaSで動かせる環境は限られていますし、そのあたりを考慮すると月額5ドルでLaravel、PHPがちゃんと動く環境を手に入れられるのはわりとアリかもしれません。
関連記事




























































