Коротко
На VPS собираете проект, поднимаете его через PM2 на localhost, снаружи ставите nginx и Let's Encrypt. Docker не обязателен, если один Node-процесс.
Подробнее
Схема простая: Node слушает 127.0.0.1:3000, nginx принимает 80/443 и проксирует.
- На сервере ставите Node LTS и nginx.
- Кладёте код в каталог проекта, в
.env— секреты, не в git. - Собираете фронт или запускаете
node/next start. - PM2 держит процесс:
pm2 startиpm2 save, чтобы пережил ребут. - В nginx —
proxy_passна localhost, заголовкиHostиX-Forwarded-Proto. - Сертификат — certbot. HTTP редиректите на HTTPS.
Логи смотрите в pm2 logs. Если 502 — процесс не слушает порт или упал после деплоя.
Для Next.js на том же VPS часто удобнее Docker — см. деплой Next.js на Beget. Этот гайд — если хотите без контейнеров.
См. также
Ключевые выводы
PM2 держит процесс, nginx закрывает наружу, SSL обязателен на проде. Секреты только на сервере. После обновления — git pull, сборка, pm2 restart.
FAQ
Зачем nginx, если Node сам слушает 3000?
Снаружи не стоит открывать порт приложения. nginx даёт HTTPS, один вход и несколько сайтов на одном VPS.
PM2 или systemd?
Для одного Node-приложения PM2 проще. systemd тоже нормально, если уже так принято на сервере.
Почему после ребута сайт лежит?
Не сделали pm2 startup и pm2 save. Процесс не поднялся сам.