¿Por qué desplegar Node.js en un VPS en lugar de en una plataforma gestionada?
Las plataformas serverless y PaaS resultan prácticas al principio, pero su coste sube con el tráfico e imponen restricciones (timeouts, cold starts, límites de conexiones WebSocket). Un VPS le da un proceso Node.js persistente, conexiones largas (WebSocket, SSE) sin límite artificial, recursos dedicados y un coste fijo previsible. Usted decide la versión de Node, el gestor de procesos, el reverse proxy y la estrategia de actualización, sin depender de las convenciones de un proveedor.
Lo que gana con un VPS para Node.js
- Proceso Node.js persistente, ideal para WebSocket, SSE y tareas largas sin cold start
- Reinicio automático en caso de caída y al reiniciar el servidor gracias a PM2
- Modo cluster para aprovechar todos los núcleos de CPU del VPS sin cambiar su código
- Reverse proxy Nginx delante de Node para el HTTPS, la compresión y los archivos estáticos
- Coste fijo y previsible, sin facturación por petición ni sorpresas de escalado
- Control total de la versión de Node.js y de las dependencias del sistema
Requisitos previos
Una aplicación Node.js estándar (API Express, Nest, Fastify) funciona con holgura en un VPS de 1 a 2 vCPU y de 1 a 2 GB de RAM; prevea más RAM si compila un front pesado en el build o ejecuta workers. Instale Node.js mediante nvm o el repositorio NodeSource para fijar una versión LTS, además de PM2 como gestor de procesos y Nginx como reverse proxy. Necesita un dominio que apunte a la IP del VPS y los puertos 80/443 abiertos.
Desplegar una aplicación Node.js en producción
Preparar el VPS e instalar Node.js
En un VPS Ubuntu 22.04, actualice el sistema e instale una versión LTS de Node mediante nvm (
nvm install --lts) o el repositorio NodeSource. Compruebe:node -vynpm -v. Cree un usuario sin privilegios de root dedicado a la aplicación en lugar de ejecutarlo todo como root.Recuperar el código y compilar
Clone su repositorio en el VPS, instale las dependencias de producción (
npm ci --omit=dev) y lance el build si es necesario (npm run build). Coloque las variables sensibles en un archivo.envno versionado o en las variables de entorno del servicio.Lanzar la aplicación con PM2
Instale PM2 de forma global (
npm install -g pm2) y arranque después la aplicación:pm2 start app.js --name monapp -i max. El flag-i maxactiva el modo cluster en todos los núcleos. PM2 relanza automáticamente el proceso si se cae.Activar el arranque automático con el sistema
Genere el script systemd con
pm2 startup, ejecute el comando que aparece y fije después el estado actual conpm2 save. En el siguiente reinicio del VPS, su aplicación se relanzará automáticamente, sin intervención.Configurar Nginx como reverse proxy
Instale Nginx y cree un virtual host para su dominio que haga de proxy hacia el puerto local de Node (ej.:
proxy_pass http://localhost:3000;). Añada las cabecerasUpgradeyConnectionsi utiliza WebSocket. Pruebe la configuración (nginx -t) y recárguela.Asegurar en HTTPS con Let's Encrypt
Instale Certbot y su plugin de Nginx y ejecute después
certbot --nginx -d votredomaine.com. Certbot obtiene el certificado, configura la redirección HTTP→HTTPS y programa la renovación automática. Su aplicación Node se sirve ya en HTTPS.
Para despliegues sin interrupción, combine PM2 en modo cluster con pm2 reload monapp en lugar de restart: PM2 reinicia los workers uno a uno y mantiene siempre al menos una instancia disponible durante la actualización. Vigile después la memoria con pm2 monit y fije un límite de reinicio automático (--max-memory-restart 500M) para prevenir las fugas de memoria en producción.