Развёртывание на сервере
Развёртывание — перенос программы на сервер, где она работает постоянно и доступна всем. На вашем компьютере вы запускаете блог командой npm run dev и останавливаете Ctrl+C. На сервере нужно другое: программа должна работать без открытого терминала, перезапускаться после падения и после перезагрузки сервера, а журналы — сохраняться.
Подготовка проекта
Убедитесь, что в package.json есть скрипт start, а порт берётся из окружения:
{
"scripts": {
"start": "node src/server.js"
}
}// src/server.js
const PORT = Number(process.env.PORT ?? 3000);
server.listen(PORT, () => console.log(`Блог работает на порту ${PORT}`));Установка на сервере
На сервере (обычно это Linux) должен стоять Node.js той же основной версии, что и у вас. Код забирают из Git и ставят только рабочие зависимости:
git clone https://example.com/anna/blog.git
cd blog
npm ci --omit=devnpm ci ставит точно те версии, что записаны в package-lock.json, а --omit=dev пропускает devDependencies. Файл .env в Git не хранится — создайте его на сервере вручную и укажите в нём NODE_ENV=production.
Менеджер процессов pm2
Менеджер процессов запускает программу в фоне, следит за ней и перезапускает при падении. Самый популярный для Node.js — pm2:
npm install -g pm2
pm2 start src/server.js --name blog --node-args="--env-file=.env"Блог заработает в фоне, терминал можно закрыть.
| Команда | Что делает |
|---|---|
pm2 list | Список запущенных программ |
pm2 logs blog | Журнал вывода в реальном времени |
pm2 restart blog | Перезапуск после обновления кода |
pm2 stop blog | Остановка |
pm2 save и pm2 startup | Автозапуск после перезагрузки сервера |
Журналы
Всё, что программа выводит через console.log() и console.error(), pm2 сохраняет в файлы и показывает командой pm2 logs. Поэтому на сервере пишите в журнал главное: запуск, ошибки, важные действия — без паролей и личных данных.
Корректная остановка
При перезапуске pm2 посылает программе сигнал SIGINT, а системные менеджеры вроде systemd или Docker — SIGTERM. Сервер должен дообслужить начатые запросы и только потом завершиться:
// src/server.js
function shutdown() {
console.log('Останавливаемся...');
server.close(() => process.exit(0));
}
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);server.close() перестаёт принимать новые соединения и вызывает функцию, когда текущие запросы закончены.
Перед сервером Node.js
Обычно Node.js не выставляют в интернет напрямую. Перед ним ставят веб-сервер nginx: он принимает запросы на портах 80 и 443, обслуживает HTTPS-сертификат и передаёт запросы блогу на порт 3000.
Частая ошибка
На сервере программу запускают через node --watch или npm run dev в открытом терминале. Как только вы закроете подключение к серверу, блог остановится, а после первой же ошибки не поднимется. Режим --watch нужен только при разработке; на сервере используйте npm start под управлением pm2 или другого менеджера процессов.