Sitio corporativo y plataforma base para captacion de leads de Entire Base.
Incluye:
- Frontend en Nuxt 4 para las paginas publicas.
- Backend en Node.js + Express para recibir formularios de contacto.
- Persistencia en MongoDB.
- Notificaciones por email usando Resend.
entire-base/
backend/ # API Express (contacto, health, validaciones)
frontend/ # Web principal en Nuxt 4
frontend-spa-backup/ # Version SPA anterior (respaldo)
- Nuxt 4
- Vue 3
- Tailwind CSS v4
- Node.js
- Express 5
- MongoDB (Mongoose)
- Zod (validacion)
- Resend (email)
- Pino (logging)
- Node.js 20+
- npm 10+
- MongoDB accesible (local o remoto)
- Cuenta/API Key de Resend para notificaciones
Instala dependencias por separado en frontend y backend:
cd backend
npm install
cd ../frontend
npm installEl backend requiere estas variables para iniciar. Crea backend/.env tomando como referencia backend/.env.example:
PORT=4000
NODE_ENV=development
# URL del frontend permitido por CORS
FRONTEND_URL=http://localhost:3000
# MongoDB
MONGODB_URI=mongodb+srv://<user>:<password>@<cluster>.mongodb.net/<dbname>?retryWrites=true&w=majority
# Resend
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxx
NOTIFICATION_EMAIL=tu-correo@dominio.com
FROM_EMAIL=onboarding@resend.devCrea frontend/.env tomando como referencia frontend/.env.example:
NUXT_PUBLIC_API_URL=http://localhost:4000Notas:
- Si falta cualquiera de las variables obligatorias, el backend no arranca.
FRONTEND_URLdebe coincidir con el origen real desde donde corre Nuxt.
Abre dos terminales.
cd backend
npm run devBackend por defecto en:
http://localhost:4000
cd frontend
npm run devFrontend por defecto en:
http://localhost:3000
npm run dev: inicia con nodemon.npm start: inicia en modo normal.
npm run dev: servidor de desarrollo Nuxt.npm run build: build de produccion.npm run preview: previsualiza el build.npm run generate: genera version estatica.
GET /api/health
Respuesta esperada:
{
"ok": true,
"message": "Backend de Entire Adviser funcionando correctamente"
}POST /api/contact
Body JSON:
{
"name": "Juan Perez",
"email": "juan@empresa.com",
"company": "Empresa SL",
"message": "Hola, me interesa una propuesta para redisenar nuestra web corporativa."
}Respuesta exitosa (201):
{
"ok": true,
"message": "Mensaje recibido. Nos pondremos en contacto contigo en la mayor brevedad posible.",
"data": {
"id": "...",
"name": "Juan Perez",
"email": "juan@empresa.com",
"company": "Empresa SL",
"message": "Hola, me interesa una propuesta para redisenar nuestra web corporativa.",
"createdAt": "2026-03-21T12:34:56.000Z"
}
}Respuesta de error (ejemplo):
{
"ok": false,
"message": "Debes introducir un email valido."
}name: minimo 2, maximo 100 caracteres.email: formato valido, maximo 150 caracteres.company: opcional, maximo 150 caracteres.message: minimo 10, maximo 2000 caracteres.
El endpoint de contacto limita las solicitudes a:
- 5 requests por IP cada 15 minutos.
Si se supera el limite, devuelve un error con ok: false.
- El usuario envia el formulario desde la pagina
/contact. - El backend valida el payload con Zod.
- Se guarda el lead en MongoDB.
- Se intenta enviar email de notificacion via Resend.
- El API responde
201aunque falle el envio de email (el lead ya queda guardado).
El proyecto esta configurado para desplegarse en Vercel con el backend y el frontend como proyectos independientes.
- Importa el repo en Vercel y establece el Root Directory en
backend. - Configura las variables de entorno del backend en el panel de Vercel.
- Vercel usara
vercel.jsonyapi/index.jscomo punto de entrada.
- Importa el mismo repo y establece el Root Directory en
frontend. - Configura
NUXT_PUBLIC_API_URLapuntando a la URL del backend desplegado.
- En Network Access permite
0.0.0.0/0para que Vercel pueda conectar (IPs dinamicas). - Usa un cluster activo; el plan gratuito M0 se pausa tras 60 dias sin actividad.
Importante:
- Actualmente la pagina de contacto usa una URL fija para el backend:
http://localhost:4000/api/contact. - Para despliegue, actualiza esa URL o migra a una configuracion por entorno/runtime.
La carpeta frontend-spa-backup/ contiene una version anterior en Vue + Vite.
No es la version principal activa, pero se conserva como referencia.