Menu
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

VPS pod Node.js i Next.js - PM2, Nginx, SSL, CI/CD

Opublikowano: 26 czerwca 2026 · Kategoria: VPS / Node.js

Szczegółowe porównanie planów VPS - parametry, ceny i ranking providerów - znajdziesz w artykule Jaki VPS wybrać?. Poniżej skupiamy się wyłącznie na konfiguracji Node.js i Next.js: process manager, reverse proxy, SSL i automatyczny deployment.

Dlaczego hosting współdzielony nie wystarcza dla Node.js?

Hosting współdzielony jest optymalny dla prostych stron i blogów - jeśli to wystarczy, sprawdź poradnik hostingu współdzielonego. Dla Node.js/Next.js potrzebny jest VPS, bo:

⚡
Node.js to długo żyjący proces

Aplikacja Node.js to serwer HTTP działający jako stały proces - nie skrypt PHP wywoływany per-request. Hosting współdzielony zazwyczaj nie pozwala uruchamiać trwałych procesów w tle i restartować ich po awarii.

🔧
Kontrola nad wersją Node.js i zależnościami

Next.js 15 wymaga Node.js ≥18.18.0. Na VPS instalujesz dokładnie tę wersję, którą potrzebujesz - nvm lub fnm pozwalają zarządzać kilkoma wersjami jednocześnie. Na hostingu współdzielonym wersja Node.js jest narzucona przez providera.

📈
SSR i obsługa równoległych zapytań

Next.js SSR generuje strony na żądanie - każde zapytanie to praca procesora. PM2 cluster mode uruchamia tyle workerów ile masz vCPU, obsługując równoległe zapytania. Na hostingu współdzielonym zasoby CPU są ograniczone i dzielone z innymi.

PM2 - zarządzanie procesami Node.js na VPS

PM2 to najpopularniejszy process manager dla Node.js. Instaluje się globalnie przez npm, obsługuje restart po awarii, cluster mode i centralne logowanie.

# Instalacja PM2
npm install -g pm2
# Start aplikacji Next.js (standalone)
cd /var/www/myapp
PORT=3000 pm2 start .next/standalone/server.js --name "myapp"
# Cluster mode - wykorzystaj wszystkie vCPU
pm2 start .next/standalone/server.js --name "myapp" -i max
# Autostart po reboocie
pm2 startup
pm2 save

Plik konfiguracyjny `ecosystem.config.js` pozwala zarządzać wieloma aplikacjami i zmiennymi środowiskowymi. Podstawowe komendy zarządzania: `pm2 status`, `pm2 logs myapp`, `pm2 reload myapp` (zero-downtime w cluster mode), `pm2 stop myapp`.

Alternatywa to systemd - wbudowany init system Linuxa. Tworzysz unit file `/etc/systemd/system/myapp.service`, definiujesz ExecStart, RestartSec i User. Zaletą jest głębsza integracja z systemem (logi przez journald, standardowe `systemctl start/stop`). Wadą - brak natywnego cluster mode dla wielu workerów (za to node ma cluster module).

Reverse proxy - Nginx i SSL z Let's Encrypt

Node.js nasłuchuje na wewnętrznym porcie (np. 3000) - Nginx jako reverse proxy odbiera ruch na 80/443 i przekazuje go do aplikacji. Daje to SSL, nagłówki bezpieczeństwa i możliwość obsługi wielu aplikacji na jednym VPS.

# /etc/nginx/sites-available/myapp
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name example.com www.example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

SSL przez Let's Encrypt instalujesz przez certbot: `apt install certbot python3-certbot-nginx`, potem `certbot --nginx -d example.com`. Certbot automatycznie edytuje konfigurację Nginxa i ustawia cron na odnawianie certyfikatu co 90 dni.

Caddy to alternatywa z automatycznym SSL bez certbota. Konfiguracja w Caddyfile jest zwięźlejsza: example.com { reverse_proxy localhost:3000 } - Caddy sam pobiera certyfikat i odświeża go. Wygodny dla prostych konfiguracji, mniej dokumentacji dla zaawansowanych scenariuszy niż Nginx.

Next.js standalone - minimalny bundle na VPS

Next.js 12.1+ obsługuje output: 'standalone' w next.config.js. Generuje minimalny bundle zawierający tylko potrzebne pliki - bez node_modules.

// next.config.js - włącz standalone output
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'standalone',
}
# Lokalnie: build i spakowanie do transferu
npm run build
# Wynikowe katalogi:
# .next/standalone/ - serwer z zależnościami
# .next/static/ - statyczne assety (CSS/JS)
# public/ - pliki publiczne
# Na VPS:
rsync -avz .next/standalone/ user@vps:/var/www/myapp/
rsync -avz .next/static/ user@vps:/var/www/myapp/.next/static/
rsync -avz public/ user@vps:/var/www/myapp/public/

# Start:
cd /var/www/myapp
PORT=3000 node server.js

Standalone output znacznie zmniejsza czas deployu i zużycie dysku - brak 300 MB node_modules w każdym deploymencie. Pamiętaj o przekopiowaniu zarówno .next/static/ jak i public/ - standalone nie zawiera ich wewnątrz bundla.

CI/CD - automatyczny deployment przez GitHub Actions

Typowy flow dla Next.js na VPS: push do `main` → GitHub Actions buduje aplikację → rsync na VPS → PM2 reload (zero-downtime w cluster mode).

# .github/workflows/deploy.yml (skrót)
on:
push:
branches: [main]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20 }
- run: npm ci && npm run build
- name: Deploy via rsync
run: |
rsync -avz .next/standalone/ ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:/var/www/myapp/
rsync -avz .next/static/ ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:/var/www/myapp/.next/static/
- name: Reload PM2
run: ssh ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }} "pm2 reload myapp"

W GitHub Secrets dodajesz `VPS_HOST`, `VPS_USER` i `VPS_SSH_KEY` (klucz prywatny SSH). Klucz publiczny dodajesz do `~/.ssh/authorized_keys` na VPS. Ważne: akcja `webfactory/ssh-agent` lub `appleboy/ssh-action` upraszczają konfigurację klucza SSH w Actions.

Przy bardziej złożonych deploymentach warto rozważyć Dockera - build obrazu na CI, push do rejestru, pull na VPS i restart kontenera. Daje izolację środowiska i łatwy rollback (poprzedni tag obrazu). Konfigurację Dockera dla Node.js znajdziesz w artykule Docker na VPS.

Jakie parametry VPS dla Node.js i Next.js?

Scenariusz RAM (orient.) vCPU Uwagi
API/backend, mały ruch 1-2 GB 1-2 Wystarczy PM2 single mode
Next.js SSR, umiarkowany ruch 2-4 GB 2-4 PM2 cluster mode (-i max)
Next.js + PostgreSQL + Redis 4-8 GB 2-4 Wszystko na jednym VPS
Duży ruch, wiele serwisów 8 GB+ 4+ Rozważ Docker Compose

Dysk NVMe przyspiesza build Next.js i operacje npm - szczególnie widoczne przy pierwszym `npm ci` na VPS. Dla aplikacji z bazą danych lokalnie: PostgreSQL i Redis zajmują orientacyjnie 1-2 GB RAM przy normalnym obciążeniu, co trzeba dodać do wymagań aplikacji. Użyj kalkulatora, żeby porównać plany.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Często zadawane pytania

Czy Next.js można hostować na zwykłym VPS?

Tak - VPS z 1-2 GB RAM wystarczy dla małej aplikacji Next.js. Dla SSR z większym ruchem warto mieć 2+ GB RAM i 2+ vCPU. PM2 cluster mode wykorzystuje wszystkie vCPU do obsługi równoległych zapytań.

PM2 czy systemd dla Node.js na VPS?

PM2 jest łatwiejszy w konfiguracji, ma cluster mode i centralne logowanie. systemd jest bardziej natywny dla Linuxa. Dla większości projektów Node.js polecamy PM2 jako punkt startowy - `pm2 startup && pm2 save` i autostart po reboocie gotowy.

Nginx czy Caddy jako reverse proxy dla Node.js?

Caddy automatycznie obsługuje SSL przez Let's Encrypt - prosta konfiguracja jedną linią. Nginx jest bardziej elastyczny przy zaawansowanych wymaganiach. Dla prostych konfiguracji Caddy jest szybszy do wdrożenia.

Jak skonfigurować CI/CD dla Next.js na VPS?

GitHub Actions: push → build → rsync na VPS → `pm2 reload`. Klucz SSH w GitHub Secrets. PM2 cluster mode z `pm2 reload` daje zero-downtime deployment. Alternatywa: Docker - build obrazu na CI, pull i restart na VPS.

Jak hostować Next.js standalone (output: standalone)?

Dodaj `output: 'standalone'` do next.config.js. Build generuje `.next/standalone/` z zależnościami. Na VPS kopiujesz standalone + `.next/static/` + `public/`, uruchamiasz `node server.js`. Brak 300 MB node_modules w deploymencie.