Бэкап и восстановление Dashy
Dashy — не просто список ссылок: под капотом у него статус-мониторинг десятков подключённых сервисов, виджеты с живыми данными и, часто, конфиг, который правился неделями через встроенный UI-редактор, а не руками в YAML. Именно поэтому его потеря особенно обидна — восстановить по памяти, какие URL стояли в проверках статуса и какие API-ключи были в виджетах погоды или курса валют, объективно тяжелее, чем воссоздать простой список закладок. Ниже — рабочая схема бэкапа и восстановления Dashy: что копировать, как автоматизировать и на что обратить внимание именно из-за статус-чеков и виджетов.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что нужно бэкапить в Dashy
Основа конфигурации Dashy — файл conf.yml. В зависимости от версии образа и того, как вы разворачивали контейнер, он может лежать по пути /app/public/conf.yml или, в более новых сборках, в каталоге /app/user-data/conf.yml — сверьтесь со своим docker-compose.yml, чтобы знать точный путь на хосте. Вокруг него обычно есть ещё несколько важных объектов:
dashy-data/
├── conf.yml # секции, элементы (items), статус-чеки, виджеты
├── pages/ # доп. страницы, если используете multi-page
│ ├── work.yml
│ └── home.yml
├── users.yml # список пользователей и хеши паролей (если включена auth)
├── item-icons/ # локально загруженные кастомные иконки
├── custom.css # кастомные стили
└── custom.js # кастомный JS (если используете)
Отдельная особенность Dashy — встроенный редактор конфигурации прямо в интерфейсе: изменения, сделанные через UI (добавили карточку, поправили виджет), записываются обратно в conf.yml на диске, а не только в памяти браузера. Это удобно, но означает, что конфиг может измениться в любой момент без вашего явного git commit — бэкап «руками, когда вспомнил» здесь работает хуже, чем регулярный автоматический.
Секретов в конфиге Dashy обычно больше, чем в статичных дашбордах: API-ключи погодных и курсовых виджетов (apiKey в блоке widgets), заголовки авторизации для статус-чеков внутренних сервисов (statusCheckHeaders), иногда — токены для приватных Docker-реестров, если используете виджет docker-stats. Хеши паролей из users.yml тоже не должны лежать в открытом доступе. Всё это — повод либо шифровать бэкап, либо держать его в приватном хранилище с ограниченным доступом.
Ручной бэкап конфигурации
Быстрее всего — обычный tar каталога с данными:
mkdir -p /opt/backups/dashy
tar -czf /opt/backups/dashy/dashy-config-$(date +%Y%m%d-%H%M%S).tar.gz \
-C /opt/dashy dashy-data
Проверка, что архив не пустой и читается:
tar -tzf /opt/backups/dashy/dashy-config-*.tar.gz | head -20
Для регулярности — задача в cron с ротацией последних 14 копий:
crontab -e
0 3 * * * /usr/bin/tar -czf /opt/backups/dashy/dashy-config-$(date +\%Y\%m\%d).tar.gz -C /opt/dashy dashy-data && find /opt/backups/dashy -name '*.tar.gz' -mtime +14 -delete
Такой бэкап решает основной сценарий — сломали конфиг правкой или удалили карточку по ошибке. Но если он лежит на том же диске, что и сам сервер, отказ диска убьёт и оригинал, и копию. Доставку наружу можно решить через rclone в объектное хранилище или rsync на второй сервер — либо через отдельный механизм restic ниже.
Отдельно стоит знать, что у Dashy есть встроенная функция облачного бэкапа в настройках интерфейса (Settings → Config → Cloud Backup): конфиг шифруется на стороне клиента и сохраняется на стороннем сервисе разработчика по сгенерированным ID и паролю, откуда его можно потом восстановить на любой установке. Это удобно для быстрого переноса между машинами, но полагаться на неё как на единственный бэкап не стоит — сервис вне вашего контроля, и для продакшн-сценария нужна независимая копия на своей инфраструктуре.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверАвтоматический бэкап через restic
Из-за API-ключей виджетов и заголовков авторизации статус-чеков конфиг Dashy стоит бэкапить с шифрованием, даже если он занимает пару мегабайт. Если restic уже развёрнут для других сервисов — просто добавьте каталог Dashy в общий репозиторий; если ещё нет, у нас есть отдельный разбор — как установить и настроить restic на VPS с инициализацией репозитория и первым бэкапом.
Бэкап с тегом для удобного поиска снапшотов:
export RESTIC_PASSWORD='ваш-пароль-репозитория'
restic backup /opt/dashy/dashy-data \
--repo /mnt/backup-storage/restic-repo \
--tag dashy
Политика хранения — например, 7 дневных, 4 недельных, 6 месячных снапшотов:
restic forget --repo /mnt/backup-storage/restic-repo \
--tag dashy \
--keep-daily 7 --keep-weekly 4 --keep-monthly 6 \
--prune
Обе команды удобно объединить в один cron-джоб и запускать после основного бэкапа сервисов, статусы которых Dashy проверяет — так снапшоты остаются согласованными по времени. Если репозиторий restic лежит на удалённом хранилище (второй сервер, S3-совместимый бакет), это же закрывает сценарий полной потери исходной машины.
Бэкап при развёртывании через Docker Compose
Типовой docker-compose.yml для Dashy монтирует каталог с данными как volume — это и есть точка входа для бэкапа:
services:
dashy:
image: lissy93/dashy:latest
container_name: dashy
ports:
- 4000:8080
volumes:
- ./dashy-data:/app/user-data
environment:
- NODE_ENV=production
restart: unless-stopped
healthcheck:
test: ["CMD", "node", "/app/services/healthcheck"]
interval: 60s
Здесь ./dashy-data — обычная директория на хосте, и бэкапить её можно теми же средствами, что и любой другой конфиг: tar, restic, rsync. Специфика есть только в одном: официальный образ Dashy обычно работает не от root внутри контейнера, поэтому после восстановления файлов из tar-архива (где владелец часто становится root) встроенный UI-редактор может потерять возможность сохранять изменения на диск. Если после восстановления интерфейс открывается, но правки через редактор не сохраняются — проверьте владельца файлов в dashy-data и приведите его в соответствие с пользователем, под которым запущен процесс в образе (актуальный UID проще всего посмотреть через docker exec dashy id).
Как и с другими самостоятельно развёрнутыми сервисами, не бэкапьте контейнер целиком через docker commit — это раздувает образ и не даёт нормально версионировать изменения конфига. Обновление образа и бэкап данных — разные операции: docker compose pull && docker compose up -d для образа, копирование dashy-data для конфигурации.
Восстановление из бэкапа
Из tar-архива, на том же сервере после сбоя:
cd /opt/dashy
docker compose down
mv dashy-data dashy-data.broken-$(date +%Y%m%d)
tar -xzf /opt/backups/dashy/dashy-config-20260830.tar.gz
docker compose up -d
Контейнер стоит останавливать перед заменой файлов — Dashy кеширует часть конфигурации в рантайме, и подмена conf.yml «на живую» иногда приводит к рассинхрону между тем, что видно в браузере, и тем, что реально лежит на диске, до перезапуска.
Из restic:
export RESTIC_PASSWORD='ваш-пароль-репозитория'
restic restore latest --repo /mnt/backup-storage/restic-repo \
--tag dashy \
--target /opt/dashy-restored
Restic сохраняет полный исходный путь, поэтому файлы окажутся в /opt/dashy-restored/opt/dashy/dashy-data — остаётся скопировать содержимое на место и перезапустить контейнер:
cp -r /opt/dashy-restored/opt/dashy/dashy-data/* /opt/dashy/dashy-data/
docker compose restart dashy
Перенос на новый сервер: помимо самих файлов проверьте отдельно три вещи. Во-первых, DNS и reverse proxy, если Dashy смотрит наружу через домен (см. Traefik как reverse proxy для Docker) — без этого статус-чеки внешних сервисов будут выполняться, но сам дашборд будет недоступен по привычному адресу. Во-вторых, сетевую доступность целей статус-мониторинга: если statusCheckUrl указывают на внутренние адреса вида http://10.x.x.x:port или на имена контейнеров в другой Docker-сети, на новом сервере эти адреса нужно будет привести в соответствие с новой топологией. В-третьих, если у вас параллельно настроен более полноценный мониторинг доступности — например, Uptime Kuma — сверьте, что оба инструмента после переезда смотрят на одни и те же актуальные адреса, а не на устаревшие из старой инфраструктуры.
После запуска не пугайтесь, если все статус-индикаторы первые секунды или минуты показывают «checking...» или серый цвет вместо зелёного/красного — это штатное поведение: Dashy не хранит историю статусов между перезапусками, каждый чек выполняется заново по расписанию из statusCheckInterval, и первый результат появится только после первого цикла опроса.
Частые ошибки при бэкапе и восстановлении Dashy
| Ошибка | Последствие | Как избежать |
|---|---|---|
Бэкапят только conf.yml, забыв про pages/, users.yml, item-icons/ | После восстановления пропадают доп. страницы или ломается вход | Бэкапить весь каталог данных целиком, а не один файл |
| API-ключи виджетов и заголовки авторизации статус-чеков в открытом бэкапе на общем диске | Утечка ключей и внутренних токенов при компрометации хранилища | Шифровать бэкап через restic или ограничивать доступ к каталогу с копиями |
Бэкап снят в момент, когда UI-редактор дописывает conf.yml | Повреждённый или обрезанный YAML в архиве | Ставить cron на период низкой активности редактирования, проверять целостность архива |
| После восстановления все статусы «красные» или «checking» принимают за баг | Лишние действия по «починке» рабочего состояния | Подождать первый цикл опроса согласно statusCheckInterval — это нормально |
| Восстановление без остановки контейнера | Рассинхрон кеша UI и файлов на диске | docker compose down перед заменой каталога данных |
| Файлы после tar-восстановления принадлежат root, а контейнер работает не от root | UI-редактор не может сохранить правки на диск | Проверить и поправить владельца через chown под UID процесса в контейнере |
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужно ли бэкапить сам образ Dashy, а не только конфиг?
Нет, образ подтягивается заново командой docker compose pull — бэкапить нужно только каталог с данными: conf.yml (или user-data/), users.yml, pages/, item-icons/ и кастомные CSS/JS, если используете.
Как часто делать бэкап Dashy?
Раз в сутки достаточно для большинства случаев. Если активно правите дашборд через встроенный UI-редактор несколько раз в день, есть смысл добавить ещё и версионирование через git отдельным коммитом перед крупными изменениями.
Можно ли положиться на встроенный облачный бэкап Dashy вместо своего?
Как дополнительный способ быстро перенести конфиг на другую машину — да, удобно. Но как единственную копию для продакшена — нет, это сторонний сервис вне вашей инфраструктуры, и он не заменяет независимый бэкап на своём сервере или в своём хранилище.
После восстановления статус-индикаторы не обновляются вообще — в чём дело?
Чаще всего проблема не в бэкапе конфига, а в сетевой доступности целей statusCheckUrl с нового сервера — проверьте, что адреса из конфига (особенно внутренние IP или имена контейнеров) реально резолвятся и отвечают из контейнера Dashy.
Можно ли хранить конфиг Dashy в git?
Да, это хороший вариант для версионирования правок дашборда. Но users.yml с хешами паролей и API-ключи виджетов лучше вынести из репозитория — держите их отдельно и добавьте в .gitignore, чтобы они не попали в историю коммитов.
Что делать, если после переноса на новый сервер пропали кастомные иконки?
Проверьте, что каталог item-icons/ (или аналогичный путь для локальных иконок) действительно попал в бэкап и был восстановлен на новом месте — сами ссылки на иконки в conf.yml при этом остаются рабочими, но без файлов рядом превращаются в битые изображения.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →