С чего началось
Вся моя работа живёт на одном MacBook: код проектов, скрипты деплоя, ключи к серверам, а ещё сессии, скиллы и настройки Claude Code, которые я долго доводил под себя. В какой-то момент я понял, что если ноутбук сломается или пропадёт доступ к аккаунту, восстановить всё это по памяти не получится. Хотелось, чтобы копия сама сохранялась раз в сутки за пределами компьютера, а на новом Mac можно было скачать архив, развернуть его и продолжить с того же места, с теми же сессиями и настройками. Time Machine настроен не был, внешнего диска под рукой не было, зато был Яндекс Диск.
Коротко
Яндекс Диск подключается к Mac через rclone по официальному API, а копии делает restic: шифрует данные паролем, сжимает и при следующих запусках докачивает только изменения. Скрипт запускается каждую ночь через launchd, хранит 7 ежедневных, 4 еженедельных и 6 ежемесячных версий и по воскресеньям проверяет целостность архива. Обе программы бесплатные, с открытым кодом, приложение Яндекс Диска для этого не нужно.
Когда пригодится
- Нужна копия рабочего Mac на случай кражи, поломки или переезда на новый компьютер.
- Time Machine не настроен, внешнего диска нет, а место на Яндекс Диске есть.
- В копию попадают SSH-ключи, ключи API и переписка, поэтому на Диске файлы должны лежать в зашифрованном виде.
Что нужно заранее: Homebrew и аккаунт Яндекса со свободным местом на Диске. У меня первая копия заняла 14,6 ГБ на Диске при 19,1 ГБ исходных данных и шла 27 минут.
Шаг 1. Установить restic и rclone
brew install restic rclonerestic отвечает за архив: шифрование, дедупликацию, версии. rclone умеет писать в Яндекс Диск, restic использует его как «транспорт».
Шаг 2. Подключить Яндекс Диск к rclone
rclone config create yadisk yandex config_is_local=trueОткроется браузер: войти в нужный аккаунт Яндекса и нажать «Разрешить». После этого Диск доступен под именем yadisk:. Проверить, сколько свободно:
rclone about yadisk:Шаг 3. Пароль архива положить в Связку ключей
Пароль шифрует весь архив. Без него восстановить копию невозможно, поэтому его нужно сохранить ещё и в менеджере паролей. Чтобы скрипт мог работать ночью без вопросов, пароль лежит в Связке ключей macOS:
security add-generic-password -a "$USER" -s restic-backup -wКоманда спросит пароль и сохранит его. Дальше restic читает его сам через переменную RESTIC_PASSWORD_COMMAND.
Шаг 4. Создать архив на Диске
export RESTIC_REPOSITORY="rclone:yadisk:backup/restic"
export RESTIC_PASSWORD_COMMAND="security find-generic-password -a $USER -s restic-backup -w"
restic initНа Диске появится папка backup/restic, это и есть зашифрованное хранилище.
Шаг 5. Решить, что копировать и что нет
Я копирую то, что нельзя скачать заново:
- рабочие проекты и архив старых проектов;
- свои скрипты, конфиги в
~/.config,.zshrc,.gitconfig; - SSH-ключи;
- настройки и историю инструментов, с которыми работаю каждый день.
Исключаю то, что занимает много места и восстанавливается само: node_modules, .venv, кэши, модели нейросетей, а также видео и аудио. Список исключений лежит в отдельном файле excludes.txt, по одному шаблону в строке:
node_modules
.venv*
__pycache__
*.mp4
*.mov
*.wav
*.mp3
*.safetensors
*.ggufШаблон без слэша срабатывает на имя файла или папки в любом месте.
Шаг 6. Скрипт копирования
Основа скрипта backup.sh:
#!/bin/bash
set -uo pipefail
export PATH="/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"
export RESTIC_REPOSITORY="rclone:yadisk:backup/restic"
export RESTIC_PASSWORD_COMMAND="security find-generic-password -a $USER -s restic-backup -w"
DIR="$(cd "$(dirname "$0")" && pwd)"
LOG="$HOME/Library/Logs/backup.log"
notify() { osascript -e "display notification \"$1\" with title \"Бэкап\""; }
# два копирования одновременно не запускаем
mkdir /tmp/backup.lock 2>/dev/null || exit 0
trap 'rmdir /tmp/backup.lock' EXIT
restic backup "$HOME/Documents/projects" "$HOME/scripts" "$HOME/.config" "$HOME/.ssh" \
--iexclude-file "$DIR/excludes.txt" --exclude-caches --one-file-system \
>>"$LOG" 2>&1 || { notify "Ошибка копирования, см. лог"; exit 1; }
# храним 7 ежедневных, 4 еженедельных и 6 ежемесячных версий
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune >>"$LOG" 2>&1
# по воскресеньям проверяем целостность архива
[ "$(date +%u)" = "7" ] && { restic check >>"$LOG" 2>&1 || notify "Проверка архива нашла проблемы"; }Что здесь важно:
PATHпрописан явно: у launchd своё окружение, и без этой строки он не находитresticиз Homebrew.- Блокировка через
mkdirне даёт ночному запуску наложиться на ручной. - Об ошибках приходит уведомление macOS, а подробности пишутся в лог.
Первую копию лучше запустить вручную и дождаться конца: bash backup.sh.

Шаг 7. Запуск каждую ночь через launchd
Файл ~/Library/LaunchAgents/ru.example.backup.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>ru.example.backup</string>
<key>ProgramArguments</key>
<array><string>/bin/bash</string><string>/Users/ИМЯ/scripts/backup/backup.sh</string></array>
<key>StartCalendarInterval</key>
<dict><key>Hour</key><integer>3</integer><key>Minute</key><integer>0</integer></dict>
<key>LowPriorityIO</key><true/>
<key>Nice</key><integer>10</integer>
</dict>
</plist>Включить:
launchctl load -w ~/Library/LaunchAgents/ru.example.backup.plistLowPriorityIO и Nice нужны, чтобы копирование не тормозило работу. Если в 03:00 Mac спал, launchd запустит пропущенное задание после пробуждения. Если был выключен, копия пропустится до следующей ночи.
Проверить, что копия восстанавливается
Бэкап, из которого ни разу не восстанавливали, не считается. После первой копии я достал из архива несколько файлов в отдельную папку и сравнил с оригиналами:
restic snapshots
restic restore latest --target ~/restore-test --include "$HOME/scripts"restic snapshots показывает список копий по датам, restore с --include достаёт только нужную папку.

Почему на Диске непонятные папки вместо файлов
На Яндекс Диске нет привычной структуры папок, а лежат data/, index/, snapshots/, keys/ и сотни файлов с хэшами вместо имён.

Так и задумано:
- Шифрование. Яндекс и любой, кто получит доступ к Диску, видят случайные байты, даже имён файлов не видно.
- Дедупликация. Файлы порезаны на куски, одинаковые куски хранятся один раз. Поэтому ежедневные копии почти не занимают места.
- Версии. Каждая копия ссылается на нужные куски, и можно достать файл в том виде, каким он был неделю назад.
Открыть файлы можно только через restic с паролем.
Восстановление на новом Mac
Рядом с архивом на Диске стоит положить открытым текстом короткую инструкцию, чтобы при переезде не вспоминать команды:
- Установить Homebrew, затем
brew install restic rclone. - Подключить Диск:
rclone config create yadisk yandex config_is_local=true. - Указать архив:
export RESTIC_REPOSITORY="rclone:yadisk:backup/restic"и проверитьrestic snapshots. Пароль спросит сам. - Вернуть всё на свои места:
restic restore latest --target /. - Поправить права на ключи:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_*. - Снова положить пароль в Связку ключей и включить задание launchd.
Пользователя на новом Mac лучше создать с тем же именем, что на старом: многие программы хранят абсолютные пути вида /Users/ИМЯ/....
Частые вопросы
Нужно ли приложение Яндекс Диска?
Нет. rclone работает с Диском напрямую через официальный API, вход один раз через окно авторизации Яндекса.
Сколько это стоит?
restic и rclone бесплатные, с открытым кодом и без ограничений. Платить нужно только за место на Яндекс Диске, если бесплатного не хватит. Благодаря дедупликации ежедневные копии занимают немного: растёт в основном то, что реально изменилось.
Может ли Яндекс прочитать мои файлы?
Нет. restic шифрует данные на компьютере до отправки, на Диск уходят только зашифрованные куски. Ключ закрыт вашим паролем.
Что будет, если забыть пароль от архива?
Восстановить копию будет невозможно, сбросить пароль нельзя. Поэтому пароль хранится в двух местах: в Связке ключей для ночных запусков и в менеджере паролей на случай потери компьютера.
Как восстановить один файл, а не всё?
Командой restic restore latest --target ~/restore-test --include "путь/к/файлу". Посмотреть содержимое копии без восстановления можно через restic ls latest.
Чем это лучше обычной синхронизации папки с Диском?
Синхронизация повторяет на Диске всё, что происходит на компьютере, включая удаление и порчу файлов. Бэкап хранит версии: если файл удалили или испортили, его можно достать из копии недельной или месячной давности.
