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/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(); 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 へ直接接続して構いません。 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: