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 -yAseguré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 -vAhora 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 pm2Clonamos 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 --productionCrearemos 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 systemdEl 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/miappInserta 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