eduardweb.
DeploymentIntermediar#nextjs#devops#pm2#nginx#vps

Deployment Next.js pe VPS cu PM2 și Nginx: zero downtime și logrotate

De Răzvan Matei, 7 aug. 2026 · 8 vizualizări · 3 like-uri

Postat 7 aug. 2026
javascript
module.exports = {
  apps: [
    {
      name: 'my-next-app',
      script: 'node_modules/next/dist/bin/next',
      args: 'start',
      instances: 'max',
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'production',
        PORT: 3000
      },
      max_memory_restart: '500M',
      error_file: './logs/err.log',
      out_file: './logs/out.log',
      merge_logs: true
    }
  ]
};

Toți începem pe Vercel cu Next.js că e un click distanță, dar când depășești un anumit prag de trafic sau ai nevoie de server-side rendering mai greu, facturile cresc exponențial. Am mutat recent o aplicație cu 15k vizitatori unici pe zi pe un VPS Hetzner de 6 euro și rulează impecabil. Hai să-ți arăt setup-ul meu de producție cu PM2, Nginx și SSL automatizat, pe care îl folosesc de vreo 4 ani fără surprize.

1. Setup-ul PM2 și magia de cluster mode

Prima greșeală pe care o văd la mulți e că dau pm2 start npm -- start și uită de el. În producție vrei neapărat un fișier ecosystem.config.js configurat corect cu modul cluster activat, ca să folosești toate nucleele procesorului oferit de VPS.

Cel mai important detaliu pentru zero-downtime deployment este folosirea comenzii pm2 reload în loc de pm2 restart. Restart-ul taie procesele instant și utilizatorii primesc erori 502 Bad Gateway timp de câteva secunde cât timp își face Next.js boot-ul. Comanda reload pornește mai întâi instanțele noi pe fundal, așteaptă să devină active și abia apoi le oprește pe cele vechi una câte una.

La proiectul de 15k useri menționat mai sus, un build de Next.js procesează cam 400MB RAM per worker. Am configurat max_memory_restart: '500M' în fișierul de PM2 ca protecție în caz că scap vreun memory leak în vreun route handler rătăcit.

2. Nginx, SSL și protecția discului cu Logrotate

Nginx stă în față și preia conexiunile HTTPS pe portul 443, apoi le trimite intern către portul 3000 unde ascultă PM2. Pe lângă securitate și performanță la servirea fișierelor statice (precum cele din .next/static), Nginx gestionează SSL-ul gratuit prin Let's Encrypt.

Setezi Certbot o singură dată cu sudo certbot --nginx -d domeniultau.ro și își face renewal automat via systemd timer. N-ai ce să mai atingi la el 90 de zile.

Dar atenție la o capcană mare pe care mulți o ignoră: log-urile! PM2 scrie tot ce iese în stdout și stderr în fișiere text pe disc. Într-o lună de producție, pe un server mic de 20GB SSD, log-urile alea pot umple tot discul și îți crapă tot sistemul (am pățit-o în 2019, la 3 dimineața, când a picat baza de date doar pentru că discul era plin 100%). Rezolvarea e modulul pm2-logrotate. Îl instalezi direct din terminal cu pm2 install pm2-logrotate și îți taie log-urile zilnic sau când ating 10MB, păstrând doar ultimele 7 arhive.

3. Trade-off-uri reale: VPS vs Vercel

Hai să fim sinceri, că nu e totul lapte și miere când alegi self-hosting-ul:

  • Pro: Costuri fixe și minuscule (6-10€/lună în loc de $100+ pe Vercel Pro când ai trafic mare), control total pe procese, latență mai mică dacă userii sunt din România/Europa și ai VPS-ul în Frankfurt.
  • Contra: Mentenanța e complet pe umerii tăi. Dacă crapă Node sau cade serverul din cauza unui kernel panic, tu primești alerta, nu echipa Vercel. Nu ai Preview Deployments automate out-of-the-box pentru fiecare Pull Request (deși le poți construi cu GitHub Actions și webhook-uri, durează ceva timp până le pui la punct).

Pentru proiecte cu buget redus sau trafic moderat spre mare, setup-ul ăsta e tanc. Voi ce opțiune folosiți în producție — rămâneți pe Vercel/Netlify sau preferați controlul de pe un VPS propriu?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.