La pila MERN es un stack de servidor web muy común en desaarrollo web moderno, consiste en MongoDB + EXpress.js + React.js + Node.js vamos a ver como hacer un despliegue de servidor con este stack.
La pila MERN es un marco de desarrollo web que consta de MongoDB, Express, React.js y Node.js. Es una de varias variantes de la pila MEAN.
Cuando usas la pila MERN, trabajas con React para implementar la capa de presentación, Express y Node.js para formar la capa intermedia o de aplicación, y MongoDB para crear la capa de base de datos.
En este tutorial de la pila MERN, utilizaremos estas cuatro tecnologías para desarrollar una aplicación básica capaz de registrar la información de los empleados y mostrarla usando el frontend React.
¿Qué es realmente cada componente?
MongoDB: Base de datos NoSQL, scucha en el puerto 27017 por defecto.
Express: Es un framework minimalista de Node.js que gestiona las peticiones HTTP. Piénsalo como el "Apache/Nginx" pero a nivel de aplicación JavaScript. Express crea un servidor HTTP que escucha en un puerto (ej: 3000, 5000).
React (con Vite): Es el frontend. Vite es una herramienta de build que:
En desarrollo: Levanta un servidor de desarrollo (puerto 5173 por defecto)
En producción: Genera archivos estáticos HTML/CSS/JS que necesitas servir
Node.js: El runtime de JavaScript en el servidor. Es como tener PHP instalado, pero para JavaScript.
Arquitectura de despliegue típica
Cloudflare no esta optimizado para servir archivos estáticos del frontend por lo que la opción más viable en estos casos es usar: Nginx + Cloudflare Tunnel más recomendado para producción:
Nginx sirve el frontend (archivos estáticos)
Nginx hace proxy al backend (Express API)
Cloudflare Tunnel apunta a Nginx
Ventajas de esta configuración:
Frontend y Backend en el mismo dominio (sin problemas CORS)
Nginx optimizado para servir archivos estáticos
Node.js solo maneja la lógica de API
MongoDB protegida (solo acceso local)
PM2 mantiene Node.js vivo y con autoarranque
Cloudflare proporciona SSL y seguridad adicional
Diagrama de flujo de datos
Para esta implementación usaremos un proyecto guiado de listado y uso de tareas que seguirá este diagrama de flujo:
Vamos a ver como implementarlo esto paso a paso:
Guia de despliegue
Para el entorno usaremos una máquina virtual ubuntu desktop 22.04 con visualcode instalado.
1. Instalación de Componentes Base
Actualizar el sistema
Instalar Node.js (v20 LTS recomendado)
Instalar MongoDB
Instalar Nginx
Instalar PM2
Este paquete se instala globalmente y nos va a servir para mantener Node.js ejecutándose:
2. Estructura de Directorios Recomendada
Crear estructura:
3. Configuración de MongoDB
Para mongoDB puedes hacerlo por terminal o usar aplicaciones gráficas como compass, crearemos un usuario admin y otro para la aplicación.
Puedes ver los usuarios con:
Podemos además, habilitar autenticación (opcional pero recomendado)
Para el testeo puedes probar con:
4. Despliegue de aplicación
Para el despliegue de la aplicación vamos a hacer uso de una app de ejemplo que he creado, tienes la explicación de la app en el siguiente enlace, además esta subida a Github para su despliegue óptimo:
Backend
Vamos ahora sí, con la instalación de dependencias:
Vamos a copiar el contenido de las variables de entorno:
Ahora iniciamos el proyecto con PM2
Aquí te dirá algo como:
Simplemente ejecuta ese comando. Ahora, para verificar el estado puedes:
Y puedes probar con:
Frontend
Ahora vamos a construir el frontend:
Elegimos el entorno de desarrollo para las variables:
Ahora descomenta el que quieras usar, te recomiendo tirar directamente al de producción.
Construimos ahora sí la app:
Y vamos a dar los permisos necesarios:
App frontend testing
Si quieres probar el frontend por separado puedes probar en entorno de test:
.env:
Ejecutar:
Acceso: http://localhost:5173
5. Configuración de Nginx
Creamos la configuración del sitio con un virtualhost:
Cuyo contenido sea:
Y activamos el sitio pasandolo a sites-enabled con un enlace simbólico:
Para verificar, tan sencillo como:
Aqui me he quedado!!!!!
EXTRAS OPCIONALES
1- Configuración de Cloudflare Tunnel
Este paso es opcional si lo que se quiere es funcionar en testing, si se quiere usar un dominio entonces optaremos con esto aconectarlo directamente a nginx:
Ahora quédate con el UUID que te ha dado (el que estan en el .json creado) y crea un archivo nuevo:
Contenido de config.yml:
Ejecutar túnel:
Comprobamos:
2- Flujo de Actualización
Como la aplicación no tiene por que ser estática, aquí va un flujo de actualización para seguir los estándares de CI/CD:
1. Actualizar Backend
2. Actualizar Frontend
RESUMEN: Comandos Útiles para Gestión
Tienes algunos Logs útiles que te pueden servir para debugging:
mongosh
# Dentro de mongosh:
use admin
db.createUser({
user: "admindb",
pwd: "Passw0rd",
roles: ["root"]
})
use mi_aplicacion
db.createUser({
user: "app_user",
pwd: "Passw0rdApp",
roles: [{role: "readWrite", db: "mi_aplicacion"}]
})
exit
mongosh -u admindb -p P@ssw0rd --authenticationDatabase admin
# Ver bases de datos
show dbs
# Cambiar a admin para ver todos los usuarios
use admin
db.getUsers()
# Ver usuarios de tu app específica
use mi_aplicacion
db.getUsers()
# Salir
exit
# Cloudflare Tunnel
sudo systemctl status cloudflared # Si lo configuraste como servicio
cd /var/www/mi-app-mern/backend
git pull # o subir archivos nuevos
npm install # si hay nuevas dependencias
pm2 restart backend-api
cd /var/www/mi-app-mern/frontend
npm run build
# Los archivos ya están en dist/, Nginx los servirá automáticamente
# PM2
pm2 list # Ver procesos
pm2 restart backend-api # Reiniciar aplicación
pm2 logs backend-api # Ver logs en tiempo real
pm2 monit # Monitor de recursos
# Nginx
sudo nginx -t # Verificar configuración
sudo systemctl reload nginx # Recargar configuración
sudo systemctl restart nginx # Reiniciar servicio
# MongoDB
mongosh # Conectar a MongoDB
sudo systemctl restart mongod
# Desarrollo frontend
npm run dev # Iniciar servidor de desarrollo
npm run build # Construir para producción
npm run preview # Preview del build de producción
# Gestión de dependencias
npm install # Instalar todas las dependencias
npm update # Actualizar dependencias
npm list # Ver dependencias instaladas
# Limpieza
rm -rf node_modules dist # Limpiar todo
npm install # Reinstalar
# Sistema
sudo netstat -tlnp # Ver puertos en uso
htop # Monitor de recursos