- Node.js 20+
- Supabase Self-hosted (o Cloud) con Auth habilitado
- Prisma 7 con adapter-pg (conexión via
pg.Pool)
./dev.sh setup # 1. .env, npm install, prisma generate
# Editar backend/.env con Supabase (SUPABASE_*, DATABASE_URL, DIRECT_URL)
./dev.sh db:push # 2. Aplicar schema
./dev.sh setup-dev # 3. Auth user demo + seed + RLS
./dev.sh start # 4. Iniciar backendCredenciales demo: demo@finward.dev / DemoFinward123!
# Desde raíz de finward
./dev.sh setupEsto:
- Crea
backend/.envdesde.env.example(si no existe) - Instala dependencias (
npm install) - Genera cliente Prisma (
npx prisma generate)
Edita backend/.env:
| Variable | Descripción | Ejemplo (mi setup) |
|---|---|---|
| SUPABASE_URL | SUPABASE_PUBLIC_URL del self-hosted | https://xxx.supabase.co |
| SUPABASE_ANON_KEY | ANON_KEY | eyJ... |
| SUPABASE_SERVICE_ROLE_KEY | SERVICE_ROLE_KEY | eyJ... |
| DATABASE_URL | Dominio público (producción) | postgresql://postgres:[PASS]@supabase.example.com:5433/postgres |
| DIRECT_URL | IP Tailscale para migraciones/seed/local | postgresql://postgres:[PASS]@192.168.100.109:5433/postgres |
| USE_DIRECT_URL | Si el dominio no resuelve en local: true para usar DIRECT_URL en la app |
true (opcional) |
| SEED_USER_ID | Solo para db:seed manual; setup-dev no lo usa |
00000000-0000-0000-0000-... |
./dev.sh db:pushUsa DIRECT_URL internamente (Tailscale conectado).
./dev.sh setup-devCrea usuario demo@finward.dev en Supabase Auth, ejecuta seed y aplica RLS. Todo listo para el frontend.
./dev.sh startBackend: http://localhost:4000
API: http://localhost:4000/api
Swagger: http://localhost:4000/api-docs
cd frontend && npm run devFrontend: http://localhost:3000 (proxy /api → backend:4000)
Inicia sesión con demo@finward.dev / DemoFinward123!.
| Comando | Descripción |
|---|---|
./dev.sh setup |
Primera vez: .env, npm install, prisma generate |
./dev.sh setup-dev |
Auth user demo + seed + RLS (demo listo) |
./dev.sh start |
Inicia backend con hot reload |
./dev.sh db:push |
Aplica schema a Supabase |
./dev.sh db:seed |
Solo seed (requiere SEED_USER_ID) |
./dev.sh rls |
Aplica RLS vía psql (o instrucciones) |
./dev.sh studio |
Abre Prisma Studio |
./dev.sh start # Iniciar backend
# ... desarrollar ...
# Ctrl+C para detenerPara cambios de schema:
./dev.sh db:push # Aplicar cambios
./dev.sh rls # Si añadiste tablas, actualizar rls-policies.sql y ejecutarSi el id de Supabase Auth difiere del id en User (ej. proyecto recreado, migración), GET /api/profile detecta el usuario por email y sincroniza automáticamente: migra categorías, cuentas, transacciones, etc. al nuevo id. Evita 500 en rutas protegidas.
Los errores conocidos se convierten en HTTP:
- P2002 (unique constraint) → 409 Conflict
- P2003 (foreign key) → 400 Bad Request
- P2025 (record not found) → 404 Not Found
El cliente Prisma no está generado. Solución:
# Desde raíz
./dev.sh generate
# O desde backend/
npx prisma generateEste paso se ejecuta automáticamente con ./dev.sh setup o con prisma db push. Si saltaste el setup y ejecutaste solo npm install + npm run dev, regenera el cliente.