Бэкап и восстановление Rhasspy
Rhasspy ценят именно за то, что ни одна фраза, сказанная дома, не улетает во внешнее облако — но эта же локальность оборачивается минусом при аварии сервера: нет чужого бэкенда, который молча хранит копию ваших настроек. Всё, что вы годами дотачивали руками — сотни обученных фраз-команд, названия комнат и устройств в слотах, поправленные словарные произношения, — лежит только на вашем диске. Потерять его означает не переустановку пакета за пять минут, а несколько вечеров заново надиктовывать и тестировать intent'ы. Разберём, что в Rhasspy действительно критично копировать, чем это автоматизировать и как поднять голосового ассистента на новом сервере так, чтобы он узнавал прежние команды с первого запуска.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что бэкапить в Rhasspy: профиль, слоты и обученные модели
Если вы разворачивали Rhasspy в Docker (стандартный способ для VPS), всё состояние системы живёт в одном смонтированном каталоге — обычно ./profiles, а внутри него подкаталог по языку, например ru/. Разберём, что там критично, а что переживёт потерю без последствий.
| Данные | Где лежат | Обязательно бэкапить | Восстановимо без бэкапа |
|---|---|---|---|
| Настройки профиля: MQTT-хост, wake word, звук, пути к движкам | ru/profile.json | Да | Нет — придётся настраивать заново вручную |
| Обученные голосовые команды (intents) | ru/sentences.ini | Да | Нет — самый трудоёмкий актив, часто накапливается месяцами |
| Значения слотов (комнаты, устройства, сценарии) | ru/slots/ | Да | Нет — без них часть команд из sentences.ini не соберётся в грамматику |
| Кастомный словарь произношений | ru/custom_words.txt, ru/g2p_custom.fst (если использовался) | Да | Частично — редкие слова придётся подбирать заново на слух |
| Скачанные модели: акустическая (Kaldi/Vosk), wake word, TTS-голос | ru/acoustic_model/, ru/kaldi/, каталоги wake-word и TTS движков | Опционально | Да, технически перекачиваются из репозитория моделей Rhasspy — но не мгновенно и зависят от доступности внешнего репо |
| Скомпилированный граф NLU (кэш обучения intent-распознавателя) | ru/intent.pickle / ru/graph.pickle (имя зависит от версии) | Нет | Да, пересобирается автоматически при следующем обучении |
| MQTT-брокер (если свой Mosquitto рядом) — конфиг и ACL | /etc/mosquitto/ или volume контейнера | Да, если настраивали вручную | Retained-сообщения и очередь — нет, но это некритичное runtime-состояние |
Главное здесь — не путать «модели» и «ваши данные». Акустическая модель и голос TTS — чужой артефакт, который Rhasspy скачивает один раз при выборе профиля; его можно перекачать снова. А sentences.ini и slots/ — результат вашей собственной работы: фразы вида (включи | выключи) свет (в гостиной | на кухне), привязанные к слотам с реальными именами устройств. Это невозможно восстановить иначе, чем из бэкапа или заново с нуля.
Простой бэкап: архив profiles-каталога вручную
Для домашней установки без строгих требований к RTO достаточно снять tar со всего каталога profiles, исключив тяжёлые скачиваемые модели:
mkdir -p /mnt/backup/rhasspy
tar --exclude='profiles/*/acoustic_model' \
--exclude='profiles/*/kaldi' \
--exclude='profiles/*/*.pickle' \
--exclude='profiles/*/tts' \
-czf /mnt/backup/rhasspy/rhasspy-$(date +%F).tar.gz \
-C /opt/rhasspy profiles
Проверить, сколько реально весят скачанные модели против ваших собственных настроек, легко:
du -sh /opt/rhasspy/profiles/ru/acoustic_model 2>/dev/null
du -sh /opt/rhasspy/profiles/ru/sentences.ini /opt/rhasspy/profiles/ru/slots
Разница обычно на два-три порядка: модели весят сотни мегабайт, а sentences.ini со slots — десятки-сотни килобайт. Если не хотите зависеть от доступности репозитория моделей Rhasspy при восстановлении — включите модели в бэкап тоже, но держите их в отдельном, более редком снапшоте.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверАвтоматизация через restic: дедупликация и офсайт
Ручной tar быстро надоедает и не масштабируется на регулярную схему. Для автоматических прогонов удобнее restic — дедупликация экономит место между снимками, а шифрование защищает архив с MQTT-паролями из profile.json, если он окажется на чужом сервере. Подробно про установку и работу с restic — в статье про бэкап и восстановление restic, здесь — только применение к Rhasspy.
Инициализация репозитория (один раз):
export RESTIC_REPOSITORY=/mnt/backup-disk/rhasspy-restic
export RESTIC_PASSWORD_FILE=/root/.restic-rhasspy-pass
restic init
Сам бэкап, с исключением тяжёлых и легко перекачиваемых артефактов:
restic backup /opt/rhasspy/profiles \
--tag rhasspy \
--exclude='/opt/rhasspy/profiles/*/acoustic_model' \
--exclude='/opt/rhasspy/profiles/*/kaldi' \
--exclude='/opt/rhasspy/profiles/*/*.pickle'
Если решили всё же бэкапить и модели — уберите соответствующие --exclude и заложите больше места в репозитории; restic дедуплицирует между прогонами, поэтому повторные бэкапы одной и той же модели почти не займут места после первого снимка.
Для офсайта — копии не на том же диске, где крутится сам Rhasspy, — направьте RESTIC_REPOSITORY на отдельный сервер по SFTP. Требования к серверу под архив (диск, память, тарифы по локациям) разобраны в статье про VPS для бэкапов и архива. Локальный бэкап на том же диске защищает только от ошибки в конфиге или неудачного редактирования sentences.ini, а не от отказа диска или всего сервера.
Автоматизация: скрипт и systemd timer
Собираем в один скрипт и вешаем на таймер — так виден статус через systemctl и есть журнал ошибок, в отличие от тихо падающего cron:
#!/usr/bin/env bash
# /usr/local/bin/rhasspy-backup.sh
set -euo pipefail
PROFILES_DIR=/opt/rhasspy/profiles
export RESTIC_REPOSITORY=/mnt/backup-disk/rhasspy-restic
export RESTIC_PASSWORD_FILE=/root/.restic-rhasspy-pass
restic backup "$PROFILES_DIR" \
--tag rhasspy \
--exclude="$PROFILES_DIR/*/acoustic_model" \
--exclude="$PROFILES_DIR/*/kaldi" \
--exclude="$PROFILES_DIR/*/*.pickle"
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 3 --prune
chmod +x /usr/local/bin/rhasspy-backup.sh
Unit и таймер:
# /etc/systemd/system/rhasspy-backup.service
[Unit]
Description=Rhasspy profiles backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/rhasspy-backup.sh
# /etc/systemd/system/rhasspy-backup.timer
[Unit]
Description=Daily Rhasspy backup
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now rhasspy-backup.timer
systemctl list-timers | grep rhasspy
Persistent=true важен для домашнего сервера, который иногда перезагружают вручную: если он был выключен в момент запуска по расписанию, systemd выполнит пропущенный прогон сразу после старта. Ежедневный таймер имеет смысл, пока вы активно донастраиваете команды и хотите откатиться на вчерашнюю версию sentences.ini, если сегодняшняя правка что-то сломала.
Восстановление Rhasspy на новом сервере
Порядок действий при переезде на новый сервер или после полной потери старого:
1. Поднимите базовое окружение. Установите Docker, создайте /opt/rhasspy и перенесите тот же docker-compose.yml, что использовался на прежнем сервере — с теми же портами, mem_limit и монтированием ./profiles:/profiles.
2. Восстановите profiles из restic до первого запуска контейнера:
export RESTIC_REPOSITORY=/mnt/backup-disk/rhasspy-restic
export RESTIC_PASSWORD_FILE=/root/.restic-rhasspy-pass
mkdir -p /opt/rhasspy/profiles
restic restore latest --target /opt/rhasspy/profiles --path /opt/rhasspy/profiles
Порядок важен так же, как в Home Assistant: если контейнер успеет стартовать первым, он создаст дефолтный profile.json и скачает базовые модели поверх пустого каталога, и файлы придётся аккуратно сливать вручную вместо чистого восстановления.
3. Проверьте права на файлы — после восстановления владелец может не совпадать с тем, под кем работает процесс в контейнере:
chown -R 1000:1000 /opt/rhasspy/profiles # UID уточните в вашем docker-compose.yml
4. Запустите и дайте докачаться моделям, если вы их не бэкапили:
cd /opt/rhasspy
docker compose up -d
docker compose logs -f rhasspy
Первый старт без бэкапа моделей может занять заметно дольше обычного — Rhasspy докачивает акустическую модель, wake word и TTS-голос из внешнего репозитория. Дождитесь полного завершения загрузки, прежде чем тестировать распознавание.
5. Переобучите intent-распознаватель. Даже если sentences.ini и slots/ восстановились полностью, скомпилированный граф NLU вы, скорее всего, не бэкапили — Rhasspy обычно переобучается сам при старте с изменившимся профилем, но если команды не срабатывают, зайдите в веб-интерфейс (http://<ip>:12101) и нажмите Train вручную, либо дёрните POST /api/train.
6. Проверьте интеграцию с Home Assistant или Node-RED. Сами обработчики intent'ов (что физически происходит по команде «включи свет») обычно живут не в Rhasspy, а в связанной системе — если вы восстанавливаете весь стек умного дома целиком, разберите заодно бэкап и восстановление Home Assistant и, если используете сценарии, бэкап и восстановление Node-RED — без них голосовые команды будут распознаваться, но ничего не включать.
Типичные грабли при бэкапе и восстановлении Rhasspy
- Бэкап
sentences.iniбезslots/. Фразы вида{room_names}в грамматике ссылаются на файлы вslots/— без них при переобучении Rhasspy либо упадёт с ошибкой компиляции, либо тихо проигнорирует часть команд. - Понадеялись, что модели всегда докачаются. Репозиторий моделей Rhasspy — внешний ресурс вне вашего контроля; на момент восстановления он может быть медленным или временно недоступным. Для критичной инсталляции безопаснее иметь хотя бы один архивный снимок моделей на своей стороне.
- Восстановление поверх уже проинициализированного контейнера. Если Rhasspy успел стартовать и скачать дефолтный профиль до восстановления бэкапа, в каталоге уже лежат новые файлы — копирование архива поверх может дать конфликт версий. Восстанавливайте в чистый, ещё не стартовавший каталог.
- Забыли, что MQTT-пароли лежат в
profile.jsonоткрытым текстом. Незашифрованный бэкап (обычныйtarна общем диске или в облаке) — это утечка учётных данных от MQTT-шины; используйте шифрование restic или отдельный зашифрованный том. - Бэкап на том же диске, что и сам сервер. Копия рядом с оригиналом не спасает при отказе диска целиком — нужна отдельная площадка, локальная на другом носителе или на другом сервере.
- Ни разу не проверяли восстановление. Работающий
backupне гарантирует работающийrestore— стоит хотя бы раз в несколько месяцев поднимать тестовое восстановление на отдельном сервере или контейнере, не дожидаясь реальной аварии.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужно ли останавливать Rhasspy перед бэкапом?
Нет — sentences.ini, slots/ и profile.json не переписываются построчно во время работы, они меняются только когда вы явно редактируете команды через веб-интерфейс. Риск получить архив в промежуточном состоянии минимален.
Обязательно ли бэкапить скачанные модели STT и TTS?
Нет, это переиспользуемые артефакты — Rhasspy докачивает их заново из своего репозитория при первом запуске с указанным профилем. Бэкапить их стоит, только если критично время восстановления или репозиторий моделей исторически недоступен из вашей локации.
Что произойдёт, если восстановить sentences.ini, но забыть slots/?
Команды, ссылающиеся на слоты, либо не соберутся в грамматику при обучении, либо перестанут распознаваться — Rhasspy запустится нормально, проблема всплывёт только при попытке произнести конкретную команду.
Как часто нужен бэкап Rhasspy?
Для стабильной конфигурации, где команды не меняются месяцами, достаточно еженедельного снапшота. Если активно донастраиваете intents и slots, разумнее ежедневный таймер — откат к вчерашней рабочей версии займёт секунды вместо повторного надиктовывания фраз.
Можно ли перенести Rhasspy на сервер с другой архитектурой CPU (например, с x86 на ARM)?
Сам профиль (sentences.ini, slots, profile.json) переносится без проблем — это текстовые файлы. А бинарные модели STT и TTS иногда собраны под конкретную архитектуру; надёжнее дать Rhasspy докачать их заново под новый сервер, а не переносить бэкапом.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →