Invalid Date

Next.jsアプリをCloudflare Pagesにデプロイする悪夢:404エラーとの壮絶な戦い

はじめに

Next.jsアプリケーションをCloudflare Pagesにデプロイするのは、現代のウェブ開発において一般的なタスクであり、通常は比較的スムーズに進むはずです。しかし、今回、私たちは想像を絶するほど深く、そして多層的な404エラーの迷宮に迷い込むことになりました。ビルドは成功するのに、サイトは常に404。このブログ記事では、その壮絶な戦いの記録と、そこから得られた貴重な教訓を共有します。

最初の謎:ビルド成功なのに404

デプロイのたびに、Cloudflare Pagesは「Success: Your site was deployed!」と告げるにも関わらず、ブラウザには常に「404 Not Found」が表示されました。ローカルでは完璧に動作するアプリケーションが、なぜ本番環境で動かないのか?最初の容疑者は、Next.jsの多言語ルーティングを担うミドルウェアでした。

フェーズ1:型エラーの無限ループ

最初のビルドログには、src/app/api/forum/posts/[id]/comments/route.ts での型エラーが示されていました。

Type error: Route "src/app/api/forum/posts/[id]/comments/route.ts" has an invalid "GET" export:
Type "{ params: { id: string; }; }" is not a valid type for the function's second argument.

このフェーズで学んだのは、ビルドエラーは必ずしも根本原因を示さないこと、そして警告の修正はデバッグの妨げになる場合があることでした。

フェーズ2:バージョン不整合の悪夢

型エラーを解決したと思いきや、新たなエラーが発生しました。

Error: Configuring Next.js via 'next.config.ts' is not supported. Please replace the file with 'next.config.js' or 'next.config.mjs'.

これは、Next.js 15から14へのダウングレードが原因でした。

このフェーズでは、Next.jsのメジャーバージョンアップが、依存関係や設定ファイルに広範囲な影響を与えることを痛感しました。

フェーズ3:データベースの旅(PrismaとCloudflare)

ビルドが通ったと思いきや、今度はランタイムでデータベースエラーが発生しました。

PrismaClientKnownRequestError: The table `main.Job` does not exist in the current database.

このフェーズで、サーバーレス環境でのデータベース選択の重要性と、Prismaの特定の機能(Driver Adapters)の現在の制限を深く学びました。

フェーズ4:環境変数のサガ (NEXT_PUBLIC_BASE_URL)

データベースの問題を解決し、ローカルでは完璧に動作するようになったにも関わらず、Cloudflare Pagesにデプロイすると再び404エラー。

最終的な解決策として、データベースを Neon (PostgreSQL) に変更しました。 NeonはPrismaのマイグレーションツールと完全に互換性があり、db push がスムーズに動作します。

そして、NEXT_PUBLIC_BASE_URL の問題に対しては、コード側で process.env.NEXT_PUBLIC_BASE_URL が文字列の「${CF_PAGES_URL}」である場合、http://localhost:3000 にフォールバックするように明示的に記述するワークアラウンドを適用しました。

最終的な勝利、そして新たな発見

これまでのすべての問題を乗り越え、ついにサイトが正常にデプロイされ、表示されるはずです。

この長い旅の途中で、Cloudflare Pagesのフレームワークプリセットが「なし」になっていたという、最も基本的な設定ミスも発見しました。これを「Next.js」に変更することで、Next.jsのサーバー機能がCloudflare上で正しく動作するようになりました。

まとめと教訓

このデバッグの旅は、予想以上に長く、困難なものでした。しかし、そこから得られた教訓は計り知れません。

この経験は、私たちに多くのことを教えてくれました。そして、最終的にアプリケーションが動作する喜びは、この苦労を忘れさせてくれるほど大きなものです。

← Previous Entry: 日本語記事についてNext Entry:
← Back to Blog List