Запуск на сервере
На своём компьютере сервер запускается командой 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 startuppm2 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' или передайте адрес через переменную окружения.