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.
sudo apt update
sudo apt upgrade
sudo apt install nginx certbot python3-certbot-nginx
sudo ufw allow "Nginx Full"
sudo ufw allow OpenSSH
sudo ufw enable
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
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install -g pm2
pm2 status
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.
cd /var/www
npx create-next-app@latest nombre_app
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
cd nombre_app
npm i
npm run build
cd /etc/nginx/sites-available
sudo nano nombre_app
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;
}
}
sudo ln -s /etc/nginx/sites-available/nombre_app /etc/nginx/sites-enabled/nombre_app
nginx -t
cd /etc/nginx/sites-available
sudo rm default
cd /etc/nginx/sites-enabled
sudo rm default
sudo systemctl restart nginx
cd /var/www/nombre_app
pm2 start npm --name nombre_app -- start
pm2 start npm --name nombre_app -- start -- --port=3001
Guardar configuración de PM2:
pm2 save
pm2 startup
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.