Установка приложения node.js как службу в windows

Технологии

Допустим у вас есть приложение на node.js и вам нужно разместить его на ПК c Windows Server или на ПК с Windows. При этом приложение должно перезапускаться при перезагрузке компьютера. В моем случае задача состояла в размещении клиент — серверного приложения — склад на node.js на один из компьютеров в локальной сети.

Для решения задачи я использовал библиотеку node-windows, которая может использоваться для запуска и остановки приложений в качестве фоновых служб Windows. 

Для примера создадим простое приложение — сервер с использованием библиотеки express, которое отправляет текст «Hello World» на страницу браузера по маршруту http://localhost:3000/

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))

Чтобы установить библиотеку node-windows, набираем в консоли, в папке нашего приложения:

npm install -g node-windows
npm link node-windows

Библиотека установится глобально, поэтому если вам нужно запустить другое приложение, достаточно набрать только вторую строчку.

Далее нам нужно создать два файла: для запуска и для остановки службы, например start-service.js и stop-service.js и разместить их в одной папке с файлом приложения.

Пишем код для файла запуска службы start-service.js

var Service = require('node-windows').Service;

// Создаем новый объект службы
var svc = new Service({
  name:'Node application as Windows Service',
  description: 'Node application as Windows Service',
  script: 'C:\\nodeapp\\app.js', // путь к приложению
});

// Слушаем событие 'install' и запускаем службу
svc.on('install',function(){
  svc.start();
});

// Устанавливаем службу
svc.install();

Пишем код для файла остановки службы stop-service.js

var Service = require('node-windows').Service;

// Создаем новый объект службы
var svc = new Service({
  name:'Node application as Windows Service',
  description: 'Node application as Windows Service',
  script: 'C:\\nodeapp\\app.js', // путь к приложению
});

// Слушаем событие 'uninstall', пишем сообщение 
svc.on('uninstall',function(){
    console.log('Uninstall complete.');
    console.log('The service exists: ',svc.exists);
  });

  // Удаляем службу
  svc.uninstall();

Чтобы запустить службу, набираем в консоли:

$ node start-service.js

Чтобы остановить службу, набираем в консоли:

$ node stop-service.js

Библиотека node-windows создает папку daemon с исполняемыми файлами. Теперь, если нужно можно удалить исходные файлы приложения. Однако если приложение использует какие-то внешние файлы или папки, их нужно оставить. В моем случае я удалил все файлы, кроме папки c загружаемыми файлами uploads, папки public с фронтэндом (css, js, и др.), а также папки views c html шаблонами.

Желаю всем успешного развертывания!

Оцените автора
Лента Пути
Добавить комментарий

  1. Имя

    Выходит ошибка при запуске сервиса:
    var Service = require(‘node-windows’).Service;
    ^

    ReferenceError: require is not defined
    at file:///C:/windows/tgsh/start-service.js:1:15
    ?[90m at ModuleJob.run (internal/modules/esm/module_job.js:152:23)?[39m
    ?[90m at async Loader.import (internal/modules/esm/loader.js:166:24)?[39m
    ?[90m at async Object.loadESM (internal/process/esm_loader.js:68:5)?[39m

    Ответить
    1. admin автор

      1 Проверьте, работает require в основном файле (у меня app.js). Если нет, то Node js настроен

      на Import, с require могут быть проблемы (судя по всему вы используете ESM модуль)

      2 После установки node-windows нужно зайти в папку, где находятся start-service.js и stop-service.js

      набрать npm link node-windows

      Ответить