[2026-10-23] eagle: personal/instructions/Выборочный бэкап Mac на Kraken.md
This commit is contained in:
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.
|
||||
Reference in new issue
Block a user