С помощью этого руководства вы развернете сервис для автоматического создания резервных копий выбранной директории на виртуальной машине.
Вы создадите служебный NodeJS-сервис, научитесь работать с дополнительным виртуальным диском, а также настроите запуск сервиса как systemd-службы для автоматизации процессов.
Вы будете использовать следующие сервисы:
Виртуальная машина free tier — сервис, в рамках которого предоставляется бесплатная виртуальная машина с готовой конфигурацией.
Systemd — системный менеджер служб в Linux.
NodeJS и TypeScript — стек для разработки серверных приложений на языке JavaScript.
Шаги:
Если вы уже зарегистрированы, войдите под своей учетной записью.
На виртуальной машине будет запущена служба резервного копирования данных.
Создайте бесплатную виртуальную машину со следующими параметрами:
В поле Название укажите название виртуальной машины, например backup-service.
На вкладке Публичные выберите образ Ubuntu 22.04.
Назначьте публичный IP-адрес виртуальной машине — оставьте включенной опцию Подключить публичный IP. Для виртуальной машины будет арендован и назначен прямой публичный IP.
В поле Логин укажите логин пользователя виртуальной машины, например user1.
Выберите метод аутентификации — пароль.
Убедитесь, что в личном кабинете на странице сервиса «Виртуальные машины»:
отображается виртуальная машина backup-service;
статус виртуальной машины — «Запущена»;
виртуальной машине назначен публичный IP-адрес.
Группы безопасности в облаке Evolution позволяют контролировать входящий и исходящий трафик для создаваемых ресурсов.
Вы настроите правила фильтрации трафика — разрешите весь исходящий трафик виртуальной машины. Создайте новую группу безопасности со следующими параметрами:
Выберите Зону доступности, в которой необходимо разместить группу безопасности. Укажите ту же зону доступности, что выбрана для виртуальной машины backup-service.
Укажите Название группы безопасности, например allow-outbound-traffic.
Добавьте правило исходящего трафика:
Протокол — Любой.
Порт — оставьте пустым.
Тип адресата — IP-адрес.
Адресат — 0.0.0.0/0.
Назначьте созданную группу безопасности виртуальной машине backup-service.
Убедитесь, что на странице виртуальной машины в разделе Сетевые параметры для сетевого интерфейса с публичным IP отображается группа безопасности allow-outbound-traffic.
Резервные копии рекомендуется хранить отдельно от основного системного диска.
Создайте диск со следующими параметрами:
В поле Зона доступности укажите ту же зону, что выбрана для виртуальной машины.
Укажите название диска — backup-disk.
Укажите размер диска — 10 ГБ.
Подключите диск к виртуальной машине:
В строке созданного диска нажмите и выберите Подключить.
Выберите виртуальную машину backup-service в списке и нажмите Подключить.
Убедитесь, что в личном кабинете на странице сервиса «Диски»:
отображается диск backup-disk;
статус диска — «Используется»;
в столбце Ресурс указана виртуальная машина backup-service.
После подключения отформатируйте диск, смонтируйте его и настройте права доступа.
Отформатируйте диск:
Получите список дисков виртуальной машины. В терминале выполните команду:
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 смонтирован и доступен.
На этом этапе установите 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
В результате отобразятся установленные версии.
Разверните проект резервного копирования, настройте параметры 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
На заключительном этапе настройте автоматический запуск сервиса резервного копирования через 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.