はじめに
Prisma と Supabase を組み合わせた Next.js プロジェクトを Docker 環境で構築している中で、データベース接続に失敗する問題に直面しました。
本記事では、その問題の詳細と解消方法についてまとめます。同じ課題に直面している方の参考になれば幸いです。
環境
- フレームワーク: Next.js 13
- ORM: Prisma
- データベース: Supabase PostgreSQL
- コンテナ: Docker
- エラー発生時の Prisma コマンド:
npx prisma migrate dev --name init
DATABASE_URL="postgresql://postgres:[YOUR-PASSWORD]@db.xxx.supabase.co:5432/postgrest"
問題
以下のエラーが発生し、Prisma が Supabase のデータベースに接続できませんでした。
Error: P1001: Can't reach database server at `db.xxx.supabase.co:5432`
Please make sure your database server is running at `db.xxx.supabase.co:5432`.
また、ping コマンドを使った接続確認では以下のように IPv6 アドレスのみが解決され、接続に失敗する状況でした。
root@react:/usr/src/app/src# nslookup db.xxx.supabase.co
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: db.xxx.supabase.co
Address: 2406:da14:271:9903:fec7:75fa:9c8:82ef
やったこと
以下の記事を参考にして、さまざまな方法で問題解決を試みました。
解消方法
最終的に、Supabase の接続設定を以下のように変更することで問題が解決しました。
Supabase の「Session Pooler」を使用し、IPv4 接続を強制するようにしました。
DATABASE_URL="postgresql://postgres.xxx:[YOUR-PASSWORD]@aws-0-ap-northeast-1.pooler.supabase.com:5432/postgres"
この設定を .env ファイルに記載し、以下の Prisma コマンドを実行して接続テストを行ったところ、正常に動作しました。
npx prisma migrate dev --name init
結果として、データベースへのマイグレーションが成功しました。
今回の原因
この問題は、Docker環境ではデフォルトでIPv4を使用しているが、
Supabaseの接続先アドレスをIPv6のもので設定していたことが原因でした。
参考記事
なので、Dockerで.env
の内容は変えずに、
IPv6通信を有効化する方法でも解消できるかもしれません。
本記事が同様の問題に直面している方々の助けになれば幸いです。コメントやフィードバックがあれば、ぜひお寄せください!