module.exports = {
apps: [
{
name: 'nextjs-app',
script: 'node_modules/next/dist/bin/next',
args: 'start',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
}
}
]
};Am văzut prea mulți devi care sar direct pe Vercel doar pentru că le e groază de configurat un server. Nimic greșit în asta când ești la început, dar când începe să-ți crească traficul sau ai nevoie de resurse serioase, Vercel devine rapid o gaură neagră în buget.
Am avut anul trecut un proiect cu vreo 8k useri activi zilnic. Pe Vercel ne apropiam periculos de limita de serverless execution, așa că am mutat totul pe un VPS de 6 euro de la Hetzner. Am redus costurile cu aproape 85% și avem control total. Iată cum am făcut-o cu PM2, Nginx, Certbot și logrotate, fără să avem nici măcar o secundă de downtime la deployment.
De ce PM2 în cluster mode?
Dacă rulezi doar npm start, aplicația ta rulează pe un singur thread. Dacă pică din cauza unei erori neprevăzute, pică tot site-ul. În plus, când faci un update, trebuie să oprești procesul vechi și să-l pornești pe cel nou. Asta înseamnă downtime, chiar dacă e vorba doar de 5 secunde.
Soluția este PM2 în mod cluster. Acesta spawnează instanțe pe mai multe nuclee ale procesorului. Când dai deploy la codul nou, folosești pm2 reload în loc de restart. PM2 va reporni instanțele pe rând, una câte una. Utilizatorii tăi nu vor vedea nicio secundă de eroare 502.
Nginx ca barieră de protecție
PM2 se ocupă de procese, dar nu e o idee bună să expui portul de Node direct în exterior. Aici intervine Nginx. Acesta preia cererile de pe portul 80 sau 443 și le trimite în spate către portul local al aplicației (de obicei 3000).
Nginx se ocupă excelent de compresia gzip, caching pentru asset-urile statice din .next/static și oferă un strat extra de securitate. Trade-off-ul e că trebuie să scrii manual fișierele de configurare și să ai grijă să nu uiți de proxy_set_header, altfel te trezești că toate request-urile par să vină de la localhost în logurile aplicației.
Coșmarul logurilor: pm2-logrotate
Am pățit-o pe propria piele. La trei săptămâni după deployment, m-am trezit duminică dimineața cu o alertă de "disk space 100%". PM2 scrie tot ce dă aplicația în stdout și stderr în niște fișiere .log simple. Dacă ai un script de tracking sau un API extern care dă multe warning-uri, te trezești rapid cu zeci de gigabiți de text inutil.
Soluția e simplă: instalează modulul pm2-logrotate. E o singură comandă în terminal: pm2 install pm2-logrotate. Acesta va tăia logurile automat când ajung la 10MB și va păstra doar ultimele 30 de fișiere, restul fiind șterse. Mi-a salvat nopțile de weekend.
HTTPS moca cu Certbot
Odată ce ai Nginx-ul configurat pe HTTP, rulezi sudo certbot --nginx și ai terminat. Își face singur challenge-ul de ACME, îți modifică configul de Nginx și îți instalează un cron job care reînnoiește certificatul automat la fiecare 3 luni. Nu plătești nimic și ai SSL valid în mai puțin de două minute.
Evident, ai dezavantajul că acum trebuie să te ocupi singur de securitatea serverului, de update-uri de OS și de backup-uri. Dar pentru mine, diferența de bani și libertatea de configurare bat orice platformă serverless.
Cum vi se pare abordarea asta? Merită bătaia de cap cu VPS-ul pentru a economisi banii de Vercel sau preferați să plătiți pentru comoditate?