module.exports = {
apps: [
{
name: 'next-app',
script: './node_modules/next/dist/bin/next',
args: 'start',
instances: 'max',
exec_mode: 'cluster',
env: {
PORT: 3000,
NODE_ENV: 'production',
},
},
],
};La un proiect recent de e-commerce cu vreo 15k vizitatori unici pe zi, factura pe Vercel a sărit de 180$ într-o lună doar din optimizarea imaginilor și execuția de serverless functions. L-am mutat pe un VPS de 6€ de la Hetzner și de atunci procesorul stă sub 20%, iar timpul de răspuns pe SSR a scăzut cu vreo 40ms pentru că nu mai avem cold starts.
Dacă vrei să scapi de platformele PaaS scumpe, setup-ul clasic cu PM2 și Nginx e încă de neînvins. Doar că trebuie configurat cu cap, altfel la fiecare deploy pică site-ul pentru 10 secunde sau îți umpli discul cu loguri.
1. Zero downtime real cu PM2 Cluster
Mulți fac greșeala să ruleze next start într-un proces PM2 simplu și dau pm2 restart app. Asta taie conexiunile existente direct.
Soluția e modul cluster. În Next.js modern (standalone output recomandat în next.config.js), rulezi procesul principal cu modul cluster pe 2 sau mai multe instanțe (în funcție de câte vCPU ai). Când dai deploy, rulezi npm run build și apoi pm2 reload ecosystem.config.js. Comanda reload pornește procesele noi pe rând și le oprește pe cele vechi doar când noul proces a început să primească trafic. Zero conexiuni tăiate în nas userilor.
2. Nginx Reverse Proxy și HTTPS cu Certbot
Nginx stă în fața lui PM2 și se ocupă de gzip, buffer-uri și SSL. Next.js ar trebui să asculte doar pe 127.0.0.1:3000, niciodată expus public.
După ce pui fișierul de configurare în /etc/nginx/sites-available/ și faci symlink în sites-enabled, rulezi certbot --nginx -d domeniu.ro -d www.domeniu.ro. Își configurează singur certificatele Let's Encrypt și adaugă automat un cron job pentru reînnoire. N-am avut niciun certificat expirat în ultimii 4 ani folosind metoda asta.
3. Capcana logurilor: instalează pm2-logrotate
Am pățit la un client să pice tot serverul la 3 dimineața pentru că /var rămăsese fără spațiu. Un loop de erori într-un API route a generat un fișier ~/.pm2/logs/app-error.log de 45GB în 48 de ore.
Nu lăsa PM2 fără rotație de loguri. Soluția e un modul oficial care se instalează direct prin CLI: pm2 install pm2-logrotate. Îl configurezi să păstreze maxim 7 fișiere comprimate de câte 10MB fiecare și ai scăpat de stres.
Trade-off sincer: ce pierzi când ieși de pe Vercel
Nu totul e lapte și miere. Când ești pe propriul server, ești și propriul sysadmin. Dacă pică VPS-ul fizic la provider sau dacă nu monitorizezi memoria la un memory leak pe Node, treaba ta e să repari incidentul. Nu ai preview deployments automate la fiecare PR decât dacă îți configurezi tu GitHub Actions cu subdomenii dinamice (ceea ce consumă timp).
Pentru un magazin, un SaaS mic sau un blog cu trafic constant, economia e masivă și controlul e 100% al tău.
Voi mai țineți aplicațiile Next.js pe VPS-uri self-hosted sau ați trecut complet pe Coolify / Dokku?