[2026-10-22] eagle: personal/instructions/Выборочный бэкап Mac на Kraken.md
This commit is contained in:
1 parent
014ebcef32
commit
39dcab0fe1
1 file changed
+293
@@ -0,0 +1,293 @@
|
||||
---
|
||||
title: Выборочный бэкап Mac на Kraken
|
||||
updated: '2026-10-22'
|
||||
tags:
|
||||
- backup
|
||||
- rsync
|
||||
- macos
|
||||
- kraken
|
||||
- instructions
|
||||
---
|
||||
# Выборочный бэкап Mac на Kraken
|
||||
|
||||
Актуально на 22 октября 2026 года. Источник истины — сохранённая конфигурация RsyncUI на `mbp-black`.
|
||||
|
||||
## Как устроено
|
||||
|
||||
Бэкап выполняет `rsync` по SSH на Kraken. RsyncUI 3.0.5 хранит задачи, показывает оценку и результаты, запускает копирование по своему штатному расписанию.
|
||||
|
||||
- Приложение: `/Applications/RsyncUI.app`.
|
||||
- Бинарник: `/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 минут сейчас не настроены.
|
||||
|
||||
## Что копируется
|
||||
|
||||
| Задача | Источник | Подкаталог на Kraken |
|
||||
|---|---|---|
|
||||
| 01 Home | `/Users/admin/` с исключениями ниже | `home/` |
|
||||
| 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` разрешает только этот список, пути указаны относительно `/`:
|
||||
|
||||
```text
|
||||
opt/homebrew/etc/
|
||||
Library/WebServer/Documents/
|
||||
usr/local/bin/
|
||||
private/etc/wireguard/
|
||||
private/etc/sudoers.d/
|
||||
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/
|
||||
```
|
||||
|
||||
Установленные приложения и весь Homebrew Cellar отдельно не копируются. Для восстановления состава ПО сохранён аудит: Brewfile, списки формул/casks/сервисов Homebrew, приложений и отдельных пакетных менеджеров. Эти файлы находятся в домашнем источнике:
|
||||
|
||||
`~/Documents/Codex/2026-10-21-rsync-scp-ui-open-source-mlx/backup-audit/software-inventory/`
|
||||
|
||||
Это сохранённый инвентарный список, а не автоматически обновляемый каждую ночь экспорт.
|
||||
|
||||
### PostgreSQL: существенное ограничение
|
||||
|
||||
**Штатная задача RsyncUI копирует только уже существующие дампы. Она не создаёт свежий дамп PostgreSQL перед ночным запуском.**
|
||||
|
||||
Текущий набор создан 22 октября 2026 года: custom-format `pg_dump` для всех подключаемых нетиповых баз и `pg_dumpall --globals-only` для ролей и глобальных объектов. Имена баз и соответствующие архивы перечислены в `databases.json`, глобальные объекты — в `globals.sql`.
|
||||
|
||||
Архивы проверялись командой `pg_restore --list`; полноценное тестовое восстановление не выполнялось. Этот набор успешно передан на Kraken при первоначальном копировании. После удаления внешней автоматизации его обновление не автоматизировано. Поэтому **актуальный ежедневный бэкап работающих баз пока не обеспечен**. Копировать живой `/opt/homebrew/var/postgresql@17/` обычным rsync вместо согласованного дампа нельзя считать корректным бэкапом.
|
||||
|
||||
В домашней задаче каталог с дампами исключён, чтобы не дублировать его во второй задаче. Файлы `*.pgdump` исключены по согласованному правилу; текущие архивы имеют расширение `.dump` и копируются отдельной задачей.
|
||||
|
||||
## Что исключено
|
||||
|
||||
Основные группы: 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.
|
||||
|
||||
**`~/docker` целиком не исключён.** Сохранены конфиги и текущие bind-mounted данные приложений. Исключение Colima убирает Docker images и обычные named volumes внутри её VM, включая находящиеся там данные.
|
||||
|
||||
Полный действующий `home.exclude` приведён ниже. Начальный `/` привязывает правило к `/Users/admin/`, а не к корню системного диска. Непривязанные имена каталогов применяются на любой глубине. Wildcards позволяют учитывать новые сборки и копии проектов, а не только конкретные worktree.
|
||||
|
||||
```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/
|
||||
|
||||
# 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/
|
||||
*.pyc
|
||||
*.pyo
|
||||
.DS_Store
|
||||
._*
|
||||
# User explicitly excluded installers and dependency lock files.
|
||||
*.dmg
|
||||
*.xip
|
||||
*.lock
|
||||
*.lockb
|
||||
Package.resolved
|
||||
package-lock.json
|
||||
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/
|
||||
```
|
||||
|
||||
Системная задача использует отдельный `common.exclude` с общими правилами для артефактов/расширений; привязанные к домашней папке исключения к системному источнику не применяются.
|
||||
|
||||
## Что происходит при изменении и удалении файлов
|
||||
|
||||
Это инкрементальное копирование: rsync сравнивает источник и назначение и передаёт изменения.
|
||||
|
||||
- `--delete` отсутствует: удалённый на Mac файл автоматически не удаляется с Kraken.
|
||||
- В текущем штатном профиле нет `--backup-dir` и не включён режим snapshot. Изменённый файл в назначении может быть перезаписан. **История версий и ротация не настроены.**
|
||||
- Это не эквивалент истории Time Machine. Нельзя рассчитывать на восстановление любой прошлой версии файла.
|
||||
- Постоянный `--dry-run` из рабочего профиля убран: Synchronize и расписание должны выполнять реальное копирование. Кнопка оценки сама запускает dry-run.
|
||||
|
||||
## Проверить или запустить вручную
|
||||
|
||||
1. Открыть RsyncUI и выбрать **`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`. Эти два файла не были скопированы.
|
||||
- Код rsync **23** означает частичный результат; считать такой запуск полностью успешным нельзя.
|
||||
- Первая передача домашней папки была остановлена при удалении внешней автоматизации и не подтверждена как полная.
|
||||
- **Ночной запуск штатного расписания ещё не проверен.** Конфигурация сохранена, RsyncUI перезапущен; успешный полный ночной бэкап пока не подтверждён.
|
||||
- Предыдущие оценки размера были неполными из-за закрытых каталогов. Фиксированный окончательный размер не установлен.
|
||||
|
||||
## Где хранится настройка
|
||||
|
||||
На этом Mac:
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
`K230T0X3J1` — идентификатор конфигурации именно этого Mac; на другой машине путь может отличаться.
|
||||
|
||||
Изменения фильтров вносятся в `home.exclude` / `common.exclude`; системные включения — в `system.files`. После изменения сначала выполнить Estimate. Приведённый выше список исключений — снимок настройки на дату этой инструкции; если файл меняется, обновить и заметку.
|
||||
|
||||
## Восстановление
|
||||
|
||||
Файлы доступны на Kraken в `home/`, `system/`, `postgresql/`. Можно использовать Restore в RsyncUI или скачать нужные файлы по SSH/SFTP.
|
||||
|
||||
Сначала восстанавливать в отдельную временную папку, проверить содержимое, затем переносить нужное на рабочее место. Для PostgreSQL использовать архивы из `postgresql/`, карту `databases.json` и инструменты `pg_restore`/`psql`; обычное копирование архива не восстанавливает базу. Учесть возраст дампа и отсутствие проверки полного восстановления.
|
||||
|
||||
## Документация
|
||||
|
||||
- [Штатное расписание 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)
|
||||
Reference in new issue
Block a user