Introducción: por qué VPS es la mejor opción para producción
Desarrollar una aplicación JavaScript en Node.js es solo la mitad del trabajo. La segunda parte, igualmente importante, es el deploy en un servidor de producción. Muchos desarrolladores principiantes usan hosting gratuitos (Heroku, Render, Vercel), pero para proyectos serios, tarde o temprano necesitarás un VPS (Virtual Private Server).
VPS te da control total sobre el entorno: tú mismo eliges la versión de Node.js, configuras el servidor web, gestionas procesos y recursos. En este artículo, analizaremos el proceso paso a paso para hacer deploy de una aplicación JavaScript en un VPS usando herramientas modernas: Nginx como reverse proxy, PM2 para la gestión de procesos, Let's Encrypt para SSL y GitHub Actions para automatización.
Paso 1: Preparación del servidor e instalación del software necesario
El primer paso es conectarte a tu VPS (generalmente por SSH) e instalar el conjunto básico de herramientas. Supongamos que usas Ubuntu 22.04 LTS.
# Actualizamos paquetessudo apt update && sudo apt upgrade -y
# Instalamos Node.js (recomendado a través de NodeSource)curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -sudo apt install -y nodejs
# Verificamos versionesnode -vnpm -v
# Instalamos Git (si aún no está instalado)sudo apt install git -y
# Instalamos Nginxsudo apt install nginx -yTambién es obligatorio configurar el firewall básico (UFW):
sudo ufw allow OpenSSHsudo ufw allow 'Nginx Full'sudo ufw enablePaso 2: Clonar el repositorio y configurar la aplicación
Ahora necesitas transferir el código de la aplicación al servidor. La forma más sencilla es clonar el repositorio desde GitHub/GitLab.
# Vamos al directorio /var/www (estándar para proyectos web)cd /var/www
# Clonamos el repositorio (reemplaza con tu URL)sudo git clone https://github.com/tu-usuario/tu-repositorio.git myapp
# Damos permisos al usuario actualsudo chown -R $USER:$USER /var/www/myapp
# Vamos a la carpeta de la aplicacióncd /var/www/myapp
# Instalamos dependenciasnpm install --productionCrea un archivo .env para las variables de entorno (puerto, claves API, cadena de conexión a la BD):
# Ejemplo .envPORT=3000NODE_ENV=productionDATABASE_URL=mongodb://localhost:27017/myappJWT_SECRET=tu-clave-secretaPaso 3: Configurar PM2 para gestionar el proceso
PM2 es un gestor de procesos para Node.js que reinicia automáticamente la aplicación si falla y la mantiene funcionando en segundo plano.
# Instalamos PM2 globalmentesudo npm install -g pm2
# Iniciamos la aplicación (si el entry point es app.js o server.js)pm2 start app.js --name "myapp"
# Guardamos la lista de procesos para inicio automático al reiniciarpm2 savepm2 startup systemdDespués de ejecutar pm2 startup, verás un comando que debes ejecutar con permisos de root. Cópialo y ejecútalo.
Puedes verificar el estado con el comando pm2 status. Si la aplicación está en ejecución, estará disponible en http://tu-ip:3000 (puerto del .env).
Paso 4: Configurar Nginx como reverse proxy
El acceso directo a Node.js a través del puerto 3000 no es una buena práctica. Es mejor usar Nginx como servidor proxy, que recibirá las solicitudes en el puerto 80 (HTTP) y las redirigirá a tu aplicación.
Crea un archivo de configuración para tu dominio (o IP):
sudo nano /etc/nginx/sites-available/myappPega el siguiente código:
server { listen 80; server_name tu-dominio.ru www.tu-dominio.ru;
location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connectio