Arrancar a trabajar
Esta página es la de cada día. Da por hecho que la máquina ya está provisionada: si es la primera vez, primero va Entorno local, que instala Postgres, crea las bases y los roles, y deja los servicios corriendo.
1 · Los servicios que no se arrancan a mano
Sección titulada «1 · Los servicios que no se arrancan a mano»Postgres y Mailpit están instalados como servicios de brew y arrancan solos
con la máquina. No hay que hacer nada — pero sí conviene mirarlos cuando algo
raro pasa:
brew services listLo que tiene que decir:
| Servicio | Estado esperado |
|---|---|
postgresql@17 |
started |
mailpit |
started |
Si Postgres está caído:
brew services start postgresql@172 · ¿Hay migraciones nuevas?
Sección titulada «2 · ¿Hay migraciones nuevas?»Este es el paso que más se olvida, y el que produce los errores más confusos: el código pide columnas que la base todavía no tiene, y lo que se ve es un 500 que no dice por qué.
Después de cualquier git pull que traiga migraciones:
cd api && pnpm db:migrateEl migrador anuncia a qué base y a qué schema apunta antes de tocarlos. Leé esa línea siempre:
→ migrando aquazaku@localhost/aquazaku_dev → schema "public"✓ migraciones aplicadas3 · Levantar la api
Sección titulada «3 · Levantar la api»pnpm --dir api devCorre con tsx watch: se reinicia sola al guardar. Queda en el 3001.
4 · Levantar el front
Sección titulada «4 · Levantar el front»En otra terminal —los dos servidores quedan en primer plano—:
pnpm --dir web devQueda en el 3000.
5 · Comprobar que quedó bien
Sección titulada «5 · Comprobar que quedó bien»Tres comprobaciones, en orden. Si una falla, las de abajo no importan.
curl -s localhost:3001/health{"status":"ok","service":"aquazaku-api","base":"ok","desdeHaceMs":377602}Lo que hay que mirar:
| Campo | Qué significa |
|---|---|
"base":"ok" |
La api habla con Postgres |
"base":"arrancando" |
Todavía no hubo primer contacto. Esperá unos segundos |
"base":"sin-contacto" |
Perdió la base. Mirá brew services list |
faltan: [...] |
Hay migraciones sin aplicar. Volvé al paso 2 |
El campo faltan solo aparece cuando algo está pendiente. Si no está, el
schema está al día.
Después:
curl -s -o /dev/null -w '%{http_code}\n' localhost:3000/loginUn 200 quiere decir que el front levantó y que pudo hablar con la api —
la pantalla de login se arma del lado del servidor.
6 · Entrar
Sección titulada «6 · Entrar»En localhost:3000, con un usuario de aquazaku_dev.
Las otras dos cosas que a veces hacen falta
Sección titulada «Las otras dos cosas que a veces hacen falta»La documentación
Sección titulada «La documentación»pnpm --dir docs devQueda en el 4321. Solo hace falta cuando se escribe documentación — no es parte del arranque normal.
La colección de Bruno
Sección titulada «La colección de Bruno»Corre en CI en cada push, y a veces conviene correrla en local antes. Necesita dos condiciones que la base de desarrollo no cumple: estar vacía y tener un solo administrador. Por eso va contra la base de tests, en el 3002.
Está explicado en la propia colección (bruno/aquazaku/collection.bru) y hay
una configuración api-pruebas en .claude/launch.json que la levanta apuntada
a aquazaku_test.
Puertos: quién es quién
Sección titulada «Puertos: quién es quién»| Puerto | Qué |
|---|---|
| 3000 | web |
| 3001 | api |
| 3002 | api contra la base de tests, solo para Bruno |
| 4321 | docs |
| 5432 | Postgres |
| 1025 | Mailpit, SMTP |
| 8025 | Mailpit, la bandeja para leer |
Para ver qué está ocupando uno:
lsof -nP -iTCP:3000 -sTCP:LISTENLiberar un puerto colgado y el resto de la gestión de servicios están en Entorno local.
Cuando algo no arranca
Sección titulada «Cuando algo no arranca»| Síntoma | Causa más probable |
|---|---|
ECONNREFUSED :5432 |
Postgres caído → brew services start postgresql@17 |
/health dice faltan: [...] |
Migraciones sin aplicar → paso 2 |
| Los tests fallan por columnas que no existen | Falta pnpm db:migrate:test |
Another next dev server is already running |
Ya está levantado. Usá ese |
| La pantalla de login no carga | La api está caída: el front la consulta del lado del servidor |
| El correo de recuperación «no llega» | Llegó a Mailpit, no a internet → localhost:8025 |
| Un 500 en todas las pantallas | Casi siempre el schema desactualizado. Mirá /health |
