Despliegue de aplicación JavaScript en VPS: guía avanzada paso a paso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: del servidor local a una solución lista para producción

Has creado una potente aplicación JavaScript en Node.js, la has probado localmente, y ahora ha llegado el momento de mostrarla al mundo. Simplemente subir los archivos a un VPS y ejecutar node app.js es el camino de un principiante. A nivel avanzado, el despliegue incluye la configuración de un proxy inverso, un gestor de procesos, la renovación automática de certificados SSL, un sistema de integración y entrega continua (CI/CD), así como un monitoreo y registro de logs adecuados.

En este artículo, analizaremos el proceso paso a paso para desplegar una aplicación Node.js en un VPS (Ubuntu 22.04) a nivel avanzado. Configuraremos Nginx como proxy inverso, PM2 para la gestión del proceso, Let's Encrypt para HTTPS, GitHub Actions para el despliegue automático al hacer push al repositorio, y añadiremos monitoreo básico.



Requisitos previos

  • Servidor VPS (Ubuntu 22.04) con acceso por SSH.
  • Dominio vinculado a la IP de tu servidor (por ejemplo, miapp.ejemplo.com).
  • Node.js (v18+) y npm instalados en el servidor.
  • Git instalado en el servidor.
  • Repositorio de tu aplicación en GitHub.


1. Configuración del servidor y del gestor de procesos PM2

Empezaremos con la preparación básica del entorno. Después de conectarte al servidor por SSH, actualizamos los paquetes e instalamos las utilidades necesarias:

sudo apt update && sudo apt upgrade -ysudo apt install nginx git curl -y

Asegurémonos de que Node.js esté instalado. Si no es así, lo instalamos a través de NodeSource:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -sudo apt install -y nodejsnode -vnpm -v

Ahora instalamos globalmente PM2, un gestor de procesos avanzado para Node.js que reinicia automáticamente la aplicación si falla, gestiona los logs y la agrupación en clústeres:

sudo npm install -g pm2

Clonamos el repositorio de tu aplicación e instalamos las dependencias:

git clone https://github.com/tu-usuario/tu-repositorio.git /var/www/miappcd /var/www/miappnpm install --production

Crearemos un archivo de ecosistema de PM2 (ecosystem.config.js) para una configuración detallada:

// ecosystem.config.jsmodule.exports = {  apps: [{    name: 'miapp',    script: 'app.js', // o server.js    instances: 'max', // usamos todos los núcleos de la CPU    exec_mode: 'cluster',    env: {      NODE_ENV: 'production',      PORT: 3000    },    error_file: '/var/log/node-app/err.log',    out_file: '/var/log/node-app/out.log',    log_date_format: 'YYYY-MM-DD HH:mm Z'  }]};

Crearemos el directorio para los logs e iniciaremos la aplicación con PM2:

sudo mkdir -p /var/log/node-appsudo chown -R $USER:$USER /var/log/node-apppm2 start ecosystem.config.jspm2 savepm2 startup systemd

El comando pm2 startup creará un servicio systemd que iniciará PM2 al arrancar el sistema. Ahora tu aplicación se ejecuta en el puerto 3000, pero el acceso directo a ella no es seguro. Pasemos a la configuración de Nginx.



2. Configuración de Nginx como proxy inverso y SSL con Let's Encrypt

Nginx recibirá las solicitudes entrantes en los puertos 80 (HTTP) y 443 (HTTPS), las redirigirá a tu proceso Node.js que se ejecuta en el puerto 3000, y también servirá archivos estáticos directamente, lo que reduce la carga en Node.js.

Crearemos un archivo de configuración para nuestro dominio:

sudo nano /etc/nginx/sites-available/miapp

Inserta la siguiente configuración (reemplaza miapp.ejemplo.com con tu dominio):

server {    listen 80;    server_name miapp.ejemplo.com;    return 301 https://$server_name$request_uri; # redirección a HTTPS}

server { listen 443 ssl http2; server_name miapp.ejemplo.com;

# SSL ser

Blogs

Book Recommendations