背景 / 不満
ローカル開発で貯めたタスクが、E2E を走らせるたびに毎回消える。
根本原因は E2E 用 DB と開発用 DB が同一であること:
e2e/global-setup.ts が全テスト前に pnpm db:reset を実行
db:reset = prisma migrate reset --force && pnpm prisma:seed(package.json)
- これが
.env の DATABASE_URL(= compose.yml の単一 corelive DB)をそのまま drop → migrate → seed する
- さらに各 spec の
test.beforeAll(resetDatabase)(e2e/web/_helpers/db.ts)も同じ DB を reset
→ 開発中の実データを保持する場所が存在しない。
加えて「本番データをローカルで触りたい / ローカルのタスクを本番に上げたい」というニーズもあるが、Clerk の Development / Production インスタンスでユーザーIDが別物なので、単純な dump/restore では自分のデータが見えない(user_id 不一致)。
ゴール
- E2E が開発用データを破壊しない(最優先・低リスク)
- 本番データを安全にローカルへ取り込める(Clerk ID 付け替え込み)
- (任意)ローカルのタスクを明示的に本番へ push できる
提案
① E2E 用 DB を物理分離 ★まず最初
postgres コンテナはそのまま、DB を 2 つに分ける(別コンテナ不要):
| 用途 |
DB 名 |
向き先 |
| 開発 |
corelive_dev |
.env の DATABASE_URL |
| E2E(使い捨て) |
corelive_test |
E2E 実行時のみ上書き |
prisma/init.sql で corelive_test も初期作成
e2e/global-setup.ts / _helpers/db.ts の db:reset 系を DATABASE_URL=...corelive_test 付きで実行(env 上書き)
- これで E2E が何度 reset しても
corelive_dev は無傷 ✨
→ 日々のストレスの大半はここで解消。
② db:import-prod script(本番 → ローカル取り込み)
pg_dump(本番, 自分の user_id のタスクのみ)
→ dump 内の本番 Clerk user_id を ローカル dev Clerk user_id に置換
→ corelive_dev に insert
pnpm db:import-prod 一発で「本番の今の状態」をローカルに落とす
- Clerk dev/prod の
user_id マッピングは .env に持たせる(例: PROD_CLERK_USER_ID / LOCAL_CLERK_USER_ID)
- Clerk 側に prod→dev のユーザー同期公式機能は基本無い想定 → seed script で ID 付け替えが現実的
③ (任意)ローカル → 本番 push
- リアルタイム同期は事故る(テストデータ本番流出)ので 明示的に叩く push script 止まりにする
- 優先度低
進め方
- まず ①(DB 分離)を単独 PR で。差分が小さく、E2E の挙動だけ変わる
- ② は ① の後。Clerk ID 付け替えロジックが肝
- ③ は必要になったら
関連ファイル
e2e/global-setup.ts
e2e/web/_helpers/db.ts
package.json(db:reset / db:truncate / prisma:seed)
compose.yml
prisma/init.sql
.env(DATABASE_URL, CLERK_*)
背景 / 不満
ローカル開発で貯めたタスクが、E2E を走らせるたびに毎回消える。
根本原因は E2E 用 DB と開発用 DB が同一であること:
e2e/global-setup.tsが全テスト前にpnpm db:resetを実行db:reset=prisma migrate reset --force && pnpm prisma:seed(package.json).envのDATABASE_URL(=compose.ymlの単一coreliveDB)をそのまま drop → migrate → seed するtest.beforeAll(resetDatabase)(e2e/web/_helpers/db.ts)も同じ DB を reset→ 開発中の実データを保持する場所が存在しない。
加えて「本番データをローカルで触りたい / ローカルのタスクを本番に上げたい」というニーズもあるが、Clerk の Development / Production インスタンスでユーザーIDが別物なので、単純な dump/restore では自分のデータが見えない(
user_id不一致)。ゴール
提案
① E2E 用 DB を物理分離 ★まず最初
postgres コンテナはそのまま、DB を 2 つに分ける(別コンテナ不要):
corelive_dev.envのDATABASE_URLcorelive_testprisma/init.sqlでcorelive_testも初期作成e2e/global-setup.ts/_helpers/db.tsのdb:reset系をDATABASE_URL=...corelive_test付きで実行(env 上書き)corelive_devは無傷 ✨→ 日々のストレスの大半はここで解消。
②
db:import-prodscript(本番 → ローカル取り込み)pnpm db:import-prod一発で「本番の今の状態」をローカルに落とすuser_idマッピングは.envに持たせる(例:PROD_CLERK_USER_ID/LOCAL_CLERK_USER_ID)③ (任意)ローカル → 本番 push
進め方
関連ファイル
e2e/global-setup.tse2e/web/_helpers/db.tspackage.json(db:reset/db:truncate/prisma:seed)compose.ymlprisma/init.sql.env(DATABASE_URL,CLERK_*)