Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Развёртывание на сервере

Развёртывание — перенос программы на сервер, где она работает постоянно и доступна всем. На вашем компьютере вы запускаете блог командой 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=dev

npm 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 или другого менеджера процессов.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.