From 60fdbf4692e90cf799717272ea24c9da7d0b5717 Mon Sep 17 00:00:00 2001 From: miyabi Date: Sun, 9 Nov 2025 02:53:26 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20supabase=E3=82=AF=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=82=A2=E3=83=B3=E3=83=88=E3=81=AE=E5=88=9D=E6=9C=9F=E5=8C=96?= =?UTF-8?q?=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=81=97=E3=80=81=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0=E3=81=8C?= =?UTF-8?q?=E7=84=A1=E3=81=84=E5=A0=B4=E5=90=88=E3=81=AE=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E6=94=B9=E5=96=84(=E3=81=AA=E3=81=8B=E3=81=A3?= =?UTF-8?q?=E3=81=9F=E3=82=89=E3=82=B9=E3=83=AB=E3=83=BC=E3=81=99=E3=82=8B?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/lib/supabase.ts | 19 +++++++++++-------- backend/src/routes/modules/sessions.routes.ts | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/backend/src/lib/supabase.ts b/backend/src/lib/supabase.ts index 4fa1212..5558348 100644 --- a/backend/src/lib/supabase.ts +++ b/backend/src/lib/supabase.ts @@ -1,13 +1,16 @@ -import { createClient } from "@supabase/supabase-js"; +import { createClient, type SupabaseClient } from "@supabase/supabase-js"; // バックエンドではNEXT_PUBLIC_プレフィックスなしの環境変数も使用可能 -const supabaseUrl = - process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL; -const supabaseAnonKey = - process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY; +const supabaseUrl = process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL; +const supabaseAnonKey = process.env.SUPABASE_ANON_KEY || process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY; -if (!supabaseUrl || !supabaseAnonKey) { - throw new Error("Missing Supabase environment variables"); +// 環境変数が無い場合でもアプリ全体が落ちないよう、null を返す +let client: SupabaseClient | null = null; +if (supabaseUrl && supabaseAnonKey) { + client = createClient(supabaseUrl, supabaseAnonKey); +} else { + // 本番環境で匿名サインインが不要な場合に備え、警告ログのみに留める + console.warn("[Supabase] Missing SUPABASE_URL/ANON_KEY. Anonymous auth will be skipped."); } -export const supabase = createClient(supabaseUrl, supabaseAnonKey); +export const supabase = client; diff --git a/backend/src/routes/modules/sessions.routes.ts b/backend/src/routes/modules/sessions.routes.ts index 7c6c22d..e17307f 100644 --- a/backend/src/routes/modules/sessions.routes.ts +++ b/backend/src/routes/modules/sessions.routes.ts @@ -25,7 +25,7 @@ sessions.post("/", async (c) => { let userId: string | undefined = existingUserId; - if (!userId) { + if (!userId && supabase) { // Try to create anonymous user (best-effort). If it fails, proceed without userId. try { const { data, error } = await supabase.auth.signInAnonymously(); From 12ba0e1f7d54837b47d28d26478ee436da16a734 Mon Sep 17 00:00:00 2001 From: miyabi Date: Sun, 9 Nov 2025 03:28:36 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=81=A8Prisma=E3=81=AE=E6=8E=A5?= =?UTF-8?q?=E7=B6=9A=E6=96=B9=E6=B3=95=E3=81=AB=E9=96=A2=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=81=97=E3=80=81Cloudflare=20Workers?= =?UTF-8?q?=E3=81=A7=E3=81=AE=E6=8E=A5=E7=B6=9A=E6=96=B9=E6=B3=95=E3=82=92?= =?UTF-8?q?=E6=98=8E=E7=A4=BA=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 9 +++++++-- backend/package.json | 2 +- backend/src/lib/prisma.ts | 8 ++++++++ docs/setup.md | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 17e549b..3c63165 100644 --- a/.env.example +++ b/.env.example @@ -3,8 +3,13 @@ # Application NODE_ENV=development -# Database (Prisma + Supabase) -DATABASE_URL=postgresql://postgres:your-password@db.your-project-id.supabase.co:5432/postgres +# Database +# 開発(ローカルPostgresなど)の例: +# DATABASE_URL=postgresql://postgres:your-password@localhost:5432/postgres + +# 本番(Cloudflare Workers などサーバレス環境)では Prisma Accelerate を使用してください。 +# Prisma Accelerate の接続文字列 (prisma://...) を Secrets に設定します。 +# DATABASE_URL=prisma://YOUR_ACCELERATE_CONNECTION_STRING # Supabase (Frontend用) NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co diff --git a/backend/package.json b/backend/package.json index b969a56..7260f99 100644 --- a/backend/package.json +++ b/backend/package.json @@ -34,7 +34,7 @@ "@cloudflare/workers-types": "^4.20241127.0", "@types/node": "^24.7.1", "@types/ws": "^8.18.1", - "prisma": "^6.17.0", + "prisma": "^6.19.0", "tsx": "^4.20.6", "wrangler": "^4.46.0" } diff --git a/backend/src/lib/prisma.ts b/backend/src/lib/prisma.ts index ef7c326..8c60730 100644 --- a/backend/src/lib/prisma.ts +++ b/backend/src/lib/prisma.ts @@ -31,6 +31,14 @@ function createPrismaClient() { // 標準のPrisma Clientを使用(ローカル開発用) console.log("[Prisma] Using standard Prisma Client"); + if (process.env.NODE_ENV === "production") { + // Cloudflare Workers の本番で直接 Postgres 接続はできません。Accelerate の利用を促す警告を出します。 + if (databaseUrl.startsWith("postgres://") || databaseUrl.startsWith("postgresql://")) { + console.warn( + "[Prisma] In production on Workers, use Prisma Accelerate. Set DATABASE_URL to your prisma:// connection string." + ); + } + } return new PrismaClient({ log: process.env.NODE_ENV === "development" ? ["error"] : ["error"], }); diff --git a/docs/setup.md b/docs/setup.md index 00bcd4a..59a751b 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -39,3 +39,17 @@ cd .. 1. [Supabase](https://supabase.com/)でプロジェクトを作成 2. SQL Editor で[docs/database-schema.md](docs/database-schema.md)の SQL を実行 3. フロントエンドの`.env`に認証情報を追加 + +### Cloudflare Workers 本番での DB 接続(重要) + +Cloudflare Workers などのサーバレス環境からは、PostgreSQL へ直接 TCP 接続できません。Prisma Accelerate(HTTP over Data Proxy)を使います。 + +手順: + +1. Prisma Accelerate を有効化し、Accelerate 接続文字列(`prisma://...`)を取得 +2. Cloudflare ダッシュボードの Workers → Settings → Variables/Secrets に `DATABASE_URL` として `prisma://...` を設定 +3. デプロイ + +コード側では `DATABASE_URL` が `prisma://` の場合に自動で Accelerate を利用します(`backend/src/lib/prisma.ts`)。 + +開発環境では `postgresql://...` を使ってローカル DB へ直接接続して構いません。 From a6417363b65fdd7d0e12dac7556a1283ea62778e Mon Sep 17 00:00:00 2001 From: miyabi Date: Sun, 9 Nov 2025 03:33:26 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20Prisma=E3=81=AE=E3=83=90=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=83=A7=E3=83=B3=E3=82=926.17.0=E3=81=8B=E3=82=896.1?= =?UTF-8?q?9.0=E3=81=AB=E6=9B=B4=E6=96=B0=E3=81=97=E3=80=81=E4=BE=9D?= =?UTF-8?q?=E5=AD=98=E9=96=A2=E4=BF=82=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e02e8e..9c0e1e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,10 +53,10 @@ importers: version: 15.5.5 '@prisma/client': specifier: ^6.19.0 - version: 6.19.0(prisma@6.17.0(typescript@5.9.3))(typescript@5.9.3) + version: 6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3) '@prisma/extension-accelerate': specifier: ^2.0.2 - version: 2.0.2(@prisma/client@6.19.0(prisma@6.17.0(typescript@5.9.3))(typescript@5.9.3)) + version: 2.0.2(@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)) '@supabase/supabase-js': specifier: ^2.75.0 version: 2.75.0 @@ -89,8 +89,8 @@ importers: specifier: ^8.18.1 version: 8.18.1 prisma: - specifier: ^6.17.0 - version: 6.17.0(typescript@5.9.3) + specifier: ^6.19.0 + version: 6.19.0(typescript@5.9.3) tsx: specifier: ^4.20.6 version: 4.20.6 @@ -4828,11 +4828,6 @@ snapshots: prisma: 6.17.0(typescript@5.9.3) typescript: 5.9.3 - '@prisma/client@6.19.0(prisma@6.17.0(typescript@5.9.3))(typescript@5.9.3)': - optionalDependencies: - prisma: 6.17.0(typescript@5.9.3) - typescript: 5.9.3 - '@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3)': optionalDependencies: prisma: 6.19.0(typescript@5.9.3) @@ -4878,9 +4873,9 @@ snapshots: '@prisma/fetch-engine': 6.19.0 '@prisma/get-platform': 6.19.0 - '@prisma/extension-accelerate@2.0.2(@prisma/client@6.19.0(prisma@6.17.0(typescript@5.9.3))(typescript@5.9.3))': + '@prisma/extension-accelerate@2.0.2(@prisma/client@6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3))': dependencies: - '@prisma/client': 6.19.0(prisma@6.17.0(typescript@5.9.3))(typescript@5.9.3) + '@prisma/client': 6.19.0(prisma@6.19.0(typescript@5.9.3))(typescript@5.9.3) '@prisma/fetch-engine@6.17.0': dependencies: