From 39dcab0fe1964d64d7e160ab9cab39f9f06ac45d Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Thu, 22 Oct 2026 01:51:24 +0600 Subject: [PATCH] =?UTF-8?q?[2026-10-22]=20eagle:=20personal/instructions/?= =?UTF-8?q?=D0=92=D1=8B=D0=B1=D0=BE=D1=80=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF=20Mac=20=D0=BD=D0=B0=20Kraken.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Выборочный бэкап Mac на Kraken.md | 293 ++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 personal/instructions/Выборочный бэкап Mac на Kraken.md diff --git a/personal/instructions/Выборочный бэкап Mac на Kraken.md b/personal/instructions/Выборочный бэкап Mac на Kraken.md new file mode 100644 index 00000000..34ff4b9c --- /dev/null +++ b/personal/instructions/Выборочный бэкап Mac на Kraken.md @@ -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)