😂

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