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

Deployment Next.js pe VPS: Zero downtime cu PM2, Nginx și Logrotate

De Sorin Tudor, 10 aug. 2026 · 4 vizualizări · 2 like-uri

Postat acum 6 zile
javascript
module.exports = {
  apps: [
    {
      name: '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: '800M',
    },
  ],
};

De ce să plătești $150+ pe lună la Vercel când un VPS ieftin de pe Hetzner duce liniștit peste 15.000 de vizitatori unici pe zi? Anul trecut am mutat un proiect Next.js de la un PaaS scump pe o instanță Ubuntu de 6 euro. Am redus costurile de infrastructură cu 85% și am păstrat aceeași experiență de deployment fără întreruperi.

Nu e fizică cuantică, dar sunt câteva detalii unde majoritatea devilor își prind urechile când renunță la platformele managed.

PM2 în cluster mode pentru Zero Downtime

Greșeala clasică pe care o văd la juniori e că rulează pm2 start npm -- start. Când faci deploy și dai pm2 restart, aplicația ta e picată vreo 3-5 secunde până pornește din nou procesul Node. Mulțumesc, dar utilizatorii care tocmai trimit un formular nu vor fi fericiți.

Soluția e modul cluster din PM2 combinat cu comanda pm2 reload. În loc să oprești toate instanțele deodată, PM2 le repornește pe rând. O instanță preia traficul în timp ce alta se reîncarcă cu codul nou.

Pentru asta, folosesc un fișier ecosystem.config.js în rădăcina proiectului. Setarea instances: 'max' sau un număr fix de core-uri (ex: 2) procesează cererile în paralel pe mai multe thread-uri.

Nginx și SSL automat cu Certbot

Nginx joacă rolul de reverse proxy. El primește cererile pe portul 80/443 și le trimite intern către portul 3000 unde ascultă PM2. Pe lângă asta, Nginx gestionează compresia gzip/brotli și static assets mai eficient decât o face Node.js.

Setarea inițială durează 5 minute:

  1. Instalezi Nginx și creezi un vhost în /etc/nginx/sites-available/app.
  2. Configurezi proxy_pass http://127.0.0.1:3000 și headerele pentru WebSocket dacă folosești next/image sau subscriptions.
  3. Dai certbot --nginx -d domeniul-tau.ro și ești gata. Certbot își pune singur un cron job pentru reînnoirea certificatului la fiecare 90 de zile.

Logrotate: Cum să nu rămâi fără spațiu la 3 dimineața

Prin 2019 am pățit o fază extrem de neplăcută. M-am trezit cu notificări că site-ul e jos, doar ca să descopăr că fișierul out.log din PM2 ajunsese la 45GB și umpluse complet SSD-ul VPS-ului. De atunci, primul lucru pe care îl fac pe un server nou e să configurez pm2-logrotate.

E un modul extrem de simplu pe care îl instalezi direct prin PM2: pm2 install pm2-logrotate

Apoi îl setezi să rotatizeze logurile când ajung la 10MB și să păstreze maxim 7 fișiere arhive. Salvează tone de bătăi de cap pe termen lung.

Trade-off-uri: Când merită și când nu?

Setup-ul ăsta e fantastic pentru proiecte mici și medii. Economisești bani reali, ai acces complet la server și viteza e excelentă.

Minusul? Întreținerea e 100% responsabilitatea ta. Dacă apare o vulnerabilitate de securitate în Ubuntu sau dacă pica baza de date locală, tu ești cel sunat. Dacă ai o echipă fără experiență pe Linux sau proiectul necesită auto-scaling masiv de la oră la oră, mai bine rămâi pe Vercel sau AWS ECS.

Voi ce folosiți în producție pentru Next.js? Vă băgați la self-hosting pe VPS sau preferați comoditatea platformelor managed?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

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