15 KiB
title, updated, tags
| title | updated | tags | ||||||
|---|---|---|---|---|---|---|---|---|
| Выборочный бэкап Mac на Kraken | 2026-10-23 |
|
Выборочный бэкап Mac на Kraken
Текущая схема
На Mac установлены Backrest 1.14.1 и restic 0.19.1. Backrest работает как служба пользователя macOS sh.brew.backrest через LaunchAgent и доступен по адресу http://127.0.0.1:9898. Его окно или браузер держать открытым не требуется; пользователь должен войти в macOS, Mac должен быть включён и иметь доступ к Kraken во время задания. Движок restic создаёт шифрованные снимки и отправляет их по SFTP. На Kraken нужен только SSH/SFTP-сервер; Backrest или restic на сервере не установлены и не требуются.
Рабочий репозиторий Backrest: kraken-mbp-black. Адрес restic:
sftp:kraken@192.168.1.14:/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/restic
Сейчас используется прямой локальный IP 192.168.1.14. За пределами домашней сети этот адрес недоступен; автоматическое переключение на VPN не настроено. Не следует считать ночное задание успешным, если Mac был вне локальной сети или спал.
Конфигурация Backrest хранится в /Users/admin/.config/backrest/config.json с правами 0600; она содержит пароль репозитория. Такой же пароль сохранён в связке ключей macOS: служба backrest-kraken-restic, учётная запись admin. Пароль не записан в этой заметке. Для восстановления после утраты Mac нужна отдельная копия пароля вне самого Mac; наличие такой копии пока не подтверждено.
Для «Полного доступа к диску» macOS добавлены оба файла:
/opt/homebrew/Cellar/backrest/1.14.1/bin/backrest/Users/admin/.local/share/backrest/restic
После обновления Backrest, если путь к бинарнику изменится, права доступа к диску нужно проверить повторно.
Планы и расписание
Все три плана используют локальное время Mac и один репозиторий kraken-mbp-black. Для каждого плана настроено хранение 3 последних снимков (policyKeepLastN: 3): после будущих запусков Backrest будет убирать более старые снимки этого плана из истории. Встроенная очистка prune запланирована по воскресеньям в 06:00 по локальному времени Mac (maxUnusedPercent: 10); она освобождает место, занятое уже удалёнными снимками. Отдельного скрипта нет. Backrest: Retention и Prune.
Домашняя папка — kraken-home
Ежедневно в 03:00. Источник: /Users/admin. Включён --one-file-system, поэтому другие тома не обходятся. Действуют 114 правил исключения ниже. Сохраняются документы, проекты, настройки и другие файлы домашней папки, не подпавшие под эти правила. Общего исключения .git нет.
Выборочные системные файлы — kraken-system
Ежедневно в 03:30. Включён --one-file-system. Источники в текущей конфигурации:
/Library/Audio/Impulse Responses
/Library/Fonts
/Library/LaunchDaemons/ai.virfield.lume.plist
/Library/LaunchDaemons/ai.virfield.virfieldd.plist
/Library/LaunchDaemons/com.cloudflare.cloudflared.plist
/Library/LaunchDaemons/top.eagle.wg-auto.plist
/Library/WebServer/Documents
/Users/Shared/obsidian
/opt/homebrew/etc
/private/etc/apache2
/private/etc/hosts
/usr/local/bin
Для этого плана действуют 37 правил исключения ниже.
PostgreSQL — kraken-postgresql
Ежедневно в 04:30. Снимок создаётся потоком команды pg_dumpall без промежуточного локального файла:
--stdin-filename postgresql-all.sql --stdin-from-command -- /opt/homebrew/bin/pg_dumpall -l postgres
В снимке находится один логический дамп postgresql-all.sql, включая базы и глобальные объекты PostgreSQL. Для восстановления его нужно подать в psql на подготовленном сервере; полноценное восстановление этого дампа пока не проверено. Старые локальные дампы /Users/admin/.local/share/mbp-black-postgresql исключены из домашнего плана.
Правила исключения
Это точные правила из действующей конфигурации Backrest на 23 октября 2026 года. Перед изменением правил проверяйте список в интерфейсе Backrest; конфигурация может измениться позже этой записи. Каталоги вроде node_modules, .venv, кэши, сборочные артефакты, установочные образы и lock-файлы не попадают в снимки. Маски с ** действуют на любой глубине.
kraken-home — 114 правил
/Users/admin/DuckDuckGo
/Users/admin/Downloads
/Users/admin/.colima
/Users/admin/Library/Developer
/Users/admin/Library/Caches
/Users/admin/.local/share/balda-workspace/backups
/Users/admin/.virfield-v2/cache
/Users/admin/go/pkg/mod
/Users/admin/.npm
/Users/admin/.gradle/caches
/Users/admin/.gradle/daemon
/Users/admin/.gradle/wrapper/dists
/Users/admin/.swiftpm/cache
/Users/admin/Library/pnpm/store
/Users/admin/.cache/uv
/Users/admin/*/**/.gradle
/Users/admin/Developer/**/build
/Users/admin/Developer/**/Build
/Users/admin/Developer/**/dd
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/models
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/uv-cache
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/deno-cache
/Users/admin/Developer/personal-os/tools/rlm-lab/.runtime/npm-cache
/Users/admin/Library/Application Support/Claude/Cache
/Users/admin/Library/Application Support/Claude/Code Cache
/Users/admin/.Trash
/Users/admin/Library/Application Support/Steam/steamapps/common
/Users/admin/.android/avd
/Users/admin/Library/Android/sdk
/Users/admin/.ollama/models
/Users/admin/.cache/huggingface/hub
/Users/admin/Library/Application Support/Google/Chrome/OptGuideOnDeviceModel
/Users/admin/docker/balda-mm-mac/state-failed-upstream-*
/Users/admin/docker/balda-mm-mac/state/setup-backups
/Users/admin/Library/org.swift.swiftpm/swift-sdks
/Users/admin/.vscode/extensions
/Users/admin/.cursor/extensions
/Users/admin/Library/Containers/com.apple.CoreDevice.CoreDeviceService/Data/Library/Caches
/Users/admin/haos/haos_generic-*.img
/Users/admin/haos/haos_generic-*.img.xz
/Users/admin/Library/Application Support/Dash/DocSets
/Users/admin/Library/Application Support/Code/CachedExtensionVSIXs
/Users/admin/Library/Application Support/Google/GoogleUpdater/crx_cache
/Users/admin/Library/Logs
/Users/admin/Library/Application Support/com.apple.wallpaper/aerials/videos
/Users/admin/whisper-env
/Users/admin/Library/Application Support/Claude/vm_bundles
/Users/admin/Developer/dyld_shared_cache_*
/Users/admin/Developer/Big Sur Libraries
/Users/admin/Library/Application Support/Asana/Cache
/Users/admin/Library/Application Support/Asana/Code Cache
/Users/admin/Library/Application Support/Asana/Service Worker/CacheStorage
/Users/admin/Library/Application Support/YandexMusic/Cache
/Users/admin/Library/Application Support/YandexMusic/Code Cache
/Users/admin/Library/Application Support/Spotify/PersistentCache
/Users/admin/Library/Application Support/Code/Cache
/Users/admin/Library/Application Support/Code/logs
/Users/admin/Library/Application Support/Code/CachedData
/Users/admin/Library/Application Support/Code/Crashpad
/Users/admin/Library/Application Support/Mattermost/Cache
/Users/admin/Library/Application Support/Mattermost/Code Cache
/Users/admin/Library/Containers/Mattermost.Desktop/Data/Library/Application Support/Mattermost/Code Cache
/Users/admin/Library/Containers/com.apple.mediaanalysisd/Data/Library/Caches
/Users/admin/Library/Application Support/zoom.us/data/UnifyWebView_Cache
/Users/admin/Library/Application Support/Steam/Steam.AppBundle
/Users/admin/Library/Application Support/Steam/appcache
/Users/admin/Library/Application Support/Steam/depotcache
/Users/admin/Library/Application Support/Steam/logs
/Users/admin/.cache/codex-runtimes
/Users/admin/.local/share/claude/versions
/Users/admin/.local/share/cursor-agent/versions
/Users/admin/.local/share/uv/python
**/media_files_db/out
**/media_files_db/cache
/Users/admin/Virtual Machines.localized/Windows 95*.utm
/Users/admin/Library/Containers/com.duckduckgo.macos.browser.debug
.build
.build-*
DerivedData
deriveddata
derviveddata
.deriveddata
.dd
WebKitBuild
node_modules
.venv
venv
__pycache__
.pytest_cache
.mypy_cache
.ruff_cache
.next
.nuxt
.turbo
.parcel-cache
.cxx
.kotlin
**/Carthage/Build
*.pyc
*.pyo
.DS_Store
._*
*.dmg
*.xip
*.lock
*.lockb
Package.resolved
package-lock.json
npm-shrinkwrap.json
pnpm-lock.yaml
pnpm-lock.yml
packages.lock.json
*.pgdump
/Users/admin/.local/share/mbp-black-postgresql
kraken-system — 37 правил
.build
.build-*
DerivedData
deriveddata
derviveddata
.deriveddata
.dd
WebKitBuild
node_modules
.venv
venv
__pycache__
.pytest_cache
.mypy_cache
.ruff_cache
.next
.nuxt
.turbo
.parcel-cache
.cxx
.kotlin
**/Carthage/Build
*.pyc
*.pyo
.DS_Store
._*
*.dmg
*.xip
*.lock
*.lockb
Package.resolved
package-lock.json
npm-shrinkwrap.json
pnpm-lock.yaml
pnpm-lock.yml
packages.lock.json
*.pgdump
Проверенный результат
На 23 октября 2026 года созданы снимки всех трёх планов. Системный снимок завершился успешно; /private/etc/hosts восстановлен и совпал побайтно. PostgreSQL-снимок завершился успешно; postgresql-all.sql имеет размер 26 485 621 820 байт, однако полное восстановление базы не проверялось.
Домашний снимок 25ecd67531c890fcbe76f4142d189fa369e33be7a5aaf3be76f99e85f20f8d59 сохранён с предупреждением: обработано 448 705 файлов, 21 защищённый служебный файл macOS не удалось прочитать даже после выдачи Full Disk Access. Ошибки относятся к com.apple.milod, индексу CoreSpotlight/NSFileProtectionComplete и одному файлу настроек group.com.apple.secure-control-center-preferences. Два других файла из домашнего снимка восстановлены и совпали с оригиналами побайтно.
Команда restic check проверила структуру репозитория и все четыре снимка без ошибок. Она сообщила о 192 дополнительных файлах пакетов после прерванных попыток; это не ошибка целостности. Лимит трёх версий и расписание prune установлены после этой проверки; их первый автоматический запуск ещё не проверен.
В папке назначения /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/ находится только restic/.
Проверка и восстановление
Для обычной работы откройте http://127.0.0.1:9898, выберите нужный план и снимок. По завершении ночного задания проверьте его статус: Success или Warning/Error. Домашний план сейчас показывает Warning из-за 21 недоступного файла; этот статус не следует принимать за полностью успешный бэкап.
Для восстановления отдельных файлов выберите снимок в Backrest, найдите файл и восстановите его в отдельный каталог, затем сравните с оригиналом перед заменой. Для аварийного восстановления без Backrest можно установить restic, подключиться к указанному SFTP-репозиторию и использовать пароль репозитория. Без пароля содержимое снимков не прочитать.
Проверка через терминал на этом Mac (пароль берётся из связки ключей, в команду и заметку не записывается):
RESTIC_REPOSITORY='sftp:kraken@192.168.1.14:/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/restic'
restic --password-command 'security find-generic-password -a admin -s backrest-kraken-restic -w' -r "$RESTIC_REPOSITORY" snapshots
restic --password-command 'security find-generic-password -a admin -s backrest-kraken-restic -w' -r "$RESTIC_REPOSITORY" check
Для восстановления целого снимка выберите в Backrest отдельную папку назначения с достаточным свободным местом. Не восстанавливайте сразу поверх работающей системы или базы PostgreSQL.