Резервное копирование и восстановление Flows
id: COURSE-01-M07-L02
title: "Резервное копирование и восстановление Flows"
level: foundation
tags: ["резервное копирование", "восстановление", "node-red", "backup", "restore", "cron", "shell", "отказоустойчивость"]
prerequisites: ["COURSE-01-M07-L01", "COURSE-00-M03"]
version: 1.0
status: published
---
Введение: критическая важность резервных копий
> ⚠️ Внимание: Даже самый надежный промышленный контроллер не застрахован от сбоя накопителя. Резервная копия — это не рекомендация, а обязательное условие для любой профессиональной инсталляции.
В предыдущем уроке, COURSE-01-M07-L01 «Что может пойти не так?», мы подробно рассмотрели различные риски, угрожающие стабильной работе системы умного дома, от аппаратных сбоев до человеческого фактора. Центральным элементом, уязвимым для всех этих угроз, является логика автоматизации — ваши сценарии Node-RED.
Сценарии Node-RED (flows) — это не просто набор соединенных узлов. Это интеллектуальная собственность инженера и квинтэссенция функциональности всего объекта. В них заложены часы, а иногда и недели работы: отладка алгоритмов климат-контроля, настройка световых сцен, интеграция с внешними сервисами и создание уникальных пользовательских функций. Потеря этих данных равносильна потере «мозга» умного дома.
Рассмотрим типичные сценарии, ведущие к потере данных:
Экономическая и репутационная стоимость простоя системы очевидна. Для коммерческого объекта, такого как гостиница или офис, это прямые убытки. Для частного дома — это потеря комфорта, безопасности (если завязаны системы охраны и оповещения) и, что не менее важно, колоссальный удар по доверию клиента к инсталлятору. Восстановление логики с нуля может занять дни, в течение которых объект будет функционировать в аварийном режиме или не функционировать вовсе. Регулярное создание резервных копий — это простая и эффективная страховка от подобных катастроф.
Анатомия Node-RED: что и где хранит свои данные
Для того чтобы грамотно выполнять резервное копирование и восстановление, необходимо точно знать, какие файлы являются критически важными и где они расположены в файловой системе контроллера. Вся конфигурация Node-RED по умолчанию хранится в скрытой директории в домашнем каталоге пользователя (`/home/user/` или `/root/`), который её запускает. Эта директория называется `.node-red`.
Структура этой директории выглядит следующим образом:
/home/user/.node-red/
|-- flows.json
|-- flows_cred.json
|-- settings.js
|-- package.json
|-- package-lock.json
|-- node_modules/
| |-- node-red-contrib-example-1/
| `-- node-red-contrib-example-2/
`-- lib/
|-- flows/
`-- functions/
Рассмотрим ключевые файлы и их назначение:
- `flows.json`: Это самый главный файл. Он содержит всю вашу логику автоматизации в формате JSON. Каждый узел, каждая связь между узлами, их координаты на холсте, конфигурация (например, MQTT-топики, IP-адреса устройств) — всё это хранится здесь. Потеря этого файла равносильна полной потере всех сценариев.
- `flows_cred.json`: Файл-хранилище «секретов». Node-RED автоматически шифрует и помещает в этот файл любые поля, помеченные как "credential" (учетные данные). Это могут быть пароли от баз данных (MySQL), ключи API для облачных сервисов, токены доступа для MQTT-брокеров. Этот файл тесно связан с `flows.json`. Без него ваши flows не смогут авторизоваться во внешних системах. Крайне важно обеспечить безопасность этого файла и никогда не публиковать его в открытых источниках (например, в публичных Git-репозиториях).
- `settings.js`: Файл глобальной конфигурации самого экземпляра Node-RED. Здесь настраиваются такие параметры, как:
* Включение/отключение аутентификации для доступа к редактору.
* Настройки логирования.
* Путь к библиотеке пользовательских функций.
* Ключ для шифрования `flows_cred.json`.
Хотя этот файл меняется редко, его резервная копия важна для быстрого развертывания идентичной среды на новом контроллере.
- `package.json`: Стандартный для Node.js файл, который содержит список всех дополнительно установленных модулей (палет),例如 `node-red-dashboard`, `node-red-contrib-modbus`, и т.д. Когда вы устанавливаете новый модуль через `Manage Palette`, он добавляется в этот файл. Этот файл критически важен для восстановления, так как он позволяет автоматически установить все необходимые зависимости.
> 💡 Подсказка: Для упрощения миграции и восстановления всегда храните файл `package.json` вместе с резервными копиями flow. Это позволит быстро переустановить все необходимые узлы одной командой `npm install` в директории `~/.node-red`.
Практика: ручное резервное копирование и восстановление
Существует два основных способа создания резервной копии вручную. Они отличаются полнотой и областью применения.
Метод 1: Экспорт через веб-интерфейс Node-RED
Это самый простой и быстрый способ сохранить копию текущего сценария.
* Current flow: Только активная в данный момент вкладка.
* All flows: Все вкладки в вашем редакторе.
* Selected nodes: Только выделенные узлы.
- Не требует доступа к командной строке контроллера.
- Быстро и просто.
- Экспортируется только `flows.json`! Учетные данные из `flows_cred.json` не сохраняются. При импорте такого flow на другой контроллер все пароли и токены придется вводить заново.
- Не сохраняются `settings.js` и список установленных палет (`package.json`).
Этот метод подходит для быстрого обмена фрагментами сценариев, но не годится для полноценного резервного копирования системы.
Метод 2: Копирование файлов из файловой системы
Это профессиональный и единственно верный способ создания полной ручной резервной копии. Он требует доступа к контроллеру по сети через SSH. Для копирования файлов используются утилиты `scp` (Secure Copy) или `sftp` (SSH File Transfer Protocol).
Пошаговый процесс резервного копирования:Предполагается, что вы подключены к контроллеру по SSH.
- Из Linux/macOS на ваш ПК:
# Создадим на локальной машине папку для бэкапа
mkdir -p ~/backups/nodered_controller_backup_$(date +%F)
# Копируем файлы с контроллера (замените user и 192.168.1.10 на ваши данные)
scp user@192.168.1.10:~/.node-red/flows.json ~/backups/nodered_controller_backup_$(date +%F)/
scp user@192.168.1.10:~/.node-red/flows_cred.json ~/backups/nodered_controller_backup_$(date +%F)/
scp user@192.168.1.10:~/.node-red/settings.js ~/backups/nodered_controller_backup_$(date +%F)/
scp user@192.168.1.10:~/.node-red/package.json ~/backups/nodered_controller_backup_$(date +%F)/
- Из Windows (с помощью PuTTY `pscp.exe`):
# pscp.exe должен быть в системном PATH или в текущей директории
# Создадим папку для бэкапа
New-Item -ItemType Directory -Force -Path "C:\backups\nodered_controller_backup"
# Копируем файлы
pscp.exe user@192.168.1.10:/home/user/.node-red/flows.json C:\backups\nodered_controller_backup\
pscp.exe user@192.168.1.10:/home/user/.node-red/flows_cred.json C:\backups\nodered_controller_backup\
Пошаговый процесс восстановления:
sudo systemctl stop nodered.service
scp ~/backups/nodered_controller_backup_YYYY-MM-DD/flows.json user@192.168.1.10:~/.node-red/
# Повторите для flows_cred.json и других файлов
# На контроллере, в директории ~/.node-red
npm install
sudo systemctl start nodered.service
sudo journalctl -f -u nodered.service
Практика: автоматизация бэкапов с помощью Cron и Shell-скрипта
Ручное резервное копирование эффективно, но зависит от дисциплины инженера. Для надежной защиты данных этот процесс необходимо автоматизировать. Стандартным инструментом для решения этой задачи в Linux является планировщик `cron`.
> 🔗 Связанный материал: Подробно о работе с командной строкой и скриптами в Linux мы говорили в модуле COURSE-00-M03 «Основы Linux для инженера умного дома». Рекомендуем освежить знания.
План действий:1. Создание Shell-скрипта для бэкапа
Создадим файл `nodered_backup.sh` в домашней директории пользователя, например, в `~/scripts/`.
#!/bin/bash
# --- НАСТРОЙКИ ---
# Директория с файлами Node-RED
SOURCE_DIR="/home/user/.node-red"
# Директория для хранения локальных бэкапов
BACKUP_DIR="/home/user/backups/nodered"
# Количество дней хранения локальных бэкапов
RETENTION_DAYS=7
# Имя файла бэкапа с датой
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILENAME="nodered-backup-${TIMESTAMP}.tar.gz"
# --- ОСНОВНАЯ ЛОГИКА ---
echo "Starting Node-RED backup..."
# Создаем директорию для бэкапов, если она не существует
mkdir -p ${BACKUP_DIR}
# Создаем архив .tar.gz с необходимыми файлами
# ВАЖНО: Указываем абсолютные пути к файлам для надежности
tar -czvf ${BACKUP_DIR}/${BACKUP_FILENAME} \
${SOURCE_DIR}/flows.json \
${SOURCE_DIR}/flows_cred.json \
${SOURCE_DIR}/settings.js \
${SOURCE_DIR}/package.json
echo "Backup created at ${BACKUP_DIR}/${BACKUP_FILENAME}"
# Удаляем старые бэкапы (старше RETENTION_DAYS)
echo "Cleaning up old backups..."
find ${BACKUP_DIR} -type f -mtime +${RETENTION_DAYS} -name 'nodered-backup-*.tar.gz' -delete
echo "Backup process finished."
Не забудьте сделать скрипт исполняемым: `chmod +x ~/scripts/nodered_backup.sh`.
Этот скрипт архивирует 4 ключевых файла в один `tar.gz` архив с меткой времени и удаляет архивы старше 7 дней.
2. Настройка `crontab`
Теперь добавим задание в `cron`.
# Запускать бэкап Node-RED каждый день в 3:00 ночи
0 3 * /home/user/scripts/nodered_backup.sh >> /home/user/logs/nodered_backup.log 2>&1
`0 3 `: означает "в 0 минут 3-го часа, каждый день, каждый месяц, каждый день недели".
* `/home/user/scripts/nodered_backup.sh`: полный путь к нашему скрипту.
* `>> /home/user/logs/nodered_backup.log 2>&1`: перенаправляет весь вывод (стандартный и ошибки) в лог-файл для последующего анализа.
Для повышения надежности архив можно копировать на внешний носитель, например, на сетевой диск (NAS). Для этого в конец скрипта можно добавить команду `rsync`:
# ... после создания архива tar ...
# --- КОПИРОВАНИЕ НА ВНЕШНИЙ СЕРВЕР (NAS) ---
# Адрес и директория на удаленном сервере
REMOTE_USER="backupuser"
REMOTE_HOST="192.168.1.50"
REMOTE_DIR="/volume1/backups/smart_home_controller/"
echo "Syncing backup to remote server..."
rsync -avz --remove-source-files ${BACKUP_DIR}/${BACKUP_FILENAME} ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}
Эта команда скопирует архив на NAS и удалит исходный файл с контроллера, чтобы не занимать место. Для работы `rsync` по SSH без пароля требуется предварительная настройка SSH-ключей.
Итоги и лучшие практики: стратегия 3-2-1
Мы рассмотрели ручные и автоматизированные методы резервного копирования. Но наличие бэкапа — это лишь половина дела. Важна целостная стратегия его хранения и проверки.
> ⚠️ Внимание: Резервная копия, которую ни разу не проверяли на восстановление, не может считаться надежной. Регулярно (раз в квартал) проводите тестовые восстановления на стенде или некритичном оборудовании.
Золотым стандартом в индустрии является правило «3-2-1»:
- 3 копии данных. Храните как минимум ТРИ копии ваших данных. Одна — это рабочая копия на самом контроллере. Две другие — резервные.
- 2 разных носителя. Храните копии как минимум на ДВУХ разных типах носителей. Например, SD-карта контроллера и жесткие диски в сетевом хранилище (NAS). Это защищает от отказа определенного типа носителя.
- 1 копия вне площадки (off-site). Как минимум ОДНА из копий должна храниться за пределами основного объекта. Это может быть облачное хранилище (S3, Dropbox, Google Drive) или физический носитель в другом здании. Эта мера защищает от локальных катастроф: пожара, затопления, кражи оборудования.
Наконец, документируйте вашу стратегию и процедуру восстановления. Создайте простой runbook, который станет частью проектной документации для объекта. В нем должно быть четко описано, где хранятся бэкапы, как получить к ним доступ и какие шаги необходимо предпринять для полного восстановления системы. Это сэкономит драгоценное время и нервы в экстренной ситуации, особенно если восстановление будет проводить другой специалист.
---
Лабораторные работы
COURSE-01-M07-LAB01: Ручное резервное копирование и восстановление
- Задача: Создать полную ручную резервную копию файлов Node-RED с контроллера, симулировать "аварию", удалив flow, и успешно восстановить его из резервной копии.
- Чек-лист:
2. [ ] С помощью `scp` или SFTP-клиента (FileZilla, WinSCP) скопировать файлы `flows.json`, `flows_cred.json`, `settings.js`, `package.json` из `~/.node-red` на ваш локальный ПК.
3. [ ] Открыть интерфейс Node-RED, удалить один или несколько узлов/вкладок и нажать "Deploy". Убедиться, что логика удалена.
4. [ ] Остановить сервис Node-RED на контроллере (`sudo systemctl stop nodered.service`).
5. [ ] Скопировать файл `flows.json` из резервной копии обратно на контроллер.
6. [ ] Запустить сервис Node-RED (`sudo systemctl start nodered.service`).
7. [ ] Открыть интерфейс Node-RED и убедиться, что удаленная логика восстановлена.
- Рубрика оценивания: Задание считается выполненным, если после всех шагов удаленная ранее логика полностью восстановлена и функционирует.
COURSE-01-M07-LAB02: Настройка автоматического бэкапа
- Задача: Создать и настроить shell-скрипт и задание `cron` для ежедневного автоматического резервного копирования файлов Node-RED.
- Чек-лист:
2. [ ] Создать исполняемый файл `~/scripts/nodered_backup.sh`, используя шаблон из урока.
3. [ ] Запустить скрипт вручную (`./scripts/nodered_backup.sh`) и убедиться, что в папке `~/backups/nodered` появился архив `.tar.gz`.
4. [ ] Открыть `crontab -e` и добавить задание на запуск скрипта в любое время (например, каждые 5 минут для теста: `/5 *`).
5. [ ] Подождать указанное время и проверить, появился ли новый архив в папке `~/backups/nodered`.
6. [ ] Проверить, что механизм ротации (удаления старых бэкапов) работает, изменив `RETENTION_DAYS=0` и запустив скрипт несколько раз.
7. [ ] Вернуть настройки `crontab` к запуску раз в день (например, `0 3 *`).
- Рубрика оценивания: Задание считается выполненным, если задание `cron` успешно создано и при его выполнении в целевой директории появляется актуальный архив с файлами Node-RED.
---
Тест для самопроверки (Quiz)
COURSE-01-M07-QUIZ---
Мини-runbook: "Что делать, если..."
Проблема: После восстановления из бэкапа Node-RED не запускается или падает в цикле перезагрузки.---
📋 Ключевые понятия:
- Резервное копирование (Backup)
- Восстановление после сбоя (Disaster Recovery)
- `flows.json`
- `flows_cred.json`
- Cron (планировщик задач)
- Shell scripting (сценарии командной строки)
- SCP/SFTP (протоколы безопасной передачи файлов)
- Стратегия бэкапа 3-2-1
- Архивация (`tar`)
✨ Результаты обучения:
- Выполнять ручное резервное копирование и восстановление файлов Node-RED.
- Создавать и настраивать shell-скрипт и задачу `cron` для автоматического резервного копирования.
- Объяснять назначение ключевых файлов конфигурации Node-RED: `flows.json`, `flows_cred.json`, `settings.js`.
- Применять стратегию резервного копирования «3-2-1» к проектам умного дома.
---
Что дальше?
В следующем уроке мы рассмотрим, как повысить надежность критически важных сценариев, не полагаясь только на программную логику Node-RED.
➡️ Следующий урок: COURSE-01-M07-L03: Использование EEPROM и функции ПЛК для критически важных сценариев