Содержание
Коротко
Каждый деплой Next.js на VPS — лотерея: 502 Bad Gateway на минуту или обошлось. На Habr разобрали рабочий рецепт с PM2: reload вместо restart, cluster mode и дисциплина вокруг каталога .next.
Что произошло
Автор описывает типичный сценарий: пуш в main, CI собирает проект, на сервере pm2 restart — и nginx отдаёт 502, пока процесс поднимается заново. Проблема массовая у команд без Kubernetes: обсуждения на GitHub, Stack Overflow, Reddit.
Два частых промаха:
pm2 restart— процесс умирает, порт пустует, пользователи видят 502.rm -rf .nextперед сборкой на живом сервере — приложение теряет артефакты до окончанияnext build.
Решение — pm2 reload в cluster mode: PM2 поднимает новые воркеры, потом гасит старые (zero-downtime на уровне Node).
Почему это важно
Для малого и среднего трафика VPS + PM2 часто дешевле и быстрее в настройке, чем кластер Kubernetes. Но без правильного reload деплой остаётся «ручным даунтаймом».
Сравнение из материала:
| Подход | Плюсы | Минусы |
|---|---|---|
| PM2 на VPS | Простой старт, знакомый CI, мало moving parts | Сами следите за SSL, бэкапами, масштабом |
| Kubernetes | Rolling update из коробки, autoscaling | Сложность, стоимость, избыточен для одного Next-приложения |
На практике
- Запуск Next в cluster (
instances: maxили фиксированное число воркеров). - В CI/CD после сборки —
pm2 reload ecosystem.config.cjs, неrestart. - Сборку
.nextделать в CI или в отдельной директории; на сервер не удалять.nextпод работающим процессом. - Healthcheck nginx на upstream после reload; логировать время простоя.
Если уже на Docker — смотрите в сторону blue-green или rolling update; идея та же: новый инстанс до выключения старого.
Итог
502 при деплое Next — не «проклятие фреймворка», а сигнал неверного процесса релиза. Для VPS-стека PM2 с reload и аккуратной сборкой часто достаточно; Kubernetes нужен, когда выросли требования к отказоустойчивости и масштабу.