Cómo instalar Node.js en un VPS Ubuntu
Node.js es el entorno de ejecución más popular para aplicaciones web en tiempo real, APIs REST, bots, herramientas de automatización y aplicaciones Next.js o Express. Instalarlo en un VPS Ubuntu es el primer paso para desplegar cualquiera de estos proyectos con control total sobre el entorno.
En esta guía te explico la forma correcta de instalar Node.js en un VPS, cómo gestionar múltiples versiones con NVM, cómo mantener tu aplicación corriendo con PM2 y cómo exponerla con un dominio propio y SSL.
Por qué usar un VPS para Node.js
Node.js en hosting compartido tiene limitaciones importantes: no puedes ejecutar procesos persistentes, no tienes control sobre la versión de Node.js instalada y los timeouts del servidor web cortan las conexiones largas que muchas aplicaciones Node.js necesitan.
Un VPS elimina todas estas restricciones:
- Proceso Node.js persistente que no se mata entre peticiones
- Versión de Node.js exacta que necesitas
- Puertos personalizados para tu aplicación
- WebSockets y conexiones de larga duración sin timeout
- Control total sobre variables de entorno y configuración
Requisitos previos
Antes de empezar necesitas:
- Un VPS con Ubuntu 22.04 LTS o Ubuntu 24.04 LTS
- Acceso SSH con usuario root o con permisos sudo
- Un dominio apuntando a la IP del VPS (si quieres exponerlo con HTTPS)
Si acabas de contratar el VPS y es la primera vez que te conectas, el artículo sobre seguridad básica en VPS Linux cubre los primeros pasos recomendados antes de instalar nada: cambiar el puerto SSH, crear un usuario no root y configurar el firewall.
Conéctate al VPS por SSH:
bash
ssh root@IP_DE_TU_VPS
Método recomendado: instalar Node.js con NVM
NVM (Node Version Manager) es la forma más recomendada de instalar Node.js en un servidor. Las ventajas sobre otros métodos son claras:
- Puedes instalar y cambiar entre múltiples versiones de Node.js sin conflictos
- No necesitas sudo para instalar paquetes globales de npm
- Actualizar Node.js es tan sencillo como un comando
- Puedes tener proyectos diferentes usando versiones diferentes de Node.js
Paso 1: Actualiza el sistema
bash
apt update && apt upgrade -y
Paso 2: Instala las dependencias necesarias
bash
apt install -y curl git build-essential
Paso 3: Descarga e instala NVM
bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
Paso 4: Carga NVM en la sesión actual
bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
Para que NVM esté disponible en todas las sesiones futuras, estas líneas se añaden automáticamente al ~/.bashrc o ~/.zshrc durante la instalación. Verifica que están añadidas:
bash
cat ~/.bashrc | grep NVM
Paso 5: Verifica que NVM está instalado
bash
nvm --version
Deberías ver el número de versión de NVM (algo como 0.39.7).
Paso 6: Instala Node.js LTS
LTS significa Long Term Support — la versión con soporte garantizado a largo plazo. Es la opción recomendada para producción.
bash
nvm install --lts
Para instalar una versión específica:
bash
nvm install 20 # Node.js 20 LTS (Iron)
nvm install 22 # Node.js 22 LTS (Jod)
nvm install 18 # Node.js 18 LTS (Hydrogen)
Paso 7: Establece la versión por defecto
bash
nvm use --lts
nvm alias default node
Paso 8: Verifica la instalación
bash
node --version
npm --version
Deberías ver las versiones instaladas de Node.js y npm.
Método alternativo: instalar Node.js desde el repositorio oficial de NodeSource
Si prefieres gestionar Node.js como un paquete del sistema (con apt) en lugar de usar NVM, NodeSource mantiene repositorios oficiales para Ubuntu:
bash
# Para Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
bash
# Para Node.js 22 LTS
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
Este método es más sencillo pero menos flexible: cambiar de versión requiere repetir el proceso completo. Para producción con una sola versión, es perfectamente válido.
Gestionar versiones de Node.js con NVM
Una de las ventajas de NVM es poder tener varios proyectos con versiones diferentes:
bash
# Ver versiones instaladas
nvm ls
# Ver versiones disponibles para instalar
nvm ls-remote --lts
# Cambiar a una versión específica
nvm use 20
# Ver la versión activa
node --version
# Desinstalar una versión
nvm uninstall 18
Usar .nvmrc para fijar la versión por proyecto
Si tienes varios proyectos, puedes crear un archivo .nvmrc en la raíz de cada proyecto con la versión requerida:
bash
echo "20" > /var/www/miapp/.nvmrc
Al entrar al directorio, basta con ejecutar nvm use para cambiar automáticamente a la versión del proyecto.
Tu primera aplicación Node.js en el VPS
Crear la estructura del proyecto
bash
mkdir -p /var/www/miapp
cd /var/www/miapp
Inicializar el proyecto
bash
npm init -y
Crear el servidor básico
bash
nano index.js
Escribe este servidor Express básico:
javascript
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
mensaje: 'Servidor Node.js funcionando en VPS BlumHost',
fecha: new Date().toISOString(),
version: process.version
});
});
app.get('/salud', (req, res) => {
res.json({ estado: 'ok' });
});
app.listen(PORT, () => {
console.log(`Servidor escuchando en puerto ${PORT}`);
});
Guarda con Ctrl+X, Y, Enter.
Instalar Express
bash
npm install express
Probar la aplicación
bash
node index.js
Verás el mensaje Servidor escuchando en puerto 3000. Abre otra terminal y verifica que responde:
bash
curl http://localhost:3000
Detén el servidor con Ctrl+C. Esta forma de ejecutarlo no es adecuada para producción — para eso usaremos PM2.
PM2: mantén Node.js corriendo en producción
PM2 es el gestor de procesos estándar para Node.js en producción. Se encarga de:
- Mantener la aplicación corriendo aunque cierres la sesión SSH
- Reiniciarla automáticamente si el proceso muere o el servidor se reinicia
- Gestionar logs de la aplicación
- Permitir reinicios sin tiempo de inactividad (zero-downtime reload)
- Monitorizar el uso de CPU y RAM en tiempo real
Instalar PM2
bash
npm install -g pm2
Iniciar la aplicación con PM2
bash
cd /var/www/miapp
pm2 start index.js --name "miapp"
Comandos básicos de PM2
bash
pm2 list # Ver todas las aplicaciones
pm2 status # Estado detallado
pm2 logs miapp # Ver logs en tiempo real
pm2 logs miapp --lines 100 # Últimas 100 líneas de log
pm2 restart miapp # Reiniciar la aplicación
pm2 reload miapp # Reinicio sin downtime
pm2 stop miapp # Detener la aplicación
pm2 delete miapp # Eliminar de PM2
pm2 monit # Monitor en tiempo real (CPU/RAM)
Arranque automático al reiniciar el servidor
bash
pm2 startup
PM2 mostrará un comando que debes copiar y ejecutar (empieza por sudo env PATH=...). Ejecútalo.
Después guarda el estado actual de PM2:
bash
pm2 save
A partir de ahora, si el servidor se reinicia, PM2 arrancará automáticamente todas tus aplicaciones.
Gestionar múltiples aplicaciones con PM2
Si tienes varias aplicaciones Node.js en el mismo VPS:
bash
pm2 start /var/www/app1/index.js --name "app1" --port 3001
pm2 start /var/www/app2/index.js --name "app2" --port 3002
pm2 start /var/www/app3/index.js --name "app3" --port 3003
pm2 save
Archivo de configuración de PM2 (ecosystem.config.js)
Para proyectos más complejos, usa un archivo de configuración:
javascript
module.exports = {
apps: [{
name: 'miapp',
script: 'index.js',
cwd: '/var/www/miapp',
instances: 'max', // Un proceso por core de CPU
exec_mode: 'cluster', // Modo cluster para aprovechar múltiples cores
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: '/var/log/pm2/miapp-error.log',
out_file: '/var/log/pm2/miapp-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss'
}]
};
Inicia con:
bash
pm2 start ecosystem.config.js --env production
Exponer la aplicación con Nginx como proxy inverso
Tu aplicación Node.js escucha en el puerto 3000. Para acceder desde internet con un dominio y HTTPS, necesitas un proxy inverso. Nginx es la opción estándar — es el mismo servidor web que se usa para instalar WordPress en VPS.
Instalar Nginx
bash
apt install -y nginx
systemctl enable nginx
systemctl start nginx
Crear la configuración del sitio
bash
nano /etc/nginx/sites-available/miapp
nginx
server {
listen 80;
server_name tudominio.com www.tudominio.com;
# Logs
access_log /var/log/nginx/miapp-access.log;
error_log /var/log/nginx/miapp-error.log;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 86400; # Necesario para WebSockets
}
}
Activar el sitio
bash
ln -s /etc/nginx/sites-available/miapp /etc/nginx/sites-enabled/
nginx -t # Verificar que la configuración es correcta
systemctl reload nginx
Instalar SSL con Certbot (Let’s Encrypt)
bash
apt install -y certbot python3-certbot-nginx
certbot --nginx -d tudominio.com -d www.tudominio.com
Certbot detecta automáticamente la configuración de Nginx, instala el certificado SSL y configura la redirección HTTP → HTTPS. La renovación automática se configura como un servicio del sistema.
Verifica la renovación automática:
bash
certbot renew --dry-run
Configurar el firewall
Si no tienes firewall configurado, hazlo ahora:
bash
ufw allow OpenSSH
ufw allow 'Nginx Full' # Puertos 80 y 443
ufw enable
ufw status
No abras el puerto 3000 directamente al exterior — el tráfico debe pasar siempre por Nginx. Esto mejora la seguridad y permite gestionar múltiples aplicaciones desde el mismo servidor.
Para configuración avanzada de firewall en VPS, el artículo sobre iptables cubre todas las opciones disponibles.
Despliegue de actualizaciones
Cuando actualices el código de tu aplicación:
bash
cd /var/www/miapp
git pull origin main # Si usas Git
npm install # Instala nuevas dependencias
pm2 reload miapp # Reinicio sin downtime
Con pm2 reload en lugar de pm2 restart, PM2 inicia nuevos procesos con el código actualizado antes de detener los antiguos, garantizando cero tiempo de inactividad.
Variables de entorno en producción
Nunca hardcodees credenciales en el código. Usa un archivo .env:
bash
nano /var/www/miapp/.env
NODE_ENV=production
PORT=3000
DB_HOST=localhost
DB_USER=usuario
DB_PASS=contraseña_segura
API_KEY=tu_clave_api
Instala dotenv:
bash
npm install dotenv
En tu index.js:
javascript
require('dotenv').config();
const PORT = process.env.PORT || 3000;
const DB_HOST = process.env.DB_HOST;
Añade .env al .gitignore para no subir credenciales al repositorio:
bash
echo ".env" >> .gitignore
Monitorización y logs
Ver logs de la aplicación
bash
pm2 logs miapp # Tiempo real
pm2 logs miapp --lines 200 # Últimas 200 líneas
Ver logs de Nginx
bash
tail -f /var/log/nginx/miapp-access.log
tail -f /var/log/nginx/miapp-error.log
Monitor de recursos en tiempo real
bash
pm2 monit
Muestra CPU, RAM, número de peticiones y logs de todas las aplicaciones en una interfaz de terminal.
Para monitorización más avanzada del disco y recursos del servidor, el artículo sobre ver el estado de los discos en Linux cubre los comandos más útiles.
Casos de uso habituales de Node.js en VPS
API REST para aplicación móvil o SPA: Express o Fastify como backend, PM2 en modo cluster para aprovechar todos los cores del VPS.
Servidor de WebSockets: chat en tiempo real, notificaciones push, actualizaciones en vivo. Node.js + Socket.io con Nginx configurado para pasar el protocolo WebSocket.
Bot de Telegram o Discord: proceso persistente que mantiene la conexión con la API del servicio. PM2 garantiza que el bot se reinicia si cae. Parecido a lo que se explica en el artículo de OpenClaw con Telegram.
Next.js en producción: aplicaciones React con SSR. pm2 start npm --name "nextapp" -- start con el proxy Nginx apuntando al puerto de Next.js.
Herramientas de automatización con n8n: n8n está construido sobre Node.js. Si quieres instalarlo en tu VPS, el artículo sobre instalar n8n con Docker en VPS cubre el proceso completo.
Preguntas frecuentes
¿Qué versión de Node.js debo instalar para producción?
La versión LTS activa. En 2026, Node.js 20 LTS (Iron) y Node.js 22 LTS (Jod) son las opciones recomendadas. Evita versiones impares (21, 23) para producción — son versiones de desarrollo sin soporte a largo plazo.
¿Puedo usar Node.js en hosting compartido?
Con limitaciones. Algunos hostings permiten ejecutar scripts Node.js pero no procesos persistentes. Para aplicaciones reales que necesitan correr continuamente, un VPS es imprescindible.
¿Cuánta RAM necesita una aplicación Node.js?
Depende de la aplicación. Una API Express sencilla puede funcionar con 512 MB. Next.js en producción necesita al menos 1 GB. Para aplicaciones con tráfico medio-alto, 2-4 GB es lo recomendable. El VPS II de BlumHost con 4 GB de RAM es una buena base para la mayoría de proyectos.
¿NVM o NodeSource para producción?
Ambos son válidos. NVM es más flexible (múltiples versiones, sin sudo para paquetes globales). NodeSource es más sencillo si solo necesitas una versión y prefieres gestionar Node.js como un paquete del sistema con apt.
¿PM2 o Docker para desplegar Node.js?
PM2 es más sencillo para proyectos individuales. Docker añade aislamiento y reproducibilidad, ideal cuando tienes múltiples servicios o necesitas garantizar que el entorno de desarrollo y producción son idénticos. El artículo sobre instalar Docker en VPS Ubuntu cubre Docker en profundidad.
¿Cómo actualizo Node.js a una versión más nueva?
Con NVM: nvm install 22 && nvm alias default 22. Con NodeSource: repite el proceso de instalación con el nuevo script de setup. Recuerda probar que tu aplicación es compatible con la nueva versión antes de actualizarla en producción.
