Phase 1: Prisma Postgres Setup
Goal
Create a clean Prisma Postgres environment for TendSocial with split connection settings for runtime traffic versus migrations/admin tooling. This phase creates and seeds the Prisma database. It does not migrate production data from Neon.
Why this matters
Prisma Postgres provides pooled and direct connection paths. Application traffic should use the pooled connection. Migrations, schema tools, Studio, dump/restore, and long-running/session-dependent work should use the direct connection. Prisma documents that the pooler uses PgBouncer in transaction mode, where session state does not persist between transactions; it also warns that using the direct hostname for application traffic can silently exhaust connections under load. Source: Prisma Postgres connection pooling.
Environments to create
Create at least:
tendsocial-prisma-dev
tendsocial-prisma-staging
tendsocial-prisma-benchmarkRecommended purpose:
| Environment | Purpose |
|---|---|
dev | Local and developer smoke testing. |
staging | Production-like pre-release app testing. |
benchmark | Repeatable destructive benchmark/seeding runs. |
Required env vars
Use split URLs everywhere:
# Runtime traffic: API handlers, workers, serverless functions
DATABASE_URL="prisma-postgres-pooled-url"
# Admin traffic: Prisma CLI, migrations, Studio, dump/restore
DIRECT_DATABASE_URL="prisma-postgres-direct-url"In Prisma 7, keep schema.prisma datasource free of deprecated url / directUrl fields:
datasource db {
provider = "postgresql"
}Configure Prisma CLI/admin datasource routing in apps/backend/prisma.config.ts:
import "dotenv/config";
import { defineConfig } from "@prisma/config";
export default defineConfig({
datasource: {
url: process.env.DIRECT_DATABASE_URL,
},
});Runtime application code still passes process.env.DATABASE_URL to new PrismaPg({ connectionString }).
Runtime placement
Update:
backend/.env
backend/.env.local
backend/.env.test
backend/.env.benchmark
Cloud Run environment variables
CI/CD secrets
Vercel environment variables if any DB-connected route exists thereRules:
| Consumer | URL |
|---|---|
| Backend API runtime | DATABASE_URL pooled URL |
| Background workers | DATABASE_URL pooled URL |
| Serverless functions | DATABASE_URL pooled URL |
prisma migrate deploy | DIRECT_DATABASE_URL through prisma.config.ts |
prisma db push | DIRECT_DATABASE_URL through prisma.config.ts |
prisma db pull | DIRECT_DATABASE_URL through prisma.config.ts |
| Prisma Studio | DIRECT_DATABASE_URL through prisma.config.ts |
pg_dump / pg_restore | DIRECT_DATABASE_URL direct URL |
| Long-running maintenance queries | DIRECT_DATABASE_URL direct URL |
Schema creation
Preferred production-like path:
npx prisma migrate deployDisposable benchmark path only:
npx prisma db pushThen generate the client:
npx prisma generateInitial seed
Create or update:
prisma/seed.tsSeed enough data to reproduce TendSocial behavior:
| Data group | Minimum seed |
|---|---|
| Users | 3-5 |
| Workspaces | 2-3 |
| Workspace members | 3-10 |
| Brands | 2 per workspace |
| Social accounts | Placeholder Google, Instagram, LinkedIn, TikTok, Facebook |
| Campaigns | 5-10 |
| Short-form content records | 100-500 |
| Blog posts | 25-50 |
| Calendar/scheduled posts | 60-180 |
| AI draft records | 100+ |
| Publishing jobs | 50+ |
| Activity/audit rows | Enough to test current behavior |
Run:
npx prisma db seedSuggested seed profile
Create two profiles:
seed:small realistic solo/dev
seed:benchmark 50-user equivalent content volumeExample scripts:
{
"scripts": {
"db:setup:prisma": "prisma migrate deploy && prisma generate && prisma db seed",
"db:seed:small": "SEED_PROFILE=small prisma db seed",
"db:seed:benchmark": "SEED_PROFILE=benchmark prisma db seed"
}
}Smoke tests
Run these after setup:
pnpm test:smoke
pnpm test:db
pnpm devManual smoke flow:
- Start backend against Prisma Postgres.
- Start frontend.
- Log in with Supabase auth.
- Load workspace.
- Open dashboard.
- Open content list.
- Open editor.
- Save a draft.
- Open calendar.
- Schedule a post.
Acceptance criteria
| Item | Target |
|---|---|
| Prisma Postgres DBs created | Dev, staging, benchmark |
| Runtime traffic uses pooled URL | Yes |
| CLI/admin traffic uses direct URL | Yes |
| Schema can be created from repo | Yes |
| Seed is repeatable | Yes |
| App boots against Prisma Postgres | Yes |
| Smoke tests pass | Yes |
| No production data migration required | Confirmed |