Railwayでアプリをデプロイ!初心者がハマった5つのエラー奮闘記
プロダクトデザイナーをしている2gです。
今回、個人開発をしているプロダクトをRailwayにデプロイ!すぐに動くだろうと思っていたら、予期せぬエラーの連続...。でも、一つ一つ解決して、ついにこの画面が表示された時のは最高でした!
今回のデバッグの道のりを、未来の自分と誰かのための備忘録としてまとめます。
1. pg gemのビルドエラー 🤯
つまづきポイント
デプロイのビルドログに、Gem::Ext::BuildError: ERROR: Failed to build gem native extension.というエラーが表示されました。
原因
pg gemは、C言語で書かれた部分をコンパイル(ビルド)する必要があります。そのために必要なPostgreSQLの開発用ライブラリ (libpq-dev) が、Dockerコンテナ内にインストールされていませんでした。
解決策
Dockerfileのbundle installが実行される前に、以下のコマンドを追加して必要なライブラリをインストールしました。
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
2. 実行時ライブラリ不足 😥
つまづきポイント
ビルドは成功したものの、今度はアプリの起動時にLoadError: libpq.so.5: cannot open shared object fileというエラーが発生。
原因
マルチステージビルドを採用していたため、ビルド用ステージにはあったライブラリが、最終的な本番用イメージには含まれていませんでした。ビルド時に必要な開発用ライブラリと、実行時に必要な実行用ライブラリは別物だったのです。
解決策
最終イメージの元となるbaseステージのDockerfileに、実行時に必要なpostgresql-clientをインストールするよう修正しました。
RUN apt-get install --no-install-recommends -y ... postgresql-client
3. 認証情報の復号失敗 🔑
つまづきポイント
ActiveSupport::MessageEncryptor::InvalidMessageというエラーが延々と表示され、アプリが起動しませんでした。
原因
本番環境のデータベース接続情報などを保存している暗号化ファイル (config/credentials.yml.enc) を、正しい鍵で復号できていませんでした。原因は、Railwayに設定した環境変数RAILS_MASTER_KEYの値が、ローカルのconfig/master.keyと一致していなかったことです。
解決策
ローカルで古いキーと認証情報ファイル (master.key, credentials.yml.enc) を一度削除。
bin/rails credentials:editコマンドで、キーとファイルをペアで再生成。
新しく生成されたmaster.keyの中身をコピーし、RailwayのRAILS_MASTER_KEY環境変数の値を更新して、再デプロイしました。
4. 複数DB設定エラー (cable, queue, cache) ⚙️
つまづきポイント
The 'cable' database is not configured...というエラーが発生。それを解決すると、今度はqueue、cacheと、次々に同じ種類のエラーが続きました。
原因
Rails 8はデフォルトで、Action Cable (cable)、Solid Queue (queue)、Solid Cache (cache) 用に、それぞれ別々のデータベース設定を要求します。database.ymlをPostgreSQL用にシンプルに書き換えた結果、プライマリDBの設定しかなくなり、これらの設定が見つからない、と怒られていました。
解決策
当初はproduction.rbで各機能をプライマリDBに接続させようとしましたが、別のエラーを引き起こしました。
最終的に、database.ymlでprimary、queue、cacheの全てを明示的に定義する形に落ち着きました。全て同じDATABASE_URLを参照させることで、実質的に同じデータベースを使いつつ、Railsの設定要求を満たすことができました。
5. assets:precompile ビルドエラー 💥
つまづきポイント
最後の仕上げと思いきや、assets:precompileのステップでビルドが失敗。エラーはArgumentError: You can only specify one of :database, :databases, or :connects_toでした。
原因
production.rbに中途半端に残っていたconnects_toの設定が、database.ymlで定義した設定と競合していました。
解決策
production.rbから、solid_queueとsolid_cacheのために追加・残存していたconnects_toの記述を完全に削除。設定をdatabase.ymlに完全に一本化することで、ビルドが通るようになりました。
まとめ
-
ビルド時と実行時で必要なライブラリは違うことがある。
-
環境変数、特にRAILS_MASTER_KEYはデプロイの最重要チェックポイント。
-
Rails 8の複数DB設定は便利だが、シンプルな構成にする場合はdatabase.ymlでの明示的な設定が必要。
-
エラーが出たら、まずはログをしっかり読むことが解決への一番の近道!
長い道のりでしたが、多くのことを学べたデプロイでした。
Discussion