1. Облачные серверы
  2. Блог
  3. Миграция с облачного Mac mini до конца аренды: резервное копирование и перенос среды

Миграция с облачного Mac mini до конца аренды: резервное копирование и перенос среды

Удалённый Mac ·~5 мин чтения

Миграция с облачного Mac mini до конца аренды: резервное копирование и перенос среды

周五下午的对话要改写成俄语正文,标题层级与锚点保持一致。

Почему миграция часто проваливается перед истечением аренды

В пятницу днём коллега, отвечающий за релизы, написал в чат: «Наш Mac mini с помесячной арендой заканчивается в следующую среду — что делать с сертификатами, данными симуляторов и кешем Homebrew?» Никто не смог сразу назвать полный список — это классический признак провальной миграции. Облачный Mac mini удобен в работе, но многие настройки живут в состоянии «пользуюсь и забываю, где это лежит», и только в момент завершения аренды выясняется, что нужное разбросано по десяткам каталогов.

Большинство понимает «миграцию» как «скопировать папку с проектом обратно на локальную машину», но на самом деле сборку чаще всего блокируют скрытые конфигурации: ключи развёртывания, выпущенные в ~/.ssh, сертификаты дистрибуции в Keychain, инкрементальный индекс сборки в ~/Library/Developer/Xcode/DerivedData, а также кеш-пути, которые различные инструменты незаметно пишут в домашнюю директорию пользователя. В повседневной работе это незаметно, но как только машина освобождается по истечении срока, вернуть это уже невозможно.

Миграция — это не «скопировать файлы», а «воссоздать машину, готовую к работе прямо сейчас». Критерий успеха не «все файлы скопированы», а «сборка на новой машине даёт тот же результат, что и на старой».

Инвентаризация активов перед миграцией: что обязательно нужно забрать

Сначала разделим то, что нужно перенести, на две категории — само разделение уже снижает риск что-то упустить.

Конфигурация среды разработки

Сюда входят конфигурация shell (.zshrc/.zprofile), SSH-ключи и known_hosts, глобальная конфигурация и учётные данные Git, сертификаты подписи и профили обеспечения Xcode, а также записи Keychain, экспортированные командой security. Эти файлы небольшие по объёму, но критически важны — рекомендуется собрать их в отдельный архив.

Проекты и кеш зависимостей

Сюда входят репозитории кода (теоретически всё должно быть на удалённом сервере, но локальные непроталкнутые ветки нужно проверить отдельно), локальный кеш CocoaPods и SwiftPM, список установленных пакетов Homebrew (экспорт Brewfile через brew bundle dump гораздо выгоднее, чем копирование целиком /opt/homebrew), а также файлы блокировки версий вроде Podfile.lock и .xcode-version.

Трёхуровневая стратегия резервного копирования: инкрементальный rsync + tar-архив + скачивание снапшота

Не стоит полагаться на один-единственный метод — устойчивость даёт только комбинация трёх уровней.

Уровень Инструмент Сценарий применения Недостатки
Первый уровень Инкрементальная синхронизация rsync Постоянное ежедневное резервное копирование проектных и конфигурационных файлов Требует доступа на запись к целевому хранилищу, не подходит для очень больших бинарников
Второй уровень Архивация tar Разовая упаковка чувствительных данных небольшого объёма — Keychain, сертификатов и т.п. Неудобно для инкрементального обновления
Третий уровень Скачивание снапшота платформы Последняя резервная опция, если первые два уровня не сработали Большой объём, зависит от исходящей пропускной способности, занимает много времени

Инкрементальная синхронизация с rsync

Запускается с локальной машины и синхронизирует ключевые каталоги с Mac mini на локальный диск или точку монтирования объектного хранилища:

rsync -avz --delete \
  --exclude 'DerivedData' \
  --exclude 'node_modules' \
  dev@hk1.oncemini.com:~/projects/ \
  ~/backup/mac-mini-hk1/projects/

Исключение каталогов вроде DerivedData и node_modules, которые можно пересобрать заново, сокращает время синхронизации с десятков минут до нескольких минут. Рекомендуется запускать синхронизацию ежедневно начиная за неделю до окончания аренды, а не выполнять её впервые в последний день — время первой полной синхронизации почти всегда недооценивают.

Упаковка неизменяемого архива

Для сертификатов, ключей и прочих данных, которые редко меняются, но потерять их категорически нельзя, соберите отдельный зашифрованный архив:

tar czf keychain-backup.tar.gz \
  ~/Library/Keychains \
  ~/.ssh
gpg -c keychain-backup.tar.gz

Зашифрованный архив далее передаётся через rsync или скачивается напрямую — это позволяет избежать попадания секретов в открытом виде на промежуточные узлы передачи.

Скачивание снапшота платформы как последний резерв

Если первые два уровня не успели завершиться из-за проблем с сетью, скачивание полного снапшота машины из консоли управления может служить последней страховкой — но объём нужно оценить заранее. Системный диск на 512 ГБ при домашней пропускной способности может скачиваться несколько часов, поэтому обязательно оставляйте запас времени и не начинайте загрузку в последние часы перед истечением аренды.

Частые ошибки и контрольный список

  • Забыли экспортировать Brewfile через brew bundle dump — на новой машине приходится устанавливать софт по памяти, версии не совпадают.
  • Скопировали только код проекта, но не локальные переменные окружения из .env — сборка на новой машине падает из-за отсутствующей конфигурации.
  • Запустили rsync с правами обычного пользователя и упустили доступ к системным сертификатам, из-за чего архив получился неполным без каких-либо сообщений об ошибке.
  • Начали скачивание снапшота за несколько часов до истечения срока и не успели из-за колебаний пропускной способности.
  • Не отозвали ключи и токены на старой машине после миграции — после окончания аренды эти учётные данные теоретически остаются действительными, что создаёт риск безопасности; их нужно активно отзывать во время последнего входа на машину.

Проверка холодного старта на новой машине после миграции

Перенос данных — это не конец процесса, нужно провести полную проверку в новой среде, чтобы завершить миграцию:

brew bundle install --file=Brewfile
pod install --repo-update
xcodebuild -workspace App.xcworkspace \
  -scheme App -configuration Release \
  clean build
shasum -a 256 build/App.app/App

Сравните вывод shasum для старой и новой сборки — только совпадение подтверждает, что миграция действительно завершена. Этот шаг часто пропускают, но именно он — единственное объективное доказательство того, что среда не потеряла ничего, и он гораздо надёжнее, чем субъективное «кажется, всё работает».

Часто задаваемые вопросы

Сколько хранятся данные после окончания аренды?

Стандартный срок хранения — 72 часа. Завершите бэкап минимум за 48 часов до окончания срока, не оставляя всё на последний момент, так как сбои сети могут съесть этот запас.

Что выбрать: rsync или скачивание снапшота с платформы?

Сначала используйте rsync для инкрементного бэкапа на локальный диск или объектное хранилище — это быстро и можно продолжить при обрыве. Скачивание снапшота большое по объёму и ограничено исходящей полосой, поэтому это только запасной вариант.

Как проверить, что новая машина полностью готова?

Соберите среду на новой машине по тому же Brewfile, Podfile.lock и .xcode-version, запустите полную сборку и сравните хеши артефактов — совпадение хешей подтверждает успешную миграцию.

Нужен выделенный Mac mini для сборки ваших проектов?

Арендовать Mac mini в портале