Cómo instalar y desplegar un proyecto Next.js en un servidor Ubuntu

Desplegar una aplicación Next.js en un servidor Ubuntu puede parecer complejo, pero con los comandos adecuados es un proceso rápido y estable.


En esta guía te explico paso a paso cómo configurar tu servidor, instalar Node.js, preparar NGINX como proxy inverso y ejecutar tu aplicación con PM2 para mantenerla siempre online.

Requisito recomendado: un servidor Ubuntu con al menos 2 GB de RAM, especialmente para ejecutar npm run build.

🔧 Actualizar el servidor

sudo apt update
sudo apt upgrade

🌐 Instalar NGINX y Certbot

sudo apt install nginx certbot python3-certbot-nginx

🔥 Configurar el firewall (UFW)

sudo ufw allow "Nginx Full"
sudo ufw allow OpenSSH
sudo ufw enable

📦 Instalar NPM y Node.js

Opción 1: Instalar Node.js con nvm (recomendada)

apt install npm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
exec $SHELL
nvm install --lts
nvm install 20
nvm use 20
nvm alias default 20

Opción 2: Instalar Node.js desde NodeSource

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

⚙️ Instalar PM2 (para ejecutar la app en segundo plano)

npm install -g pm2
pm2 status

🔑 (Opcional) Configurar claves SSH para clonar repos desde GitHub

cd /root/.ssh
ssh-keygen -t rsa -b 4096 -C "email@ejemplo.com"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub

Añade la clave pública a GitHub en Settings → SSH and GPG Keys.

📁 Crear o clonar tu proyecto Next.js en /var/www

cd /var/www

Opción 1: Crear un proyecto nuevo

npx create-next-app@latest nombre_app

Opción 2: Clonar un repositorio

git clone git@github.com:usuario/repositorio.git
# o con branch específico:
git clone -b main git@github.com:usuario/repositorio.git nombre_local

📦 Instalar dependencias y compilar el proyecto

cd nombre_app
npm i
npm run build

🌐 Configurar NGINX como proxy inverso

  1. Crear archivo de configuración:
cd /etc/nginx/sites-available
sudo nano nombre_app
  1. Añadir configuración del server block (plantilla de referencia):
server {
        listen 80;
        server_name domainname.com www.domainname.com; #if no domain you can use server ip until then

        gzip on;
        gzip_proxied any;
        gzip_types application/javascript application/x-javascript text/css text/javascript;
        gzip_comp_level 5;
        gzip_buffers 16 8k;
        gzip_min_length 256;

        location /_next/static/ {
                alias /var/www/name_of_app/.next/static/;
                expires 365d;
                access_log off;
        }

        location / {
                proxy_pass http://127.0.0.1:3000; #change ports for second app i.e. 3001,3002
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}

  1. Crear enlace simbólico:
sudo ln -s /etc/nginx/sites-available/nombre_app /etc/nginx/sites-enabled/nombre_app
  1. Verificar errores:
nginx -t
  1. Eliminar configuración por defecto:
cd /etc/nginx/sites-available
sudo rm default

cd /etc/nginx/sites-enabled
sudo rm default
  1. Reiniciar NGINX:
sudo systemctl restart nginx

🚀 Ejecutar la aplicación con PM2

cd /var/www/nombre_app

Opción 1 (puerto por defecto):

pm2 start npm --name nombre_app -- start

Opción 2 (puerto personalizado):

pm2 start npm --name nombre_app -- start -- --port=3001

Guardar configuración de PM2:

pm2 save
pm2 startup

🔒 Activar SSL con Let’s Encrypt

sudo certbot --nginx -d dominio.com -d www.dominio.com

💡 Comandos útiles

pm2 start npm --name nombre_app -- start
systemctl restart nginx
sudo certbot --nginx -d dominio.com

Conclusión

Con estos pasos ya tienes tu aplicación Next.js desplegada en un servidor Ubuntu, gestionada por NGINX como proxy inverso, ejecutándose con PM2 y protegida mediante SSL. Esta configuración es estable, escalable y perfecta para entornos de producción como Digital Ocean, AWS EC2 o cualquier VPS.