server {
listen 80;
server_name domeniul-tau.ro;
location / {
proxy_pass http://localhost: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;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Să fim sinceri: Vercel e genial până când începi să ai trafic serios sau ai nevoie de bandă de date masivă. Recent, am mutat un proiect de SaaS local cu 12k vizitatori unici de pe Vercel pe un VPS de 6 euro de la Hetzner și am economisit destul de mult, eliminând complet emoțiile facturilor surpriză.
Trecerea pe VPS nu e grea, dar dacă nu ești atent la detalii, riști să ai downtime la fiecare deploy sau să te trezești cu disk-ul plin din cauza logurilor. Iată cum am configurat totul să ruleze stabil.
Cluster Mode în PM2 pentru Zero Downtime
Cea mai mare greșeală pe care o văd la deploy-urile de Next.js pe VPS este folosirea comenzii simple pm2 start npm -- name "app" -- start. Chestia asta îți va opri aplicația timp de câteva secunde la fiecare restart.
Soluția este să folosești PM2 în Cluster Mode. Creează un fișier ecosystem.config.js în rădăcina proiectului. Setarea cheie este instances: 'max' (sau un număr fix de procese, de exemplu 2 dacă ai un VPS cu doar 1GB RAM) și exec_mode: 'cluster'.
Când vrei să faci deploy la codul nou, rulezi:
npm run buildpm2 reload nume-aplicatie
Comanda reload înlocuiește procesele unul câte unul, menținând aplicația online pe tot parcursul procesului.
Trade-off sincer: Cluster mode consumă mai multă memorie RAM. Pe un VPS mic de 1GB, dacă pornești 4 instanțe de Node, s-ar putea să rămâi fără memorie în timpul build-ului. Limitează-te la 2 instanțe în acest caz.
Nginx ca Reverse Proxy și SSL cu Certbot
Next.js rulează implicit pe portul 3000, dar nu vrei ca userii să acceseze site-ul așa. Punem Nginx în față. El va prelua conexiunile pe portul 80/443 și le va trimite intern către PM2.
După ce ai configurat blocul de Nginx (vezi exemplul de cod de mai jos), instalezi Certbot pentru HTTPS:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d domeniul-tau.ro
Certbot își configurează singur reînnoirea automată printr-un cron job, deci uiți de grija certificatelor SSL expirate.
Problema ascunsă: Logurile care îți umplu disk-ul
Am pățit-o acum câțiva ani: m-am trezit duminică dimineața cu baza de date blocată pentru că disk-ul VPS-ului era 100% plin. Vinovatul? Logurile din PM2 care crescuseră la peste 15GB.
Nu lăsa PM2 să scrie loguri la infinit. Instalează modulul de rotire automată direct în PM2:
pm2 install pm2-logrotate
Apoi configurează-l să păstreze logurile în limite decente:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
Acum, PM2 va păstra doar ultimele 7 fișiere de loguri, de maxim 10MB fiecare. Simplu și salvator.
Concluzie
Plătești cu puțin timp de configurare la început, dar controlul pe care îl obții pe propriul VPS merită fiecare minut. Voi unde vă țineți proiectele de Next.js când Vercel devine prea scump?