Encodera

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

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

Оглавление

Запуск на сервере

На своём компьютере сервер запускается командой npm run dev и работает, пока открыт терминал. На рабочем сервере API должен быть доступен снаружи, сам перезапускаться после сбоя и аккуратно завершаться при обновлении. Для этого нужны три настройки.

Адрес 0.0.0.0

По умолчанию listen принимает подключения только с того же компьютера (localhost). На сервере и в Docker-контейнере нужно слушать все сетевые интерфейсы — адрес 0.0.0.0:

// src/server.js
import { buildApp } from './app.js';
 
const app = buildApp({ logger: true, trustProxy: true });
 
await app.ready();
await app.listen({ port: app.config.PORT, host: '0.0.0.0' });

Теперь API отвечает по IP-адресу сервера. trustProxy: true нужен, если перед Fastify стоит nginx: тогда request.ip содержит адрес клиента, а не прокси.

Корректная остановка

При обновлении менеджер процессов посылает сигнал SIGTERM. Если сразу завершить процесс, запросы, которые обрабатываются в этот момент, оборвутся. Добавьте в конец src/server.js:

// src/server.js
for (const signal of ['SIGINT', 'SIGTERM']) {
  process.on(signal, async () => {
    app.log.info({ signal }, 'Остановка сервера');
    await app.close();
    process.exit(0);
  });
}

app.close() перестаёт принимать новые подключения, дожидается текущих запросов и вызывает хуки onClose — в них закрывается база данных. Нажмите Ctrl+C в терминале: в логе появится «Остановка сервера», и процесс завершится без ошибок.

Менеджер процессов PM2

PM2 следит за процессом: перезапускает его после падения и при перезагрузке сервера.

npm install --global pm2
pm2 start npm --name blog-api -- start
pm2 save
pm2 startup

pm2 start запускает скрипт npm start из package.json (с флагом --env-file), pm2 save запоминает список процессов, а pm2 startup выводит команду, которая включает автозапуск после перезагрузки.

КомандаЧто делает
pm2 listСписок процессов и их состояние
pm2 logs blog-apiЛоги приложения
pm2 restart blog-apiПерезапуск после обновления кода
pm2 stop blog-apiОстановка

Перед запуском

  • создайте на сервере .env с настоящими секретами;
  • установите только рабочие зависимости: npm ci --omit=dev;
  • уберите pino-pretty из настроек логгера;
  • поставьте перед Fastify nginx с HTTPS.

Частая ошибка

Сервер запущен, curl http://localhost:3000 на самом сервере работает, а снаружи API недоступен. Почти всегда причина — listen без host: Fastify слушает только 127.0.0.1. Укажите host: '0.0.0.0' или передайте адрес через переменную окружения.

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

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