Как настроить deb файл с nodejs сервером?

Подробное руководство по созданию и настройке .deb пакета для Node.js сервера

Введение

Создание .deb пакета для Node.js приложения позволяет удобно распространять и устанавливать ваше приложение в Debian-based системах (Ubuntu, Debian и др.). Это обеспечивает:

  • Простую установку и удаление
  • Управление зависимостями
  • Автоматическую конфигурацию системы
  • Интеграцию с системой инициализации

Предварительные требования

Установка необходимых инструментов

sudo apt update
sudo apt install build-essential devscripts debhelper dh-make

Подготовка Node.js приложения

Убедитесь, что ваше приложение имеет:

  • package.json с корректными метаданными
  • Прописанные зависимости в dependencies
  • Указанную точку входа (main или bin)

Пошаговое создание .deb пакета

Шаг 1: Создание структуры проекта

mkdir my-nodejs-app
cd my-nodejs-app
mkdir -p debian/source
mkdir -p usr/lib/my-nodejs-app

Шаг 2: Копирование файлов приложения

# Скопируйте все файлы вашего Node.js приложения
cp -r /path/to/your/app/* usr/lib/my-nodejs-app/

Шаг 3: Создание файлов конфигурации Debian

debian/control

Source: my-nodejs-app
Section: web
Priority: optional
Maintainer: Your Name <your.email@example.com>
Build-Depends: debhelper (>= 9), nodejs, npm
Standards-Version: 3.9.8
Homepage: https://example.com

Package: my-nodejs-app
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, nodejs, npm
Description: My Node.js Application
 A detailed description of your Node.js application.

debian/rules

#!/usr/bin/make -f

%:
	dh $@

override_dh_auto_install:
	# Копируем файлы приложения
	mkdir -p debian/my-nodejs-app/usr/lib/my-nodejs-app
	cp -r usr/lib/my-nodejs-app/* debian/my-nodejs-app/usr/lib/my-nodejs-app/
	
	# Создаем символические ссылки или скрипты запуска
	mkdir -p debian/my-nodejs-app/usr/bin
	echo '#!/bin/bash' > debian/my-nodejs-app/usr/bin/my-nodejs-app
	echo 'cd /usr/lib/my-nodejs-app && node index.js' >> debian/my-nodejs-app/usr/bin/my-nodejs-app
	chmod +x debian/my-nodejs-app/usr/bin/my-nodejs-app

override_dh_auto_build:
	# Устанавливаем npm зависимости
	cd usr/lib/my-nodejs-app && npm install --production

debian/changelog

my-nodejs-app (1.0.0-1) unstable; urgency=medium

  * Initial release.

 -- Your Name <your.email@example.com>  Mon, 01 Jan 2023 12:00:00 +0000

debian/install

usr/lib/my-nodejs-app /usr/lib
usr/bin/my-nodejs-app /usr/bin

debian/postinst (скрипт post-installation)

#!/bin/bash

# Активация сервиса
systemctl daemon-reload
systemctl enable my-nodejs-app.service

echo "My Node.js Application installed successfully!"

debian/prerm (скрипт pre-removal)

#!/bin/bash

# Остановка сервиса перед удалением
systemctl stop my-nodejs-app.service || true

Шаг 4: Создание systemd сервиса

debian/my-nodejs-app.service

[Unit]
Description=My Node.js Application
After=network.target

[Service]
Type=simple
User=myappuser
Group=myappgroup
WorkingDirectory=/usr/lib/my-nodejs-app
ExecStart=/usr/bin/node index.js
Restart=always
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

Добавьте в debian/rules:

override_dh_systemd_enable:
	# Копируем service файл
	mkdir -p debian/my-nodejs-app/lib/systemd/system
	cp debian/my-nodejs-app.service debian/my-nodejs-app/lib/systemd/system/

Шаг 5: Создание пользователя и группы для приложения

debian/my-nodejs-app.postinst

#!/bin/bash

# Создание пользователя и группы
if ! getent group myappgroup >/dev/null; then
    addgroup --system myappgroup
fi

if ! getent passwd myappuser >/dev/null; then
    adduser --system --ingroup myappgroup --home /usr/lib/my-nodejs-app myappuser
fi

# Установка прав на файлы
chown -R myappuser:myappgroup /usr/lib/my-nodejs-app
chmod 755 /usr/lib/my-nodejs-app

Шаг 6: Сборка пакета

# Установка прав на исполняемые файлы
chmod +x debian/rules

# Сборка пакета
dpkg-buildpackage -us -uc

# Или с подписью
dpkg-buildpackage -us -uc -rfakeroot

Шаг 7: Установка и тестирование

# Установка
sudo dpkg -i ../my-nodejs-app_1.0.0-1_amd64.deb

# Проверка установки
sudo systemctl status my-nodejs-app
sudo journalctl -u my-nodejs-app -f

Расширенная конфигурация

Настройка переменных окружения

Создайте файл конфигурации в /etc/default:

debian/my-nodejs-app.default

# Конфигурация My Node.js Application
NODE_ENV=production
PORT=3000
DATABASE_URL=your_database_url

Логирование

Настройте ротацию логов:

debian/my-nodejs-app.logrotate

/var/log/my-nodejs-app/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 myappuser myappgroup
    sharedscripts
    postrotate
        systemctl reload my-nodejs-app > /dev/null 2>&1 || true
    endscript
}

Автоматизация с помощью инструментов

Использование electron-builder (для Electron приложений)

{
  "build": {
    "appId": "com.example.myapp",
    "linux": {
      "target": "deb",
      "category": "Development"
    }
  }
}

Использование node-deb

npm install -g node-deb
node-deb -- index.js package.json

Отладка и устранение проблем

Проверка содержимого пакета

dpkg -c my-nodejs-app_1.0.0-1_amd64.deb

Проверка зависимостей

dpkg -I my-nodejs-app_1.0.0-1_amd64.deb

Просмотр логов установки

sudo apt install -f
sudo dpkg -i package.deb 2>&1 | tee install.log

Best Practices

  1. Версионирование: Следуйте семантическому версионированию
  2. Зависимости: Четко указывайте все зависимости
  3. Безопасность: Создавайте отдельного пользователя для сервиса
  4. Логирование: Настройте корректное логирование
  5. Конфигурация: Используйте файлы в /etc для конфигурации
  6. Тестирование: Тестируйте пакет на чистой системе

Заключение

Создание .deb пакета для Node.js приложения требует внимания к деталям, но обеспечивает профессиональный способ распространения вашего приложения. Используйте этот гайд как основу и адаптируйте его под конкретные потребности вашего проекта.

Для более сложных сценариев рассмотрите использование специализированных инструментов вроде fpm (Effing Package Management) или интеграцию с CI/CD системами для автоматической сборки пакетов.