Documentación de Mentat — en evolución continua.
OperaciónDeploy a producción

Deploy a producción

⚠️

Producción es la fuente de verdad. Verificá el estado real con gcloud / firebase antes y después de deployar. En Windows hay gotchas conocidos — están todos acá.

Pre-deploy (checklist)

  • pnpm --filter @mentat/web lint antes de buildear (el next build lintea; tsc/dev no). Imports sin usar rompen el build.
  • No buildear con el dev server o el emulador corriendo (corrompe .next).
  • pnpm -r typecheck y los tests en verde.

Functions

# 1. Rebuildeá el bundle A MANO (el predeploy con --filter no matchea en Windows)
pnpm --filter @mentat/functions build
 
# 2. Deploy con discovery timeout extendido
FUNCTIONS_DISCOVERY_TIMEOUT=120 firebase deploy \
  --only functions --project dawoork-mentat
⚠️

Gotchas de functions en Windows:

  • El predeploy pnpm --filter @mentat/functions build imprime “No projects matched the filters” y no rebuildea → por eso se rebuildea a mano antes.
  • Si el deploy falla a mitad, el strip-package-for-deploy.mjs dejó el package.json minimizado → restaurá con node apps/functions/scripts/strip-package-for-deploy.mjs restore.
  • El runtime nodejs20 está deprecado (decommission 2026-10-30) → habrá que subir a Node 22.

Variables de entorno de functions

Las vars no reservadas (ej. MENTAT_FROM_EMAIL) van en apps/functions/.env (gitignored). firebase deploy las lee y las aplica a la función. Las reservadas (FIREBASE_*, X_GOOGLE_*, EVENTARC_*) no se setean ahí. Los secretos (RESEND_API_KEY, APP_IP_SALT_V1) viven en Secret Manager.

Hosting (la app)

# Mover el .env.local aparte (si existe), limpiar y buildear a mano
mv apps/web/.env.local apps/web/.env.local.bak
rm -rf apps/web/.next apps/web/out
pnpm --filter @mentat/web build         # verificá .env.production con USE_FIREBASE_EMULATORS=false
firebase deploy --only hosting --project dawoork-mentat
mv apps/web/.env.local.bak apps/web/.env.local   # restaurar
⚠️

En Windows el predeploy de hosting tampoco matchea el filtro y puede subir un out/ viejo (incluso uno buildeado con USE_EMULATORS=true). Por eso se buildea a mano sin .env.local. El deploy por GitHub Actions no sufre esto (usa secrets).

Rules e índices

firebase deploy --only firestore:rules,firestore:indexes,storage --project dawoork-mentat

Post-deploy (verificar)

Functions

gcloud functions list --project dawoork-mentat → confirmá que están ACTIVE y que el conteo matchea los exports de apps/functions/src/index.ts.

Rules

Compará la lógica desplegada con el repo (API firebaserules, requiere el header X-Goog-User-Project).

Hosting

curl -I https://dawoork-mentat.web.app/login → HTTP 200.

Smoke

Una operación real de punta a punta (ej. scripts/pilot/prod-smoke.mjs).

Cada fase se selló con “deploy verificado”: functions:list + rules byte-idénticas

  • hosting 200 + un smoke. Mantené esa barra.