[2026-10-23] eagle: personal/instructions/Выборочный бэкап Mac на Kraken.md

This commit is contained in:
Alexey Martemyanov committed 2026-10-23 16:19:54 +06:00
1 parent 728bdb54c0
commit 5f0bd926c7
1 file changed
+206 -293
@@ -3,265 +3,183 @@ title: Выборочный бэкап Mac на Kraken
updated: '2026-10-23'
tags:
- backup
- rsync
- kopia
- backrest
- restic
- macos
- kraken
- instructions
---
# Выборочный бэкап Mac на Kraken
## Выбор решения: исследование 23 октября 2026
## Текущая схема
**Уточнение владельца: сохранять прежнюю файловую копию rsync не требуется.** Backrest 1.14.1 и restic 0.19.1 установлены на Mac; служба Backrest запущена и локальный веб-интерфейс отвечает HTTP 200. Новый репозиторий создан по SFTP в `backups/mbp-black/restic/`; старые `home/`, `system/`, `postgresql/` удалены 23 октября 2026 года после отдельного подтверждения владельца. Предыдущее назначение платного Arq было ошибкой: исходный запрос предпочитал open source.
На 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 на сервере не установлены и не требуются.
### Требования из исходной задачи
Нужны выбор конкретных каталогов и файлов, исключения по маскам на любой глубине, передача на Kraken по SSH/SFTP, автономный запуск без открытого окна, история версий, расписание, проверка и восстановление. UI и open source предпочтительны; Duplicati уже отвергнут из-за .NET. Прежний RsyncUI не выполнил требование настоящего автономного бэкапа. Дополнительный анализ новых каталогов локальной MLX-моделью желателен, но не должен решать, выполняется ли очередной бэкап.
Под «нативностью» различаются два свойства: программа исполняется прямо на macOS без контейнера и .NET; интерфейс написан на SwiftUI/AppKit. Не найдено подтверждённого бесплатного продукта, который одновременно выполняет все требования и имеет SwiftUI-интерфейс вместе с независимой фоновой службой. Backrest удовлетворяет первому свойству, но его интерфейс вебовый.
### Реальные кандидаты
**Backrest + restic — первое место.** Backrest — GPL-3.0, сервис на Go с веб-интерфейсом React/TypeScript; restic — отдельный движок на Go. Официальный установщик создаёт launchd LaunchAgent на Mac, поэтому закрытие браузера не останавливает задания. Есть выбор нескольких исходных путей, маски исключений, расписание в интерфейсе, версии, ротация, проверки репозитория, просмотр и восстановление файлов. Restic передаёт данные по SFTP через штатный SSH-клиент и может использовать запись из ~/.ssh/config, включая alias Kraken; на Kraken достаточно SSH/SFTP, отдельный сервер не нужен. Репозиторий шифруется; пароль нужен для восстановления. Ограничение: штатный LaunchAgent пользователя стартует после входа в macOS, а не до него. Запуск после сна, Full Disk Access, все маски и соединение через существующий ProxyCommand требуют проверки на этой машине. [Backrest: исходники и установка](https://github.com/garethgeorge/backrest), [создание плана](https://garethgeorge.github.io/backrest/introduction/getting-started), [скрипт установки launchd](https://github.com/garethgeorge/backrest/blob/main/install.sh), [restic: SFTP и SSH config](https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html), [restic: исключения и выбор файлов](https://restic.readthedocs.io/en/stable/040_backup.html).
**Kopia — второе место.** Бесплатная Apache-2.0, движок Go, интерфейс KopiaUI на Electron. Есть SFTP, выбор исходников, правила исключений, шифрованные версии, расписание и восстановление. Встроенный планировщик выполняет работающий процесс Kopia; чтобы закрыть KopiaUI и оставить бэкап, надо отдельно поставить kopia server start на автозапуск. Штатная установка на macOS не даёт такого готового независимого сервиса, поэтому здесь Backrest проще и ближе к исходному требованию. [Kopia](https://github.com/kopia/kopia), [сборка KopiaUI](https://github.com/kopia/kopia/blob/master/BUILD.md), [сервер](https://kopia.io/docs/reference/command-line/common/server-start/).
**Time Machine — лучший вариант, если обязательна именно встроенная система Apple.** macOS backupd работает без открытого UI и хранит версии на SMB-шаре Kraken. Стек — компоненты macOS и SMB; реализация закрытая. Нельзя перенести действующие маски вроде node_modules на любой глубине и *.lock: доступны исключения конкретных объектов. SSH/SFTP нет. Старый вариант на Kraken уже давал проблемы размера и доступности через VPN. [Apple: сетевое назначение](https://support.apple.com/en-euro/guide/mac-help/mh15139/27/mac/27), [Apple: исключения](https://support.apple.com/en-au/guide/mac-help/-mh15622/mac).
**UrBackup — автономная альтернатива при готовности установить сервер на Kraken.** Клиент/сервер с открытым кодом AGPL-3.0, ядро C++, клиентский интерфейс на wxWidgets, управление через веб-сервер. Поддерживает версии файлов и wildcard-исключения, клиент Mac работает службой. На Kraken придётся поставить UrBackup Server; существующий SFTP-каталог сам по себе назначением не станет. После периода прекращённой поддержки macOS выпущен новый клиент в 2026 году; совместимость с текущей macOS и защищёнными данными надо проверять отдельно. Из-за дополнительного сервера и другого сетевого протокола это запасной, а не первый выбор. [Исходники](https://github.com/uroni/urbackup_backend), [загрузки](https://www.urbackup.org/download.html), [история macOS](https://www.urbackup.org/2019/05/28/macos-announcement.html), [выпуск 2026](https://www.urbackup.org/2026/02/07/urbackup-client-2.5.29-macos.html).
**Vorta + Borg — хороший архивный движок, слабее по автономности здесь.** Vorta — GPL-3.0, Python/PyQt; Borg — Python/C. Есть интерфейс, маски, версии, шифрование и SSH. Планировщик находится в работающем приложении Vorta, а на Kraken должен быть установлен совместимый Borg для удалённого репозитория. [Vorta](https://github.com/borgbase/vorta), [Borg: удалённый репозиторий](https://borgbackup.readthedocs.io/en/stable/quickstart.html).
**Keelhaven — нативный интерфейс, но не независимый сервис.** Бесплатный GPLv3, SwiftUI + restic (Go), SFTP, выбранные папки и версии. Это beta; планировщик находится внутри приложения и останавливается вместе с ним. [Проект](https://github.com/shenxianpeng/keelhaven), [реализация планировщика](https://github.com/shenxianpeng/keelhaven/blob/main/Keelhaven/Services/SchedulerService.swift).
### Другие проверенные варианты и причина отказа
- **RsyncGUI / RsyncUI:** SwiftUI + rsync, SSH и маски; RsyncGUI умеет запускать задания через launchd при закрытом окне, но не документирует полноценное хранилище версий с ротацией и проверкой восстановления. RsyncUI уже проверен и не имеет независимого планировщика. [RsyncGUI](https://github.com/kochj23/RsyncGUI), [RsyncUI](https://github.com/rsyncOSX/RsyncUI).
- **FreeFileSync:** C++/wxWidgets, бесплатное приложение, SFTP, фильтры и папка старых версий; это синхронизация, а расписание на Mac требует отдельного задания Automator/Calendar или cron. [Возможности](https://freefilesync.org/faq.php), [расписание](https://freefilesync.org/manual.php?topic=schedule-batch-jobs).
- **InLocker:** Rust/Tauri + React, launchd и локальные архивы; по README маски исключений и ротация версий ещё в планах, шифрованные задания нельзя выполнять автоматически, SFTP нет. Сайт пишет MIT, а README помечает лицензию TBD — статус лицензии противоречив. [Исходники и ограничения](https://github.com/beloureiro/inlocker).
- **SyncTray:** SwiftUI + rclone с launchd и SFTP; управляет синхронизацией, а не самостоятельным версионным архивом. [Проект](https://github.com/mthines/sync-tray).
- **Restic + resticprofile:** Go, полностью свободный набор с профилями и launchd, но без UI; это резервный вариант для работы через конфигурационные файлы. [resticprofile](https://github.com/creativeprojects/resticprofile).
- **Borgmatic:** Python + Borg, автоматизация и даже экспорт PostgreSQL; без UI, а Borg нужен также на Kraken. [Проект](https://github.com/borgmatic-collective/borgmatic).
- **Duplicati:** C#/.NET, веб-сервер с настоящими версионными бэкапами и SFTP; уже отвергнут владельцем из-за стека .NET. [Проект](https://github.com/duplicati/duplicati).
- **Duplicacy:** движок Go, CLI бесплатен для личного использования, но интерфейс и расписание Web Edition после пробного периода требуют платной лицензии; это не полностью свободный вариант с UI. [Условия лицензии](https://duplicacy.com/buy.html).
- **Cryoframe:** Swift/SwiftUI и root LaunchDaemon, но продукт специально для медиа-библиотек и пишет на локальные/смонтированные диски, не по SFTP. [Проект](https://github.com/breed007/Cryoframe).
- **Arq, Carbon Copy Cloner, ChronoSync:** коммерческие продукты; не выбирать как единственное решение при предпочтении open source. [Arq](https://www.arqbackup.com/pricing/), [CCC](https://bombich.com/pricing), [ChronoSync](https://www.econtechnologies.com/chronosync/overview.html).
### Переход со старой копии на Backrest
Backrest работает через движок restic: для Kraken достаточно SSH/SFTP-сервера, отдельный серверный компонент Backrest или restic не требуется. Но репозиторий restic имеет собственную структуру и шифрованные данные; обычные файлы rsync в `home/`, `system/`, `postgresql/` нельзя принять как его снимки. Новый репозиторий создан внутри `backups/mbp-black/restic/` по проверенному прямому адресу `192.168.1.14`: короткий SSH-alias `kraken` зависал на старом ProxyCommand. Пароль репозитория сохранён в macOS Keychain как `backrest-kraken-restic`; конфигурация Backrest имеет права `0600`. Тестовый снимок восстановлен побайтно. Первый системный снимок успешно завершён, `/private/etc/hosts` восстановлен без отличий. Первый PostgreSQL-снимок успешно завершён: `postgresql-all.sql` имеет размер 26 485 621 820 байт; его полноценное восстановление пока не проверено. Домашний снимок `25ecd67531c890fcbe76f4142d189fa369e33be7a5aaf3be76f99e85f20f8d59` создан с предупреждением: сохранено 448 705 файлов, 21 защищённый служебный файл macOS не прочитан (CoreSpotlight, milod, настройки Control Center). Два файла из домашнего снимка восстановлены побайтно; `restic check` завершился без ошибок. Проверка также нашла 192 лишних файла пакетов после прерванных попыток; это не ошибка целостности, очистка пока не выполнялась. После отдельного подтверждения владельца старое дерево rsync (`home/`, `system/`, `postgresql/`, ранее 128 433 115 136 байт) удалено; в `backups/mbp-black/` оставлен только `restic/`.
Backrest теперь содержит планы `kraken-home` (03:00, 114 правил исключения), `kraken-system` (03:30, 12 выбранных путей) и `kraken-postgresql` (04:30). PostgreSQL сохраняется штатным `restic --stdin-from-command` через `pg_dumpall` прямо в шифрованный репозиторий, без ротации локальных файлов; формат этого нового снимка — единый SQL-файл для восстановления через `psql`. Автоматическое удаление снимков пока выключено (`keep all`) до согласования срока хранения. [Формат и SFTP restic](https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html), [Backrest и его репозитории](https://garethgeorge.github.io/backrest/introduction/getting-started), [PostgreSQL: SQL-дампы](https://www.postgresql.org/docs/17/backup-dump.html).
**Фактическое состояние:** Backrest и restic установлены; `sh.brew.backrest` запущен, три плана настроены. Kopia не установлена. Time Machine выключена. SFTP на локальный адрес Kraken 192.168.1.14 проверен, но VPN-адрес 10.99.1.2 при прямой проверке не ответил. Системный и PostgreSQL-снимки созданы; системный файл восстановлен побайтно. Домашний снимок создан и читается, но имеет предупреждение из-за 21 защищённого файла macOS даже после Full Disk Access. В репозитории остались только данные restic. При недоступности локального IP вне домашней сети расписание не выполнится — сетевой маршрут требует отдельной настройки.
---
## Сохранённая конфигурация RsyncUI — история неработающего варианта
Ниже зафиксирована конфигурация RsyncUI и последний локальный журнал по состоянию на 23 октября 2026 года. Это описание прежней схемы, а не инструкция к уже работающему резервному копированию. При текущей проверке приложение по указанному ниже пути отсутствует.
## Результат прежней схемы на момент остановки
**Рабочий автоматический бэкап не подтверждён. Полного успешного копирования и пробного восстановления нет. Считать настройку готовой нельзя.** На Kraken есть частично переданные данные; их наличие не доказывает полноту бэкапа.
Последний записанный запуск 23 октября — Estimate (`DRY RUN`), завершившийся кодом **23**: `Interrupted system call (4)` при чтении `Library/Containers/com.apple.Internet-Accounts-Settings.extension/Data/SystemData`. Он не копировал файлы. В оценке: 127 567 946 657 байт (~127,6 ГБ) исходных данных, около 10,55 ГБ к передаче. Из-за ошибки это не подтверждённый окончательный объём. `logrecords.json` пуст — записей об успешном завершении нет.
RsyncUI требует запущенного приложения и вошедшего пользователя; независимая фоновая служба бэкапа не настроена. Обсуждались Duplicati и Kopia, но ни одно из этих решений не установлено, миграция не выполнена. Текущая сохранённая настройка ниже относится к RsyncUI.
## Как устроено
Бэкап выполняет `rsync` по SSH на Kraken. RsyncUI 3.0.5 хранит задачи, показывает оценку и результаты, запускает копирование по своему штатному расписанию.
- Приложение на момент настройки: `/Applications/RsyncUI.app` (при проверке 23 октября по этому пути уже отсутствует).
- Бинарник: `/opt/homebrew/bin/rsync` (на момент настройки 3.5.1).
- Рабочий профиль: **`mbp-black-kraken`**.
- SSH: **`kraken@kraken.local:22`**, ключ `~/.ssh/id_rsa`.
- Папка назначения: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/`.
Это обычные файлы и каталоги на диске Kraken, а не sparsebundle Time Machine и не репозиторий Kopia. Передача идёт по SSH; `--compress` сжимает сетевой поток, а не файлы на диске.
**Самописных скриптов, внешнего планировщика и созданных для этого заданий launchd больше нет.** Они остановлены и убраны из рабочих каталогов. Старый Time Machine `mbp-black.sparsebundle` удалён 22 октября 2026 года по подтверждению владельца. Старая заметка [[family/how-to/time-machine|Time Machine]] описывает прежнюю схему.
## Расписание
**Ежедневно в 03:00 по локальному времени Mac**, штатный тип `daily`, профиль `mbp-black-kraken`. Первый сохранённый запуск — 22 октября 2026 года, 03:00.
Условия запуска:
1. Mac включён и бодрствует.
2. Пользователь вошёл в macOS, RsyncUI остаётся запущенным; держать окно на переднем плане не требуется.
3. Kraken доступен по `kraken.local`, SSH-ключ работает без запроса пароля.
**Автоматического наверстывания нет — это выбранный режим.** Пропущенные во сне задания RsyncUI показывает в Schedule; вернуть их в очередь нужно вручную. При закрытом приложении его планировщик не работает. Автоматический переход с LAN на VPN и повторы каждые 15 минут сейчас не настроены.
## Что копируется
- 01 Home: `/Users/admin/` с исключениями ниже → `home/` на Kraken.
- 02 PostgreSQL — saved dumps: `~/.local/share/mbp-black-postgresql/` → `postgresql/`.
- 03 System files: только пути из `system.files` → `system/`.
В домашней папке по умолчанию остаются документы, исходники, настройки, SSH-ключи, состояние приложений и прочие данные, не попавшие под исключения. **Глобального исключения `.git` нет**: remote не гарантирует сохранность локальных коммитов, веток и stash. Содержимое Ryujinx и архивы его прошивок также оставлены.
Домашняя задача использует `--one-file-system`. Внешний **Samsung970EVO не выбран** как источник. Символические ссылки сохраняются как ссылки; обход их внешних целей не включён.
### Выборочные системные файлы
Источник системной задачи отображается как `/`, чтобы сохранить структуру путей. **Весь диск не копируется:** `--files-from=…/system.files` разрешает только этот список, пути указаны относительно `/`:
Рабочий репозиторий Backrest: `kraken-mbp-black`. Адрес restic:
```text
opt/homebrew/etc/
Library/WebServer/Documents/
usr/local/bin/
private/etc/apache2/
private/etc/hosts
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
Users/Shared/obsidian/
Library/Fonts/
Library/Audio/Impulse Responses/
sftp:kraken@192.168.1.14:/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/restic
```
Установленные приложения и весь Homebrew Cellar отдельно не копируются. Для восстановления состава ПО сохранён аудит: Brewfile, списки формул/casks/сервисов Homebrew, приложений и отдельных пакетных менеджеров. Эти файлы находятся в домашнем источнике:
Сейчас используется прямой локальный IP `192.168.1.14`. За пределами домашней сети этот адрес недоступен; автоматическое переключение на VPN не настроено. Не следует считать ночное задание успешным, если Mac был вне локальной сети или спал.
`~/Documents/Codex/2026-10-21-rsync-scp-ui-open-source-mlx/backup-audit/software-inventory/`
Конфигурация Backrest хранится в `/Users/admin/.config/backrest/config.json` с правами `0600`; она содержит пароль репозитория. Такой же пароль сохранён в связке ключей macOS: служба `backrest-kraken-restic`, учётная запись `admin`. Пароль не записан в этой заметке. Для восстановления после утраты Mac нужна отдельная копия пароля вне самого Mac; наличие такой копии пока не подтверждено.
Это сохранённый инвентарный список, а не автоматически обновляемый каждую ночь экспорт.
Для «Полного доступа к диску» macOS добавлены оба файла:
### PostgreSQL: существенное ограничение
- `/opt/homebrew/Cellar/backrest/1.14.1/bin/backrest`
- `/Users/admin/.local/share/backrest/restic`
**Штатная задача RsyncUI копирует только уже существующие дампы. Она не создаёт свежий дамп PostgreSQL перед ночным запуском.**
После обновления Backrest, если путь к бинарнику изменится, права доступа к диску нужно проверить повторно.
Текущий набор создан 22 октября 2026 года: custom-format `pg_dump` для всех подключаемых нетиповых баз и `pg_dumpall --globals-only` для ролей и глобальных объектов. Имена баз и соответствующие архивы перечислены в `databases.json`, глобальные объекты — в `globals.sql`.
## Планы и расписание
Архивы проверялись командой `pg_restore --list`; полноценное тестовое восстановление не выполнялось. Этот набор успешно передан на Kraken при первоначальном копировании. После удаления внешней автоматизации его обновление не автоматизировано. Поэтому **актуальный ежедневный бэкап работающих баз пока не обеспечен**. Копировать живой `/opt/homebrew/var/postgresql@17/` обычным rsync вместо согласованного дампа нельзя считать корректным бэкапом.
Все три плана используют локальное время Mac, один репозиторий `kraken-mbp-black` и политику `keep all`: снимки автоматически не удаляются. Очистка старых версий и `prune` не настроены.
В домашней задаче каталог с дампами исключён, чтобы не дублировать его во второй задаче. Файлы `*.pgdump` исключены по согласованному правилу; текущие архивы имеют расширение `.dump` и копируются отдельной задачей.
### Домашняя папка — `kraken-home`
## Что исключено
Ежедневно в **03:00**. Источник: `/Users/admin`. Включён `--one-file-system`, поэтому другие тома не обходятся. Действуют 114 правил исключения ниже. Сохраняются документы, проекты, настройки и другие файлы домашней папки, не подпавшие под эти правила. Общего исключения `.git` нет.
Основные группы: Downloads и DuckDuckGo из домашней папки; Colima с Docker images/volumes; Library/Developer целиком, включая симуляторы и Xcode Archives; кэши, сборки, зависимости; установленные игры Steam; Android SDK и AVD, включая userdata; Claude VM; скачанные модели; старые состояния и вложенные резервные копии Balda; распакованные системные библиотеки; скачанные runtime и расширения; результаты обработки media_files_db; обе Windows 95 VM; данные отладочного DuckDuckGo; образы HAOS; dmg/xip, lock-файлы и старые pgdump.
### Выборочные системные файлы — `kraken-system`
**`~/docker` целиком не исключён.** Сохранены конфиги и текущие bind-mounted данные приложений. Исключение Colima убирает Docker images и обычные named volumes внутри её VM, включая находящиеся там данные.
Полный действующий `home.exclude` приведён ниже. Начальный `/` привязывает правило к `/Users/admin/`, а не к корню системного диска. Непривязанные имена каталогов применяются на любой глубине. Wildcards позволяют учитывать новые сборки и копии проектов, а не только конкретные worktree.
Ежедневно в **03:30**. Включён `--one-file-system`. Источники в текущей конфигурации:
```text
# Paths anchored at /Users/admin/, the home task source.
/DuckDuckGo/
/Downloads/
/.colima/
/Library/Developer/
/Library/Caches/
/.local/share/balda-workspace/backups/
/.virfield-v2/cache/
/go/pkg/mod/
/.npm/
/.gradle/caches/
/.gradle/daemon/
/.gradle/wrapper/dists/
/.swiftpm/cache/
/Library/pnpm/store/
/.cache/uv/
# Exclude project-local Gradle state, keeping ~/.gradle configuration.
/*/**/.gradle/
# Generic build/dd names are restricted to project trees.
/Developer/**/build/
/Developer/**/Build/
/Developer/**/dd/
# This project downloads pinned model weights via bootstrap.py.
/Developer/personal-os/tools/rlm-lab/.runtime/models/
/Developer/personal-os/tools/rlm-lab/.runtime/uv-cache/
/Developer/personal-os/tools/rlm-lab/.runtime/deno-cache/
/Developer/personal-os/tools/rlm-lab/.runtime/npm-cache/
# Downloadable app caches; application state remains included.
/Library/Application Support/Claude/Cache/
/Library/Application Support/Claude/Code Cache/
/.Trash/
# Additional exclusions approved on 2026-10-21.
/Library/Application Support/Steam/steamapps/common/
/.android/avd/
/Library/Android/sdk/
/.ollama/models/
/.cache/huggingface/hub/
/Library/Application Support/Google/Chrome/OptGuideOnDeviceModel/
/docker/balda-mm-mac/state-failed-upstream-*/
/docker/balda-mm-mac/state/setup-backups/
/Library/org.swift.swiftpm/swift-sdks/
/.vscode/extensions/
/.cursor/extensions/
/Library/Containers/com.apple.CoreDevice.CoreDeviceService/Data/Library/Caches/
/haos/haos_generic-*.img
/haos/haos_generic-*.img.xz
/Library/Application Support/Dash/DocSets/
/Library/Application Support/Code/CachedExtensionVSIXs/
/Library/Application Support/Google/GoogleUpdater/crx_cache/
/Library/Logs/
/Library/Application Support/com.apple.wallpaper/aerials/videos/
/whisper-env/
/Library/Application Support/Claude/vm_bundles/
# Additional exclusions approved on 2026-10-21, round 2.
/Developer/dyld_shared_cache_*/
/Developer/Big Sur Libraries/
/Library/Application Support/Asana/Cache/
/Library/Application Support/Asana/Code Cache/
/Library/Application Support/Asana/Service Worker/CacheStorage/
/Library/Application Support/YandexMusic/Cache/
/Library/Application Support/YandexMusic/Code Cache/
/Library/Application Support/Spotify/PersistentCache/
/Library/Application Support/Code/Cache/
/Library/Application Support/Code/logs/
/Library/Application Support/Code/CachedData/
/Library/Application Support/Code/Crashpad/
/Library/Application Support/Mattermost/Cache/
/Library/Application Support/Mattermost/Code Cache/
/Library/Containers/Mattermost.Desktop/Data/Library/Application Support/Mattermost/Code Cache/
/Library/Containers/com.apple.mediaanalysisd/Data/Library/Caches/
/Library/Application Support/zoom.us/data/UnifyWebView_Cache/
/Library/Application Support/Steam/Steam.AppBundle/
/Library/Application Support/Steam/appcache/
/Library/Application Support/Steam/depotcache/
/Library/Application Support/Steam/logs/
/.cache/codex-runtimes/
/.local/share/claude/versions/
/.local/share/cursor-agent/versions/
/.local/share/uv/python/
**/media_files_db/out/
**/media_files_db/cache/
/Virtual Machines.localized/Windows 95*.utm/
/Library/Containers/com.duckduckgo.macos.browser.debug/
/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
```
# Directory names apply at any depth. No global .git exclusion was requested.
.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/
Для этого плана действуют 37 правил исключения ниже.
### PostgreSQL — `kraken-postgresql`
Ежедневно в **04:30**. Снимок создаётся потоком команды `pg_dumpall` без промежуточного локального файла:
```text
--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 правил
```text
/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
._*
# User explicitly excluded installers and dependency lock files.
*.dmg
*.xip
*.lock
@@ -272,79 +190,74 @@ npm-shrinkwrap.json
pnpm-lock.yaml
pnpm-lock.yml
packages.lock.json
# User approved excluding existing PostgreSQL dump files at any depth.
*.pgdump
# PostgreSQL dump files are handled by the separate PostgreSQL task.
/.local/share/mbp-black-postgresql/
/Users/admin/.local/share/mbp-black-postgresql
```
Системная задача использует отдельный `common.exclude` с общими правилами для артефактов/расширений; привязанные к домашней папке исключения к системному источнику не применяются.
## Что происходит при изменении и удалении файлов
Это инкрементальное копирование: rsync сравнивает источник и назначение и передаёт изменения.
- `--delete` отсутствует: удалённый на Mac файл автоматически не удаляется с Kraken.
- В текущем штатном профиле нет `--backup-dir` и не включён режим snapshot. Изменённый файл в назначении может быть перезаписан. **История версий и ротация не настроены.**
- Это не эквивалент истории Time Machine. Нельзя рассчитывать на восстановление любой прошлой версии файла.
- Постоянный `--dry-run` из рабочего профиля убран: Synchronize и расписание должны выполнять реальное копирование. Кнопка оценки сама запускает dry-run.
## Проверить или запустить вручную
1. Открыть RsyncUI и выбрать **`mbp-black-kraken`**. После перезапуска RsyncUI 3.0.5 начинает с `Default` и не сохраняет выбор профиля. В `Default` задачи не заведены, поэтому список пуст; рабочие три задачи находятся в `mbp-black-kraken`. Если папки пропали после перезагрузки, сначала переключить профиль. Открыть его без запуска копирования можно ссылкой `rsyncuiapp://loadprofile?profile=mbp-black-kraken`.
2. Выполнить Estimate и проверить источники, назначение и ошибки.
3. Для реальной передачи выполнить Synchronize.
4. После завершения проверить результаты каждой задачи и ошибки; сам факт запуска или наличие файлов на NAS не означает полный успех.
5. Для расписания открыть Schedule: ежедневное событие в **03:00**.
Старый профиль `mbp-black` на TrueNAS — прежний профиль оценки с постоянным dry-run; к текущему ночному расписанию Kraken он не относится.
Проверка SSH без копирования:
```bash
ssh -o BatchMode=yes -o ConnectTimeout=8 -o StrictHostKeyChecking=yes -o ProxyCommand=none kraken@kraken.local 'df -h /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black'
```
## Права и известные незавершённые проверки
- Для защищённых данных macOS нужен Full Disk Access у запускающего приложения. Разрешение RsyncUI не означает такое же разрешение у Codex/Terminal или другого фонового процесса.
- `Operation not permitted` при чтении контактов, календарей, Photos и подобных каталогов связано с ограничениями доступа macOS. Полное чтение этих каталогов рабочим профилем ещё не подтверждено.
- Full Disk Access не заменяет обычные Unix-права. Ранее системная задача получала `Permission denied` для `/private/etc/wireguard/wg0.conf` и `/private/etc/sudoers.d/eagle-dash-launchctl`. 23 октября каталоги `private/etc/wireguard/` и `private/etc/sudoers.d/` удалены из `system.files`; права ACL не изменялись. В списке остаётся `Library/LaunchDaemons/top.eagle.wg-auto.plist`: это включение файла в копирование, не запуск или изменение VPN.
- Код rsync **23** означает частичный результат; считать такой запуск полностью успешным нельзя.
- Первая передача домашней папки была остановлена при удалении внешней автоматизации и не подтверждена как полная.
- Передача, запущенная 22 октября, завершилась ошибкой **30**: отправитель сообщил об отсутствии I/O в течение 120 секунд (`io timeout`). В выводе также были `Operation not permitted` и `Interrupted system call`. Во время передачи наблюдались ожидание HDD (`balance_dirty_pages`) и высокий I/O wait; точная причина паузы, вызвавшей таймаут, не установлена. SMART overall-health — PASSED в выполненном замере; это не подтверждает полноту бэкапа.
- 23 октября из всех трёх задач удалён `--timeout=120`, добавлены штатные `--log-file` для каждой задачи. Это изменение не доказало устранение всех ошибок: последующие оценки Home завершились кодом 23, фактическая новая передача не подтверждена.
- Последний локальный журнал Home: `task-3.rsync.log`. В нём последняя операция помечена `DRY RUN` и завершена кодом 23. Остальные задачи используют `task-2.rsync.log` и `task-1.rsync.log`.
- Расписание 03:00 сохранено. Отметка срабатывания планировщика не означает успешную передачу; успешный полный ночной бэкап не подтверждён.
- Предыдущие оценки размера были неполными из-за закрытых каталогов. Фиксированный окончательный размер не установлен.
## Где хранится настройка
На этом Mac:
### `kraken-system` — 37 правил
```text
~/.rsyncosx/K230T0X3J1/rsyncuiconfig.json
~/.rsyncosx/K230T0X3J1/schedule.json
~/.rsyncosx/K230T0X3J1/mbp-black-kraken/configurations.json
~/.rsyncosx/K230T0X3J1/mbp-black-kraken/home.exclude
~/.rsyncosx/K230T0X3J1/mbp-black-kraken/common.exclude
~/.rsyncosx/K230T0X3J1/mbp-black-kraken/system.files
.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
```
`K230T0X3J1` — идентификатор конфигурации именно этого Mac; на другой машине путь может отличаться.
## Проверенный результат
Изменения фильтров вносятся в `home.exclude` / `common.exclude`; системные включения — в `system.files`. После изменения сначала выполнить Estimate. Приведённый выше список исключений — снимок настройки на дату этой инструкции; если файл меняется, обновить и заметку.
На 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`. Два других файла из домашнего снимка восстановлены и совпали с оригиналами побайтно.
Файлы доступны на Kraken в `home/`, `system/`, `postgresql/`. Можно использовать Restore в RsyncUI или скачать нужные файлы по SSH/SFTP.
Команда `restic check` проверила структуру репозитория и все четыре снимка без ошибок. Она сообщила о 192 дополнительных файлах пакетов после прерванных попыток; это не ошибка целостности. Автоматическая очистка не настроена.
Сначала восстанавливать в отдельную временную папку, проверить содержимое, затем переносить нужное на рабочее место. Для PostgreSQL использовать архивы из `postgresql/`, карту `databases.json` и инструменты `pg_restore`/`psql`; обычное копирование архива не восстанавливает базу. Учесть возраст дампа и отсутствие проверки полного восстановления.
В папке назначения `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/backups/mbp-black/` находится только `restic/`.
## Документация
## Проверка и восстановление
- [Штатное расписание RsyncUI и пропуски](https://rsyncui.netlify.app/docs/core-features/schedule/)
- [Ограничения RsyncUI: сон и запущенное приложение](https://rsyncui.netlify.app/docs/getting-started/limitations/)
- [PostgreSQL 17: согласованные SQL-дампы](https://www.postgresql.org/docs/17/backup-dump.html)
- [PostgreSQL 17: ограничения копирования файлов БД](https://www.postgresql.org/docs/17/backup-file.html)
Для обычной работы откройте <http://127.0.0.1:9898>, выберите нужный план и снимок. По завершении ночного задания проверьте его статус: **Success** или **Warning/Error**. Домашний план сейчас показывает **Warning** из-за 21 недоступного файла; этот статус не следует принимать за полностью успешный бэкап.
Для восстановления отдельных файлов выберите снимок в Backrest, найдите файл и восстановите его в отдельный каталог, затем сравните с оригиналом перед заменой. Для аварийного восстановления без Backrest можно установить restic, подключиться к указанному SFTP-репозиторию и использовать пароль репозитория. Без пароля содержимое снимков не прочитать.
Проверка через терминал на этом Mac (пароль берётся из связки ключей, в команду и заметку не записывается):
```sh
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.