module.exports = {
apps: [
{
name: 'next-app',
script: 'node_modules/next/dist/bin/next',
args: 'start',
instances: 'max',
exec_mode: 'cluster',
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}
]
};Te-ai săturat de facturile neașteptate de pe Vercel sau de limitele din planul gratuit când crește traficul? Am trecut recent un proiect cu peste 12k utilizatori activi zilnic de pe serverless direct pe un VPS Hetzner de 5 euro și am redus cheltuielile cu 85% fără să pierd din performanță.
Evident, există un trade-off clar. Pe Vercel dai git push și ai uitat, în timp ce pe VPS trebuie să te ocupi singur de securitate, HTTPS și procese. Dar odată ce îți configurezi un pipeline simplu de deploy, totul devine extrem de stabil.
Pasul 1: Node.js și PM2 configurat corect
Secretul pentru zero downtime nu e vreun script complicat de Kubernetes, ci modul în care gestionezi procesele în PM2. Dacă dai pm2 restart, aplicația ta pică timp de 2-3 secunde până când Node reîncarcă modulele în memorie. Soluția este să folosești modul cluster și comanda pm2 reload.
Când rulezi pm2 reload, PM2 pornește un instanță nouă cu codul proaspăt build-uit, așteaptă să răspundă la port, iar abia apoi o omoară pe cea veche. Utilizatorul nu simte nicio întrerupere.
În proiectul tău, creează un fișier ecosystem.config.js la rădăcină. Nu uita să setezi PORT diferit dacă ai mai multe aplicații pe același server.
Pasul 2: Nginx ca Reverse Proxy și Certbot
Node.js nu ar trebui expus niciodată direct la portul 80 sau 444. Pune Nginx în față pentru a gestiona conexiunile TLS, compresia gzipping/brotli și fișierele statice.
Un bloc minim de Nginx pentru /etc/nginx/sites-available/app arată așa:
server {
server_name domeniul-tau.ro;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
Dacă faci symlink în sites-enabled și dai nginx -t && systemctl reload nginx, ești pe drumul cel bun. Pentru HTTPS, comanda magică e sudo certbot --nginx -d domeniul-tau.ro. Certbot își va injecta singur certificatele SSL și va seta auto-renew prin systemd timer.
Pasul 3: Logrotate ca să nu-ți crape disk-ul
Am pățit-o acum 4 ani: mă trezesc sâmbătă dimineața cu alertă că serverul e down. Cauza? Un fișier out.log din PM2 ajunsese la 45GB și umpluse tot SSD-ul. Node.js nu mai avea unde să scrie sesiunile temporare.
Nu te baza pe PM2 că își curăță singur logurile fără module externe. Instalează pm2-logrotate:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
Asta îți garantează că nu vei avea niciodată mai mult de 70MB de loguri vechi pe disc. Simplu și curat.
Scriptul automatizat de Deploy
În loc să intri prin SSH de fiecare dată, poți pune un script simplu de bash în CI/CD (GitHub Actions) sau chiar rulat local:
#!/bin/bash
git pull origin main
npm install --production=false
npm run build
pm2 reload ecosystem.config.js --env production
Build-ul se face direct pe VPS (dacă ai minim 2GB RAM) sau poți urca artefactele deja construite. Durează sub 20 de secunde și ai zero întreruperi pentru utilizatori.
Voi cum vă gestionați proiectele de Next.js în producție? Mergeți pe Vercel/SST sau preferați controlul total pe VPS-uri proprii?