Запуск приложения на виртуальной машине в качестве службы
В этой лабораторной работе вы развернете сервис для автоматического создания резервных копий выбранной директории на бесплатной виртуальной машине в облаке Cloud.ru Evolution.
Вы создадите служебный NodeJS-сервис, научитесь работать с дополнительным виртуальным диском, а также настроите запуск сервиса как systemd-службы для автоматизации процессов.
Вы будете использовать следующие сервисы:
-
Виртуальная машина free tier — сервис, в рамках которого предоставляется бесплатная виртуальная машина с готовой конфигурацией.
-
Диски — ресурс для подключения дополнительного хранилища к виртуальной машине.
-
Группы безопасности — инструмент управления сетевым доступом к виртуальным машинам.
-
Systemd — системный менеджер служб в Linux.
-
NodeJS и TypeScript — стек для разработки серверных приложений на языке JavaScript.
Шаги:
Перед началом работы
Если вы уже зарегистрированы, войдите под своей учетной записью.
1. Разверните виртуальную машину
На виртуальной машине будет запущена служба резервного копирования данных.
Создайте бесплатную виртуальную машину со следующими параметрами:
-
Укажите название виртуальной машины — backup-service.
-
На вкладке Публичные выберите образ Ubuntu 22.04.
-
Назначьте публичный IP-адрес виртуальной машине — оставьте включенной опцию Подключить публичный IP. Для виртуальной машины будет арендован и назначен прямой публичный IP-адрес.
-
В поле Логин укажите имя пользователя виртуальной машины, например user1.
-
Выберите метод аутентификации — пароль.
-
В поле Пароль укажите пароль пользователя для подключения к виртуальной машине.
Убедитесь, что в личном кабинете на странице сервиса «Виртуальные машины»:
-
отображается виртуальная машина backup-service
-
статус виртуальной машины — «Запущена»;
-
виртуальной машине назначен публичный IP-адрес.
2. Настройте группу безопасности
Группы безопасности Cloud.ru позволяют управлять правилами сетевого доступа к ресурсам.
Вы настроите правила фильтрации трафика — разрешите весь исходящий трафик виртуальной машины.
Создайте группу безопасности со следующими параметрами:
-
В поле Зона доступности укажите ту же зону, что выбрана для виртуальной машины.
-
Укажите название группы безопасности — allow-outbound-traffic.
-
Добавьте правило исходящего трафика:
-
Протокол — «Любой».
-
Порт — оставьте пустым.
-
Тип адресата — «IP-адрес».
-
Адресат — «0.0.0.0/0».
-
Убедитесь, что на странице виртуальной машины в разделе Сетевые параметры для сетевого интерфейса с публичным IP отображается группа безопасности allow-outbound-traffic.
3. Подключите и настройте дополнительный диск
Резервные копии рекомендуется хранить отдельно от основного системного диска.
-
Создайте диск со следующими параметрами:
-
В поле Зона доступности укажите ту же зону, что выбрана для виртуальной машины.
-
Укажите название диска — backup-disk.
-
Укажите размер диска — 10 ГБ.
-
-
Подключите диск к виртуальной машине:
-
В строке созданного диска нажмите
и выберите Подключить.
-
Выберите виртуальную машину backup-service в списке и нажмите Подключить.
-
Убедитесь, что в личном кабинете на странице сервиса «Диски»:
-
отображается диск backup-disk;
-
статус диска — «Используется»;
-
в столбце Ресурс указана виртуальная машина backup-service.
4. Подготовьте диск к работе
После подключения отформатируйте диск, смонтируйте его и настройте права доступа.
-
Отформатируйте диск:
-
Получите список дисков виртуальной машины. В терминале выполните команду:
lsblkПодключенный диск отображается в конце списка с именем vdb.
-
Отформатируйте диск и создайте файловую систему:
sudo mkfs -t xfs /dev/vdb
-
-
Смонтируйте диск с именем backup-disk:
-
Создайте каталог для точки монтирования диска:
sudo mkdir /backup-disk -
Выполните монтирование в созданный каталог:
sudo mount /dev/vdb /backup-disk
-
-
Выдайте всем пользователям вашего проекта права на чтение и запись данных диска:
sudo chmod a+rw /backup-disk -
Проверьте с помощью команды lsblk, что диск backup-disk смонтирован и доступен.
5. Установите NodeJS и зависимости
На этом этапе установите NodeJS (через NVM), а также необходимые инструменты для работы сервиса резервного копирования.
-
В серийной консоли виртуальной машины последовательно выполните команды:
sudo apt-get update -ysudo apt-get install -y curlcurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bashsource ~/.bashrcnvm install 20nvm use 20 -
Проверьте, что NodeJS и npm установлены:
node -vnpm -vВ результате отобразятся установленные версии.
6. Создайте и соберите сервис резервного копирования
Разверните проект резервного копирования, настройте параметры TypeScript, создайте конфигурационные и исходные файлы.
-
Создайте директорию для файлов, которые будут копироваться:
mkdir files -
Создайте директорию проекта:
mkdir backup-service -
Перейдите в директорию проекта:
cd backup-service -
Проинициализируйте проект NodeJS:
npm init -y -
Установите зависимости:
npm install typescript ts-node @types/node --save-devnpm install node-cron fs-extranpm install @types/fs-extra --save-dev -
Сгенерируйте файл tsconfig.json:
npx tsc --init --module commonjs -
Откройте файл tsconfig.json для редактирования:
nano tsconfig.json -
Вставьте в файл конфигурацию:
{"compilerOptions": {"target": "es2016","module": "commonjs","outDir": "./dist","rootDir": "./src","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"sourceMap": true},"include": ["src/**/*"],"exclude": ["node_modules", "dist"]} -
Создайте директорию src и файл config.json:
mkdir srctouch config.jsonnano config.json -
Вставьте в файл конфигурацию:
{"inputDir": "/home/user1/files","outputDir": "/backup-disk/backups","backupInterval": "*/10 * * * *","logLevel": "info"} -
Создайте основной скрипт резервного копирования:
cd srctouch backup-service.tsnano backup-service.ts -
Вставьте код скрипта:
import * as fs from 'fs-extra';import * as path from 'path';import * as cron from 'node-cron';interface BackupConfig {inputDir: string;outputDir: string;backupInterval: string;logLevel: string;}class BackupService {private config: BackupConfig;constructor(configPath: string) {this.config = this.loadConfig(configPath);}private loadConfig(configPath: string): BackupConfig {try {const configData = fs.readFileSync(configPath, 'utf8');return JSON.parse(configData);} catch (error) {console.error('Error loading configuration:', error);process.exit(1);}}private async performBackup(): Promise<void> {try {const timestamp = new Date().toISOString().replace(/[:.]/g, '-');const backupDir = path.join(this.config.outputDir, `backup-${timestamp}`);console.log(`Starting backup from ${this.config.inputDir} to ${backupDir}`);// Ensure output directory existsawait fs.ensureDir(this.config.outputDir);// Copy directory recursivelyawait fs.copy(this.config.inputDir, backupDir);console.log(`Backup completed successfully at ${new Date().toISOString()}`);} catch (error) {console.error('Backup failed:', error);}}public start(): void {console.log(`Backup service started with interval: ${this.config.backupInterval}`);// Schedule backup jobcron.schedule(this.config.backupInterval, () => {this.performBackup();});// Perform initial backupthis.performBackup();}}// Start the serviceconst configPath = process.env.CONFIG_PATH || '../config.json';const backupService = new BackupService(configPath);backupService.start();// Keep the process runningprocess.on('SIGINT', () => {console.log('Backup service shutting down...');process.exit(0);});process.on('SIGTERM', () => {console.log('Backup service shutting down...');process.exit(0);}); -
Откройте файл package.json для редактирования:
cd ..nano package.json -
Отредактируйте скрипты запуска в секции scripts:
{"scripts": {"build": "tsc","start": "node dist/backup-service.js","dev": "ts-node src/backup-service.ts"},} -
Соберите проект:
npm run build -
Проверьте, что сборка успешно завершена — файл dist/backup-service.js создан:
cat dist/backup-service.js
7. Настройте запуск сервиса как systemd-службы
На заключительном этапе настройте автоматический запуск сервиса резервного копирования через systemd.
-
Создайте конфигурацию службы:
sudo nano /etc/systemd/system/backup-service.service -
Вставьте следующее содержимое:
[Unit]Description=Directory Backup ServiceAfter=network.target[Service]Type=simpleUser=user1Group=user1WorkingDirectory=/home/user1/backup-serviceExecStart=/home/user1/.nvm/versions/node/v20.19.3/bin/node /home/user1/backup-service/dist/backup-service.jsEnvironment=NODE_ENV=productionEnvironment=CONFIG_PATH=/home/user1/backup-service/config.jsonRestart=alwaysRestartSec=10StandardOutput=syslogStandardError=syslogSyslogIdentifier=backup-service[Install]WantedBy=multi-user.target -
Перезапустите менеджер systemd и активируйте службу:
sudo systemctl daemon-reloadsudo systemctl enable backup-servicesudo systemctl start backup-serviceПосле запуска службы копирование файлов будет автоматически запускаться каждые 10 минут.
-
Проверьте работоспособность службы:
sudo systemctl status backup-serviceРезультат:
backup-service.service - Directory Backup ServiceLoaded: loaded (/etc/systemd/system/backup-service.service; enabled; vendor preset: enabled)Active: active (running) since Tue 2025-07-15 13:35:55 MSK; 1h 3min agoMain PID: 2977 (node)Tasks: 11 (limit: 1016)Memory: 17.9MCPU: 213msCGroup: /system.slice/backup-service.service└─2977 /home/user1/.nvm/versions/node/v20.19.3/bin/node /home/user1/backup-service/dist/backup-service.jsУ работающей службы в поле «Active» отображается значение «active (running)».
-
Создайте несколько файлов в директории files:
cd ../filestouch 1.txttouch 2.txt -
Проверьте, что резервные копии директории files появляются в директории /backup-disk/backups.
cd ../../../backup-disk/backupsКаждая копия хранится в отдельной директории внутри /backup-disk/backups.
-
Перезагрузите виртуальную машину и убедитесь, что служба автоматически запустилась.
Что дальше
В этой лабораторной работе вы развернули надежный сервис резервного копирования на NodeJS и systemd в облаке Cloud.ru, освоили управление дополнительным диском и автоматизацию обслуживающих процессов Linux.
Узнавайте больше о работе с сервисами и получайте практические навыки управления облаком, выполняя лабораторные работы.
- Перед началом работы
- 1. Разверните виртуальную машину
- 2. Настройте группу безопасности
- 3. Подключите и настройте дополнительный диск
- 4. Подготовьте диск к работе
- 5. Установите NodeJS и зависимости
- 6. Создайте и соберите сервис резервного копирования
- 7. Настройте запуск сервиса как systemd-службы
- Что дальше