Резервное копирование и восстановление сценариев
Введение: Почему резервное копирование — это критически важно
В любой системе автоматизации, от простого умного дома до небольшого промышленного объекта, логика управления представляет собой ценнейший цифровой актив. Сценарии, которые вы создаете в Node-RED — это результат часов, а иногда и недель проектирования, кодирования и отладки. Потеря этой работы может привести не только к финансовым убыткам, но и к полной остановке функционирования объекта. Поэтому резервное копирование (бэкап) является не просто хорошей практикой, а критически важным процессом для любого профессионального инженера-автоматизатора.
Причины потери данных могут быть различными:
- Человеческий фактор: Случайное удаление потока, некорректное редактирование, ошибочная команда в терминале. Это самая распространенная причина.
- Отказ оборудования: Выход из строя SD-карты или другого носителя информации, на котором работает операционная система контроллера.
- Программный сбой: В редких случаях ошибка в программном обеспечении может привести к повреждению файлов конфигурации.
- Внешние факторы: Перебои с электропитанием, физическое повреждение контроллера.
Для эффективного управления резервными копиями необходимо точно знать, какие файлы являются ключевыми. На платформе контроллера HI вся основная конфигурация Node-RED хранится в специальной директории пользователя.
> 📋 Ключевые понятия:
> Вся конфигурация Node-RED, относящаяся к вашим сценариям, по умолчанию находится в скрытой директории в домашнем каталоге пользователя, под которым запущен сервис: `~/.node-red/`.
В этой директории находятся три файла, которые составляют основу вашей работы:
Понимание назначения и расположения этих файлов — первый шаг к построению надежной стратегии резервного копирования и восстановления.
---
Ручное резервное копирование через SSH
Самый прямой и надежный способ создать резервную копию — это скопировать файлы конфигурации непосредственно с файловой системы контроллера на ваш локальный компьютер или на сетевой диск. Для этого используется протокол SSH (Secure Shell) и утилита `scp` (Secure Copy).
> ⚠️ Внимание:
> Всегда останавливайте службу Node-RED перед копированием файлов сценариев. Node-RED периодически записывает изменения в файл `flows.json`. Копирование файла в момент записи может привести к его повреждению (созданию "битой" копии), что сделает восстановление из такого бэкапа невозможным.
Процесс ручного резервного копирования состоит из следующих шагов:
Откройте терминал на вашем компьютере (PowerShell в Windows, Терминал в macOS или Linux) и выполните команду подключения, заменив `user` и `controller_ip` на реальные данные вашего контроллера HI.
ssh user@192.168.1.10
Вам будет предложено ввести пароль.
После успешного подключения к контроллеру, остановите сервис Node-RED, чтобы гарантировать целостность файлов. На контроллере HI, работающем на Debian, это делается с помощью `systemctl`.
sudo systemctl stop nodered.service
Система запросит пароль пользователя для выполнения команды с правами администратора.
Копировать файлы по одному неудобно и можно что-то забыть. Лучшей практикой является создание единого архивного файла, содержащего всю директорию `.node-red` или, как минимум, ключевые файлы. Это делается с помощью утилиты `tar`.
Создадим архив с датой в имени файла для удобства версионирования.
# Создаем директорию для бэкапов, если ее еще нет
mkdir -p ~/backups
# Архивируем ключевые файлы в один файл с текущей датой
tar -czvf ~/backups/nodered_backup_$(date +%Y-%m-%d).tar.gz -C ~/.node-red flows.json flows_cred.json settings.js
* `tar` — утилита архивирования.
* `-c` — создать архив.
* `-z` — сжать с помощью gzip.
* `-v` — выводить информацию о процессе.
* `-f` — указать имя файла архива.
* `-C ~/.node-red` — сменить директорию на `.node-red` перед добавлением файлов, чтобы в архиве не было полного пути.
Теперь, когда служба остановлена и архив создан, откройте новый терминал на вашем локальном компьютере (не закрывая сессию SSH в первом) и используйте `scp` для загрузки файла.
# Формат: scp user@host:удаленный_путь локальный_путь
scp user@192.168.1.10:~/backups/nodered_backup_2023-10-27.tar.gz ./
Замените `2023-10-27` на актуальную дату. Файл будет скопирован в текущую директорию на вашем компьютере.
После завершения копирования не забудьте запустить сервис Node-RED обратно на контроллере. Вернитесь в окно терминала с SSH-сессией.
sudo systemctl start nodered.service
Этот метод, хоть и ручной, дает полный контроль над процессом и является обязательным навыком для любого инженера.
---
Восстановление сценариев из резервной копии
Восстановление — это обратный процесс, который может понадобиться после сбоя оборудования или в случае, если последние изменения в логике привели систему в неработоспособное состояние и нужно "откатиться" к стабильной версии.
> 💡 Подсказка:
> Перед тем как начать восстановление, всегда создавайте резервную копию текущего состояния (`flows.json`, `flows_cred.json`). Это ваш "спасательный круг". Если импортируемая резервная копия по какой-то причине окажется неработоспособной или не той версии, вы сможете легко вернуться к состоянию "до восстановления".
Процедура восстановления:
Откройте терминал на вашем локальном компьютере и используйте `scp` для копирования файла резервной копии в домашнюю директорию на контроллере.
# Формат: scp локальный_путь user@host:удаленный_путь
scp ./nodered_backup_2023-10-27.tar.gz user@192.168.1.10:~/
Подключитесь к контроллеру по SSH и немедленно остановите сервис Node-RED. Это предотвратит любые конфликты при замене файлов.
ssh user@192.168.1.10
sudo systemctl stop nodered.service
Как было сказано в подсказке, сохраним текущие файлы на всякий случай.
# Переименуем текущие файлы, добавив суффикс .bak
mv ~/.node-red/flows.json ~/.node-red/flows.json.bak
mv ~/.node-red/flows_cred.json ~/.node-red/flows_cred.json.bak
Теперь распакуем архив, который мы загрузили на шаге 1, непосредственно в рабочую директорию Node-RED.
# Распаковываем архив, файлы из него заменят отсутствующие
tar -xzvf ~/nodered_backup_2023-10-27.tar.gz -C ~/.node-red/
Команда `tar -x...` извлечет файлы (`flows.json`, `flows_cred.json`, `settings.js`) из архива и поместит их в директорию `~/.node-red/`.
Запускаем сервис и проверяем результат.
sudo systemctl start nodered.service
Откройте веб-интерфейс Node-RED в браузере. Вы должны увидеть именно те потоки, которые были на момент создания резервной копии. Проверьте, что все узлы с учетными данными (например, MQTT-брокеры) показывают статус "connected". Пройдитесь по основным сценариям, чтобы убедиться в их работоспособности.
Важно понимать, что все изменения, сделанные в редакторе после даты создания бэкапа и до момента восстановления, будут безвозвратно утеряны.
---
Автоматизация бэкапов с помощью Cron
Ручное резервное копирование эффективно, но полагаться только на него рискованно — можно забыть, отложить на потом и в итоге остаться без свежей копии в критический момент. Стандартный планировщик задач в Linux, cron, позволяет полностью автоматизировать этот процесс.
Cron — это демон (фоновая служба), который выполняет команды или скрипты по заданному расписанию. Расписание хранится в специальном файле, называемом crontab.Структура crontab
Каждая строка в файле crontab представляет собой одно задание и имеет следующий формат:
`минута час день_месяца месяц день_недели команда`
| Поле | Допустимые значения | Описание |
|---------------|---------------------|-----------------------------------|
| минута | 0-59 | Минута, в которую выполнится команда |
| час | 0-23 | Час (в 24-часовом формате) |
| день_месяца | 1-31 | Число месяца |
| месяц | 1-12 | Номер месяца |
| день_недели | 0-7 (0 и 7 - Вс) | День недели |
Символ `` означает "любое значение". Например, расписание `0 3 ` означает "каждый день в 3:00 ночи".
Скрипт для автоматического бэкапа
Создадим простой, но мощный shell-скрипт, который будет выполнять архивацию.
mkdir -p ~/scripts
nano ~/scripts/nodered_backup.sh
#!/bin/bash
# Директория, куда будут сохраняться бэкапы
BACKUP_DIR="/home/user/backups/nodered"
# Исходная директория Node-RED
SOURCE_DIR="/home/user/.node-red"
# Убедитесь, что директория для бэкапов существует
mkdir -p $BACKUP_DIR
# Формируем имя файла с датой и временем
FILENAME="nodered_backup_$(date +%Y-%m-%d_%H-%M-%S).tar.gz"
# Создаем архив (без остановки сервиса, т.к. это может прервать работу)
# Для максимальной надежности, cron-задачу лучше ставить на время наименьшей активности
tar -czf "$BACKUP_DIR/$FILENAME" -C "$SOURCE_DIR" flows.json flows_cred.json settings.js
# Удаляем бэкапы старше 7 дней, чтобы не занимать место на диске
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +7 -delete
echo "Node-RED backup created: $BACKUP_DIR/$FILENAME"
> ℹ️ Информация: Замените `/home/user` на реальный путь к домашней директории вашего пользователя. Вы можете получить его, выполнив команду `echo $HOME`.
chmod +x ~/scripts/nodered_backup.sh
Настройка расписания в cron
Теперь добавим наш скрипт в планировщик.
crontab -e
30 2 * /home/user/scripts/nodered_backup.sh > /dev/null 2>&1
`30 2 ` — расписание (02:30 ежедневно).
* `/home/user/scripts/nodered_backup.sh` — полный путь к нашему скрипту.
* `> /dev/null 2>&1` — перенаправляет весь стандартный вывод и вывод ошибок в "никуда", чтобы cron не отправлял вам письма по почте при каждом выполнении.
Теперь контроллер будет автоматически создавать резервную копию ваших сценариев и удалять старые копии, обеспечивая надежную защиту вашей работы без вашего участия.
---
Краткий обзор: Использование функции "Projects" для контроля версий
Простое копирование файлов — это хорошо, но для сложных объектов и командной работы существует более мощный инструмент, встроенный в Node-RED — Projects (Проекты). Эта функция превращает ваш редактор Node-RED в полноценную среду разработки с системой контроля версий Git.
> ℹ️ Информация:
> Функция Projects — это более продвинутый и надежный способ управления конфигурацией, особенно в крупных и командных проектах. Мы детально рассмотрим его настройку и использование в отдельном продвинутом модуле. Сейчас важно понять его концептуальные преимущества.
Что такое Node-RED Projects?
Когда вы активируете эту функцию, вместо одного файла `flows.json` Node-RED создает структуру проекта, которая включает:
- `flow.json`: Ваш основной файл потоков.
- `package.json`: Описывает зависимости проекта (используемые узлы из палитры).
- `README.md`: Файл для описания проекта.
- `.gitignore`: Файл для исключения из контроля версий (например, `flows_cred.json`).
Самое главное — вся эта папка становится Git-репозиторием. Это дает колоссальные преимущества:
Сравнение методов резервного копирования
| Критерий | Ручное копирование (scp) | Автоматизация (cron + tar) | Node-RED Projects (Git) |
|---------------------------|-------------------------------------|-----------------------------------------------------|--------------------------------------------------------|
| Простота настройки | Очень высокая | Средняя (требует написания скрипта и настройки cron) | Средняя (требуется включить в `settings.js` и знать основы Git) |
| Надежность | Низкая (зависит от человека) | Высокая (автоматически по расписанию) | Очень высокая (полная история + удаленное хранение) |
| Гранулярность | Резервная копия всего файла | Резервная копия всего файла на определенную дату | Сохранение каждого логического изменения (коммит) |
| Восстановление | Замена файла целиком | Замена файла целиком на дату | Откат к любой версии, слияние изменений |
| Командная работа | Не поддерживается | Не поддерживается | Идеально подходит, основной сценарий использования |
| Лучший сценарий | Быстрый бэкап перед рискованным изменением | Ежедневное резервное копирование на одном контроллере | Крупные проекты, командная разработка, сложные объекты |
Активация Projects выполняется добавлением одной строки в файл `settings.js`:
editorTheme: {
projects: {
enabled: true
}
}
После перезапуска Node-RED предложит вам создать ваш первый проект.
---
Резюме и ключевые выводы
В этом уроке мы рассмотрели фундаментально важную тему — обеспечение сохранности вашей работы через резервное копирование. Отсутствие стратегии бэкапа является профессиональной халатностью и может привести к катастрофическим последствиям на реальном объекте.
Мы изучили три основных подхода, каждый из которых имеет свою область применения:
- Ручное копирование через `scp`: Быстрый и простой метод, идеально подходящий для создания "точки сохранения" непосредственно перед внесением значительных изменений в работающую систему.
- Автоматизация с помощью `cron`: "Золотой стандарт" для обеспечения регулярных бэкапов на одиночном контроллере. Устанавливается один раз и защищает вашу работу в фоновом режиме.
- Система `Projects` с Git: Наиболее мощный и профессиональный подход, предоставляющий не просто бэкап, а полноценный контроль версий, историю изменений и инструменты для командной работы. Это выбор для сложных и долгосрочных проектов.
Ключевой вывод урока: на каждом объекте, который вы внедряете, должна быть реализована как минимум одна стратегия резервного копирования. Для большинства объектов комбинация из автоматического `cron`-бэкапа и базовых знаний ручного копирования является достаточной и необходимой мерой. Всегда помните, что файлы `flows.json` и `flows_cred.json` — это ваш минимально необходимый набор для восстановления логики автоматизации после любого сбоя.
Что дальше?
Теперь, когда вы умеете защищать свою работу, мы готовы перейти к созданию более сложных и интеллектуальных сценариев. В следующем уроке мы углубимся в работу с контекстом, научимся сохранять состояние устройств между перезагрузками контроллера и создадим наши первые конечные автоматы (FSM) для управления сложными системами, такими как климат-контроль.