У меня есть рабочий макбук и я часто путешествую. Я боюсь потерять данные на нем, поэтому я делаю бекапы через родную Time Machine на удаленный сервер. Для этого я поднял в офисе сервер SMB, который всегда доступен через VPN.
Проблема: если включить автоматический бекап в Time Machine, система будет постоянно бекапится даже через тонкий мобильный интернет в самолете, мешая работать, исчерпав весь канал.
Решение: я написал скрипт Time Machine Traveler, который проверяет скорость доступа к SMB шаре и запускает бекап только если качество соединения высокое.
Мой скрипт работает так
Проверяет доступность SMB сервера через VPN
Если сервер доступен, запускает тест скорости через
iperf3
Если скорость хорошая, запускает бекап
Настройка сервера
Чтобы развернуть такой же сетап, вам потребуется поднять Samba сервер и настроить к нему удаленный доступ через VPN. Вы можете сделать это любым удобным способом. Я расскажу про свой способ.
VPN
Мы на работе используем модный ZeroTier. Это не совсем VPN, так как в нем нет центрального сервера, а все соединения происходят напрямую, через P2P. Это позволяет получить максимальную скорость между клиентом и SMB сервером.
В обычной схеме с VPN сервером вы всегда ограничены качеством канала между вами и сервером. И даже если офис находится в соседнем здании, вы все равно будете пропускать трафик через VPN сервер, внося задержки. В ZeroTier я выжимаю 100 Mbit/s до офиса из дома с минимальными задержками. При этом мне доступны все хосты внутри VPN сети, и чем ближе я физически к целевому хосту, тем лучше скорсть. Такое невозможно получить с центральным VPN сервером.
Я обожаю ZeroTier за его простоту в настройке. Я пользуюсь и OpenVPN и IPSec Ikev2 и все это ужасно. Сейчас добавление нового клиента в VPN сеть у нас на работе выглядит так:
sudo zerotier-cli join <network id>
Дальше администратор апрувит добавление нового клиента в веб-морде и все. Там же в веб-интерфейсе можно легко отключить клиента. Кайф!
SMB сервер
Для бекапа в Time Machine вам потребуется развернуть SMB сервер на дисковом хранилище. Это может быть NAS или голая Samba. Я использую обычную Samba настроенную по этому мануалу, чтобы включить расширения протокола для macOS.
С недавнего времени Apple забросили поддержку своего протокола AFP (Apple Filing Protocol), поэтому все мануалы по настройке сервера для Time Machine, где используется AFP устаревшие, не используйте их. Теперь достаточно обычного SMB.
Speed Test
Чтобы измерять скорость до SMB хранилища, я развернул на том же сервере iperf3, который всегда слушает порт и ждет клиентов для замеров скорости сети.
apt install iperf3
И добавил его как сервис:
# systemctl cat iperf3.service
# /lib/systemd/system/iperf3.service
[Unit]
Description=iperf3 server
After=syslog.target network.target auditd.service
[Service]
ExecStart=/usr/bin/iperf3 -s
[Install]
WantedBy=multi-user.target
Настройка клиента
В нашем случае клиенты это макбуки путешественников. На них нужно настроить Time Machine на удаленный сервер как обычно. При настройке важно подключаться к SMB серверу по тому адресу, который будет доступен через VPN.
Подключение к SMB шаре
ВАЖНО: при подключении к SMB хранилищу нужно поставить галочку "Сохранить пароль в ключнице, иначе мой скрипт не сможет сам подмонтировать диск в фоне.
Активация Time Machine
Если у вас правильно настроена Samba, удаленный диск появится в списке доступных для бекапа в Time Machine. Активируйте его и выполните первый самый долгий бекап. Размер бекапа будет равен объему занятого места на диске. Когда первичный бекап выполнен, нужно убрать галочку "Автоматический Бекап".
ВАЖНО: если дисковое хранилище общее, выбирайте опцию "шифровать бекап" в time machine, иначе все ваши файлы будут лежать на сервере в открытом виде.
Установка скрипта Time Machine Traveler Helper
Мой скрипт это плагин для утилиты xbar. Эта утилита запускает шелл скрипты в фоне и красиво форматирует их вывод в системном трее.
Вот мой плагин Time_Machine_Traveler.py (Это Pull Request в библиотеку плагинов xbar)
Он еще сырой и я не буду советовать всем его устанавливать. Вам придется самому разобраться как добавить его в xbar. В данный момент я приглашаю только разработчиков протестировать и доработать плагин.
Настройки скрипта
У скрипта есть настройки, для работы вам нужно их заполнить
SMB_SHARE_ADDRESS — адрес SMB сервера, IP или домен, например
10.30.22.1
WORKGROUP_NAME — имя рабочей группы на SMB сервере. В моем случае стандартное
WORKGROUP
SMB_MOUNT_PATH — полный путь по которому будет доступно SMB хранилище в системе. В моем случае это
/Volumes/pavel
Его можно посмотреть, когда SMB хранилище смонтировано с помощью утилитыdf
SMB_USER — имя пользователя с которым подключаться к SMB
SMB_SHARE_PATH — имя SMB папки на сервере. Оно показано, когда вы подключаетесь к SMB серверу. В моем случае это просто
pavel
SPEED_TEST_SERVER — адрес сервера на котором установлен iperf3. В моем случае это тот же адрес, что и SMB хранилище
SPEED_TEST_DURATION — время, которое будет выполняться тест скорости. По умолчанию это 10 секунд, что для меня слишком долго, так как в этот момент канал нагружается полностью. Я поставил 3 секунды
SPEED_TEST_TIMEOUT — таймаут подключения к серверу iperf3 в миллисекундах. Это те же задержки, которые мы видим в ping. Если поставить значение меньше 100мс, это автоматически отрежет бекап через мобильный интернет.
MIN_SPEED — минимальная скорость до сервера в Mbit/s. Я ставлю 60 мегабит.
MAX_LOAD_AVERAGE — я ненавижу, когда бекап включается в момент, когда я кодирую видео на ноутубуке. Поэтому скрипт проверяет насколько нагружена система и если LA больше этого значения, то не запускает бекап. Я ставлю 5
Скриншоты
⚠️ Помогите в тестировании
Это полезный инструмент для удаленных сотрудников и тех кто путешествует. На текущий момент скрипт находится в alpha версии и я прошу вас принять участие в тестировании и доработке скрипта, потому что мне уже лень.
TODO
Скрипт не готов до конца, нужно еще:
Убрать зависимость от стороннего python3 из brew. В идеале хочется использовать стандартный системный питон
Убрать зависимость от osascript
Сократить настройки: брать настройки адреса SMB шары и всех путей из вывода
tmutil destinationinfo
Показывать прогресс бекапа через tmutil status. Вот референс
Брать дату последнего успешного бекапа из tmutil status и на основании этого сделать возможность настройки интервалов бекапов: если последний успешный бекап старше N дней, запускаем бекап.