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.

Miguel Taboada

Ingeniero en Telecomunicaciones e Informática. Creé BlumHost para ofrecer un hosting distinto a los demás, que ofrezca la mejor atención al cliente, al menor precio y con la mejor calidad.

Ver todas las entradas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *