Возня с файлами (2)
Это продолжение прошлого поста на тему синхронизации файлов. Небольшое дополнение и руководство как все настроить.
Одно время я бекапил файлы в S3 при помощи aws cli — утилиты на питоне. Она работает просто: указываешь источник и приемник, и файлы переливаются из первого во второе. Источником и приемником могут быть локальная папка или бакет S3. В случае с S3 клиент посылает HEAD-запросы, чтобы сберечь трафик.
Схема хороша тем, что протокол S3 поддерживает масса сторонних сервисов, например Яндекс.Облако, Digital Ocean, Exoscale (где автор имел честь работать) и другие. Если что-то пойдет не так, переезд сводится к изменению урла в настройках.
Для айфона нашлось приложение S3 Manager, написанное на коленке одним добрым человеком. Показывает файлы из облака, умеет сохранять локально. Спартанское, немного топорное, но в этом и прелесть. Работает с Яндексом, проверял лично.
Недостаток aws cli в том, что это односторонняя синхронизация. Сюда же относятся утилиты вроде rsync и аналоги. Их объединяет то, что одна из сторон считается верной, а другая подстраивается под первую. Например, если синхронизировать папки A и B, то файлы из А окажутся в В. Однако если в B были новые файлы, то в лучшем случае они игнорируются, а в худшем удаляются. Двойной синк по принципу сначала из А в В, а потом наоборот, эту проблему не решает.
Забегая вперед, скажу, что в итоге поставил Syncthing, который пробовал еще год назад. Однако в процессе экспериментов узнал о замечательной программе Unison, и теперь коротко ее опишу.
Это консольная утилита, написанная на OCaml. Работает на каждом утюге, включая Солярис. Синхронизирует два пути с учетом слияния файлов. Для этого программа ведет свой реестр и по нему сверяеся, что делать с файлами.
Путь может быть удаленным (на другом машине). В этом случае операции с файлами протекают по SSH. У программы два режима: интерактивный (ручной) и автоматический. В первом случае, если встретится конфликт, программа запрашивает действие. Понравился богатый выбор, в том числе разрешение конфликтов при помощи сторонних утилит (kdiff
, meld
), что очень удобно.
В автоматическом режиме (для скриптов и crontab) интерактивного ввода нет, все разруливается флагами.
Unison оставил прятное впечатление. Видно, что программе много лет: огромное число функций, подробная докуметация. Но смутило, что Unison не работает в режиме демона и нуждается в регулярном запуске по крону. Плюс не очень подходит к Винде из-за SSH — как там его настроить даже не представляю.
Закончил эсперименты тем, что поставил на удаленной машине Syncthing и работаю через него. Полагаю, о Syncthing знают все, поэтому нет смысла расписывать его возможности. Ниже — инструкция о том, как сделать все максимально быстро.
Итак, понадобится VPS с большим диском. Путем гугления я вышел на AlphaVPS, где за три евро в месяц можно взять машину с диском на 256 гигабайт (а за три с половиной — на 512). Диски, ясное дело, не SSD, но в моем случае это не важно.
Заказываем машину с Ubuntu 22, заходим под рутом. Создаем пользователя:
useradd -s /bin/bash -d /home/ivan/ -m -G sudo ivan
passwd ivan
Перекидываем SSH-ключ:
ssh-copy-id -i ~/.ssh/ivan.pub ivan@123.123.123.123
В ~/.ssh/config
прописываем алиас
Host alpha
HostName 123.123.123.123
IdentityFile ~/.ssh/ivan
User ivan
Далее заходим по ssh alpha
и вводим команды:
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
sudo apt update
sudo apt install syncthing
Чтобы Syncthing запускался в автозагрузке, добавим его в systemctl:
sudo systemctl enable syncthing@ivan.service
Остается включить:
sudo systemctl start syncthing@ivan.service
Syncthing настраивается через веб-интерфейс, однако он доступен только с локального хоста. Поднимаем SSH-тоннель:
ssh -N -L 18384:localhost:8384 alpha
Теперь откройте браузер на странице localhost:18384 — появится интерфейс Syncthing на удаленной машине. Ну а дальше вы сами знаете: создаете папки, связываете машины друг с другом и так далее.
На текущий момент у меня VPS за три евро и три компа: два мака и винда. Вроде бы работает, файлы подхватываются. К сожалению, Syncthing не так гибок в плане текстовых файлов, как Unison: умеет только брать файл А или В, а про слияние сторонней тулзой ничего не знает. Однако для текстовых файлов есть git.
В общем, ничего нового в плане синхронизации файлов я не открыл. Это скорее инструкция для тех, кто не хочет париться с терминалом, гуглением команд и прочей болью.
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter
sarman, 7th Jan 2023, link
Рекомендую посмотреть на Lsyncd
juev, 7th Jan 2023, link
Syncthing хорош до тех пор, пока не настроена двусторонняя синхронизация. Удаляет файлы на всех машинах в одно мгновение и если не включено версионирование, восстановить их будет невозможно. Меня в свое время спасло то, что на iPhone синхронизация проводиться периодически, успел отключить от сети и скопировать файлы в отдельную директорию. Очень аккуратным нужно быть с Syncthing в работе.
Ivan Grishaev, 7th Jan 2023, link
Может, пережитки старых версий? Если бы это было массово, наверное бы уже починили. На всякий случай обновился на всех машинах.
Александр Мосьпан, 9th Jan 2023, link
Насколько я понимаю, речь именно про штатный режим работы. Если два хранилища файлов синхронизированы, удаление файла на одной машине удаляет его на всех остальных, что может привести к проблемам, если важный файл удалён по неосторожности.
Я через syncthing только фильмы и видео, скачанное с ютуба, между устройствами синхронизирую, поэтому мне удобно — удалил просмотренное и оно повсюду исчезло.
Алексей, 13th Jan 2023, link
А ты включаешь в synching end-to-end шифрование для этих vps?